diff --git a/ChangeLog b/ChangeLog index 1f29e4b8b..a67f4596e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2001-02-27 OKUJI Yoshinori + + * stage2/builtins.c (chainloader_func): Don't check if the + current partition is FAT, but check if it has a FAT partition + type and the BPB has a system id starting with "MSWIN". + 2001-02-27 OKUJI Yoshinori Added hercules support based on a patch by Frank Mehnert diff --git a/stage2/builtins.c b/stage2/builtins.c index a47fc0320..02e236faf 100644 --- a/stage2/builtins.c +++ b/stage2/builtins.c @@ -448,12 +448,10 @@ chainloader_func (char *arg, int flags) grub_close (); kernel_type = KERNEL_TYPE_CHAINLOADER; - /* XXX: Windows evil hack. I don't know why, but Windows seems not to - set the start address of an extended partition in the BPB correctly. - So this is necessary to make Windows bootable even with an extended - partition. Maybe this should be made only for Windows, but how can - we determine if it is Windows or not precisely?! */ - if (open_partition () && fat_mount ()) + /* XXX: Windows evil hack. For now, only the first five letters are + checked. */ + if (IS_PC_SLICE_TYPE_FAT (current_slice) + && ! grub_memcmp (BOOTSEC_LOCATION + BOOTSEC_BPB_SYSTEM_ID, "MSWIN", 5)) *((unsigned long *) (BOOTSEC_LOCATION + BOOTSEC_BPB_HIDDEN_SECTORS)) = part_start; diff --git a/stage2/shared.h b/stage2/shared.h index eac287a03..d6285b17a 100644 --- a/stage2/shared.h +++ b/stage2/shared.h @@ -175,6 +175,7 @@ extern char *grub_scratch_mem; #define BOOTSEC_SIGNATURE 0xAA55 #define BOOTSEC_BPB_OFFSET 0x3 #define BOOTSEC_BPB_LENGTH 0x3B +#define BOOTSEC_BPB_SYSTEM_ID 0x3 #define BOOTSEC_BPB_HIDDEN_SECTORS 0x1C #define BOOTSEC_PART_OFFSET 0x1BE #define BOOTSEC_PART_LENGTH 0x40