Index: ChangeLog =================================================================== RCS file: /cvsroot/grub/grub/ChangeLog,v retrieving revision 1.429 diff -u -r1.429 ChangeLog --- ChangeLog 2001/08/08 08:00:01 1.429 +++ ChangeLog 2001/08/31 00:15:04 @@ -1,3 +1,8 @@ +2001-08-31 Jason Thomas + + * stage2/disk_io.c (set_partition_hidden_flag): complete rewrite + of this function which now supports logical partitions. + 2001-08-08 OKUJI Yoshinori From Derrik Pates : Index: stage2/disk_io.c =================================================================== RCS file: /cvsroot/grub/grub/stage2/disk_io.c,v retrieving revision 1.44 diff -u -r1.44 disk_io.c --- stage2/disk_io.c 2001/06/22 02:32:56 1.44 +++ stage2/disk_io.c 2001/08/31 00:15:07 @@ -455,31 +455,49 @@ int set_partition_hidden_flag (int hidden) { - char mbr[512]; - - if (current_drive & 0x80) - { - int part = current_partition >> 16; + unsigned long part = 0xFFFFFF; + unsigned long start, len, offset, ext_offset; + int entry, type; + char mbr[512]; - if (part > 3) + /* The drive must be a hard disk. */ + if (! (current_drive & 0x80)) { - errnum = ERR_NO_PART; - return 0; - } - - if (! rawread (current_drive, 0, 0, SECTOR_SIZE, mbr)) - return 0; - - if (hidden) - PC_SLICE_TYPE (mbr, part) |= PC_SLICE_TYPE_HIDDEN_FLAG; - else - PC_SLICE_TYPE (mbr, part) &= ~PC_SLICE_TYPE_HIDDEN_FLAG; - - if (! rawwrite (current_drive, 0, mbr)) - return 0; - } + errnum = ERR_BAD_ARGUMENT; + return 1; + } - return 1; + /* The partition must be a PC slice. */ + if ((current_partition >> 16) == 0xFF + || (current_partition & 0xFFFF) != 0xFFFF) + { + errnum = ERR_BAD_ARGUMENT; + return 1; + } + + /* Look for the partition. */ + while (next_partition (current_drive, 0xFFFFFF, &part, &type, &start, &len, &offset, &entry, + &ext_offset, mbr)) + { if (part == current_partition) + { + /* Found. */ + + if (hidden) + PC_SLICE_TYPE (mbr, entry) |= PC_SLICE_TYPE_HIDDEN_FLAG; + else + PC_SLICE_TYPE (mbr, entry) &= ~PC_SLICE_TYPE_HIDDEN_FLAG; + + /* Write back the MBR to the disk. */ + buf_track = -1; + if (! rawwrite (current_drive, offset, mbr)) + return 1; + + /* Succeed. */ + return 0; + } + } + + return 1; }