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:
ae 2011-06-27 10:42:06 +00:00
parent bfdf57abb6
commit c7b111bbcf
2 changed files with 9 additions and 6 deletions

View File

@ -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);
}

View File

@ -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