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