MS Windows NT+ uses 4 bytes at offset 0x1b8 in the MBR to identify
disk drive. The boot0cfg(8) utility preserves these 4 bytes when is writing bootcode to keep a multiboot ability. Change gpart's bootcode method to keep DSN if it is not zero. Also do not allow writing bootcode with size not equal to MBRSIZE. PR: kern/157819 Tested by: Eir Nym MFC after: 1 month
This commit is contained in:
parent
bfdf57abb6
commit
c7b111bbcf
@ -237,14 +237,16 @@ static int
|
||||
g_part_mbr_bootcode(struct g_part_table *basetable, struct g_part_parms *gpp)
|
||||
{
|
||||
struct g_part_mbr_table *table;
|
||||
size_t codesz;
|
||||
uint32_t dsn;
|
||||
|
||||
if (gpp->gpp_codesize != MBRSIZE)
|
||||
return (ENODEV);
|
||||
|
||||
codesz = DOSPARTOFF;
|
||||
table = (struct g_part_mbr_table *)basetable;
|
||||
bzero(table->mbr, codesz);
|
||||
codesz = MIN(codesz, gpp->gpp_codesize);
|
||||
if (codesz > 0)
|
||||
bcopy(gpp->gpp_codeptr, table->mbr, codesz);
|
||||
dsn = *(uint32_t *)(table->mbr + DOSDSNOFF);
|
||||
bcopy(gpp->gpp_codeptr, table->mbr, DOSPARTOFF);
|
||||
if (dsn != 0)
|
||||
*(uint32_t *)(table->mbr + DOSDSNOFF) = dsn;
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
@ -36,6 +36,7 @@
|
||||
#include <sys/ioccom.h>
|
||||
|
||||
#define DOSBBSECTOR 0 /* DOS boot block relative sector number */
|
||||
#define DOSDSNOFF 440 /* WinNT/2K/XP Drive Serial Number offset */
|
||||
#define DOSPARTOFF 446
|
||||
#define DOSPARTSIZE 16
|
||||
#define NDOSPART 4
|
||||
|
Loading…
x
Reference in New Issue
Block a user