|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Eugene Grosbein 2:5006/1 09 Jun 2006 01:19:58 To : All Subject : BootEasy и WinXP -------------------------------------------------------------------------------- Привет! Проблема несовместимости BootEasy и WinXP, описанная в следующем URL, актуальна и для шестерки. http://groups.google.ru/group/fido7.ru.unix.bsd/browse_thread/thread/dbb7ee5ebc1 59f73/8dab84b83e46ab84?hl=ru&fwc=2 Краткое содержание предыдущих серий: если WinXP устанавливается на диск с BootEasy, она его затирает. Кроме своего кода, она записывает в MBR свой 32-битный NT Drive Serial Number. Попытка восстановить BootEasy любыми штатными средствами FreeBSD (sysinstall, boot0cfg, fdisk) необратимо затирает этот NT Drive Serial Number, что в некоторых условиях приводит к невозможности загрузиться в WinXP - это случается, когда system drive у XP это не C: Патч ниже предназначен для FreeBSD 6.1, он правит boot0, содержащий BootEasy так, чтобы тот не использовал четыре байта, потенциально содержащие NT Drive Serial Number. Кроме того, патчатся boot0cfg и libdisk (используемый sysinstall для записи MBR), чтобы они не затирали этот Number при записи MBR. Исправление fdisk оставлено читателю в качестве упражнения ;-) Код в BootEasy в FreeBSD 6.1 больше по размеру, чем в 4.11, поэтому для высвобождения четырех байтов пришлось пожертвовать косметикой: раздел с FreeBSD патченный BootEasy показывает с меткой BSD, как и разделы с OpenBSD и NetBSD (штатный рисует метку FreeBSD). Патченный boot0cfg умеет обновлять старый BootEasy на новый, или можно воспользоваться новым sysinstall. Перед обновлением boot0 нужна команда sysctl kern.geom.debugflags=16. Для возврата старого BootEasy можно прописать его сначала новым boot0cfg, а потом обязательно еще раз старым boot0cfg, либо использовать старый sysinstall, тогда прописывать только один раз. Прикладывать: cd /usr/src patch </path/to/patch cd /usr/src/sys/boot/i386/boot0; make all install cd /usr/src/usr.sbin/boot0cfg; make clean obj; make depend; all install cd /usr/src/lib/libdisk; make clean obj; make depend; make all install cd /usr/src/usr.sbin/sysinstall; make clean obj; make depend; make all install Сам патч: - --- sys/boot/i386/boot0/boot0.S.orig Wed Feb 9 03:43:04 2005 +++ sys/boot/i386/boot0/boot0.S Fri Jun 9 00:50:32 2006 @@ -45,10 +45,10 @@ * Addresses in the sector of embedded data values. * Accessed with negative offsets from the end of the relocated sector (%ebp). */ - .set _NXTDRV,-0x48 # Next drive - .set _OPT,-0x47 # Default option - .set _SETDRV,-0x46 # Drive to force - .set _FLAGS,-0x45 # Flags + .set _NXTDRV,-0x49 # Next drive + .set _OPT,-0x53 # Default option + .set _SETDRV,-0x52 # Drive to force + .set _FLAGS,-0x51 # Flags .set _TICKS,-0x44 # Timeout ticks .set _FAKE,0x0 # Fake partition entry .set _MNUOPT,0xc # Menu options @@ -424,7 +424,7 @@ .byte os_dos-. # Windows .byte os_linux-. # Linux .byte os_bsd-. # BSD/OS - .byte os_freebsd-. # FreeBSD + .byte os_bsd-. # FreeBSD .byte os_bsd-. # OpenBSD .byte os_bsd-. # NetBSD .byte os_misc-. # Unknown @@ -435,9 +435,13 @@ os_misc: .ascii "?"; .byte '?'|0x80 os_dos: .ascii "DO"; .byte 'S'|0x80 os_linux: .ascii "Linu"; .byte 'x'|0x80 -os_freebsd: .ascii "Free" os_bsd: .ascii "BS"; .byte 'D'|0x80 + .byte 0x90 # free space +opt: .byte 0x0 # Option +setdrv: .byte 0x80 # Drive to force +flags: .byte FLAGS # Flags + .org PRT_OFF-0xe,0x90 .word B0MAGIC # Magic number @@ -447,11 +451,9 @@ * Be especially careful that nxtdrv: must come after drive:, as it * is part of the same string. */ -drive: .ascii "Drive " +drive: .ascii "Disk " nxtdrv: .byte 0x0 # Next drive number -opt: .byte 0x0 # Option -setdrv: .byte 0x80 # Drive to force -flags: .byte FLAGS # Flags + .byte 0xa8,0xa8,0xa8,0xa8 # NT Drive Serial Number ticks: .word TICKS # Delay /* - --- src/usr.sbin/boot0cfg/boot0cfg.c.orig Fri Jun 9 01:48:04 2006 +++ src/usr.sbin/boot0cfg/boot0cfg.c Fri Jun 9 01:48:44 2006 @@ -44,10 +44,11 @@ #define MBRSIZE 512 /* master boot record size */ +#define OFF_OPT 0x1ad /* offset: default boot option */ +#define OFF_DRIVE 0x1ae /* offset: setdrv drive */ +#define OFF_FLAGS 0x1af /* offset: option flags */ #define OFF_VERSION 0x1b0 /* offset: version number */ -#define OFF_OPT 0x1b9 /* offset: default boot option */ -#define OFF_DRIVE 0x1ba /* offset: setdrv drive */ -#define OFF_FLAGS 0x1bb /* offset: option flags */ +#define OFF_NTSERNUM 0x1b8 /* offset: NT Drive Serial Number */ #define OFF_TICKS 0x1bc /* offset: clock ticks */ #define OFF_PTBL 0x1be /* offset: partition table */ #define OFF_MAGIC 0x1fe /* offset: magic number */ @@ -155,7 +156,8 @@ /* * If we are installing the boot loader, read it from disk and copy the - * slice table over from the existing MBR. If not, then point boot0 + * slice table and NT Drive Serial Number over from the existing MBR. + * If not, then point boot0 * back at the MBR we just read in. After this, boot0 is the data to * write back to disk if we are going to do a write. */ @@ -163,6 +165,7 @@ boot0_size = read_mbr(bpath, &boot0, 1); memcpy(boot0 + OFF_PTBL, mbr + OFF_PTBL, sizeof(struct dos_partition) * NDOSPART); + memcpy(boot0 + OFF_NTSERNUM, mbr + OFF_NTSERNUM, 4); } else { boot0 = mbr; boot0_size = mbr_size; @@ -374,6 +377,7 @@ static u_int8_t id0[] = {0xfc, 0x31, 0xc0, 0x8e, 0xc0, 0x8e, 0xd8, 0x8e, 0xd0, 0xbc, 0x00, 0x7c }; static u_int8_t id1[] = {'D', 'r', 'i', 'v', 'e', ' '}; + static u_int8_t id1_alt[] = {'D', 'i', 's', 'k', ' '}; static struct { unsigned off; unsigned len; @@ -381,11 +385,16 @@ } ident[2] = { {0x0, sizeof(id0), id0}, {0x1b2, sizeof(id1), id1} + }, ident_alt[2] = { + {0x0, sizeof(id0), id0}, + {0x1b2, sizeof(id1_alt), id1_alt} }; + unsigned int i; for (i = 0; i < sizeof(ident) / sizeof(ident[0]); i++) - if (memcmp(bs + ident[i].off, ident[i].key, ident[i].len)) + if (memcmp(bs + ident[i].off, ident[i].key, ident[i].len) && + memcmp(bs + ident_alt[i].off, ident_alt[i].key, ident_alt[i].len)) return 0; return 1; } - --- lib/libdisk/write_i386_disk.c.orig Fri Jun 9 00:42:18 2006 +++ lib/libdisk/write_i386_disk.c Fri Jun 9 00:45:37 2006 @@ -75,9 +75,9 @@ if (mbrblk[0x1b0] == 0x66 && mbrblk[0x1b1] == 0xbb) { if (edd) - mbrblk[0x1bb] |= 0x80; /* Packet mode on */ + mbrblk[0x1af] |= 0x80; /* Packet mode on */ else - mbrblk[0x1bb] &= 0x7f; /* Packet mode off */ + mbrblk[0x1af] &= 0x7f; /* Packet mode off */ } } @@ -94,6 +94,11 @@ int s[4]; int need_edd = 0; /* Need EDD (packet interface) */ +#ifndef OFF_NTSERNUM +#define OFF_NTSERNUM 0x1b8 +#endif + unsigned char ntsernum[4]; + strcpy(device, _PATH_DEV); strcat(device, d1->name); @@ -108,6 +113,7 @@ } dp = (struct dos_partition *)(mbrblk + DOSPARTOFF); memcpy(work, dp, sizeof work); + memcpy(ntsernum, mbrblk + OFF_NTSERNUM, sizeof(ntsernum)); dp = work; free(mbrblk); for (c1 = d1->chunks->part; c1; c1 = c1->next) { @@ -188,6 +194,7 @@ } if (d1->bootmgr) { memcpy(mbrblk, d1->bootmgr, DOSPARTOFF); + memcpy(mbrblk + OFF_NTSERNUM, ntsernum, sizeof(ntsernum)); Cfg_Boot_Mgr(mbrblk, need_edd); } memcpy(mbrblk + DOSPARTOFF, dp, sizeof *dp * NDOSPART); Eugene -- Hо то, что нашел ты у черных и желтых, У белых ты тоже найдешь. --- slrn/0.9.8.0 (FreeBSD) * Origin: Svyaz Service JSC (2:5006/1@fidonet) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/26093057dc60c.html, оценка из 5, голосов 10
|