Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

BootEasy & Vista

1 view
Skip to first unread message

Eugene Grosbein

unread,
Jan 5, 2009, 8:05:51 PM1/5/09
to
Привет!

В своё время была проблема корректной загрузки WinXP через BootEasy
от шестерки (а ещё раньше от четверки), она была благополучно решена
путем патча на BootEasy, чтобы не трогал NT Drive Serial Number,
который XP иногда очень хочет видеть в MBR:
http://groups.google.ru/group/fido7.ru.unix.bsd/browse_thread/thread/670c189b1957e12e/f0cb67c7ad4d890f

Сейчас, с Vista и семеркой, проблема стоит более жестко:
установка штатного BootEasy в MBR безусловно нарушает загрузку Vista.
Кто-нибудь знает, это та же самая проблема или Vista хочет ещё
чего-то от MBR?

Так как ниоткуда не следует, что раздел с виндой завтра ещё будет на винте,
вариант загрузки FreeBSD (dual-boot) откуда-либо кроме MBR не рассматривается.

Eugene
--
With sufficient thrust, pigs fly just fine. However, this is not necessarily
a good idea. It is hard to be sure where they are going to land, and it could
be dangerous sitting under them as they fly overhead.
3rd Fundamental Truth of Networking (RFC1925)

Eugene Grosbein

unread,
Jan 5, 2009, 9:05:50 PM1/5/09
to
06 янв 2009, вторник, в 04:05 KRAT, Eugene Grosbein написал(а):

EG> В своё время была проблема корректной загрузки WinXP через BootEasy
EG> от шестерки (а ещё раньше от четверки), она была благополучно решена
EG> путем патча на BootEasy, чтобы не трогал NT Drive Serial Number,
EG> который XP иногда очень хочет видеть в MBR:
EG> http://groups.google.ru/group/fido7.ru.unix.bsd/browse_thread/thread/670c189b1957e12e/f0cb67c7ad4d890f
EG> Сейчас, с Vista и семеркой, проблема стоит более жестко:
EG> установка штатного BootEasy в MBR безусловно нарушает загрузку Vista.
EG> Кто-нибудь знает, это та же самая проблема или Vista хочет ещё
EG> чего-то от MBR?

Hашлась статья, в которой говорится, что проблема именно в этом:
http://www.clearchain.com/blog/posts/freebsd-windows-vista

Более того, там указывается элементарный способ оторвать Висте
хотение этого Number в MBR вообще. Hадо проверить.

Кроме того, оказывается, есть такой PR, в котором мой код засабмичен:
http://www.freebsd.org/cgi/query-pr.cgi?pr=127764

И месяц назад luigi в CURRENT нечто в этом стиле уже добавил в boot0,
ссылаясь на тот PR, но в форме условной компиляции:
http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/boot/i386/boot0/boot0.S#rev1.20

В семерке же boot0 почти не отличается от его же в шестерке,
поэтому старый патч, годный для 6.2, должен сработать и для семерки,
надо попробовать...

Eugene
--
А если не будут брать, отключим газ.

Eugene Grosbein

unread,
Jan 6, 2009, 10:03:18 AM1/6/09
to
06 янв 2009, вторник, в 05:05 KRAT, Eugene Grosbein написал(а):

EG>> В своё время была проблема корректной загрузки WinXP через BootEasy
EG>> от шестерки (а ещё раньше от четверки), она была благополучно решена
EG>> путем патча на BootEasy, чтобы не трогал NT Drive Serial Number,
EG>> который XP иногда очень хочет видеть в MBR:
EG>> http://groups.google.ru/group/fido7.ru.unix.bsd/browse_thread/thread/670c189b1957e12e/f0cb67c7ad4d890f
EG>> Сейчас, с Vista и семеркой, проблема стоит более жестко:
EG>> установка штатного BootEasy в MBR безусловно нарушает загрузку Vista.
EG>> Кто-нибудь знает, это та же самая проблема или Vista хочет ещё
EG>> чего-то от MBR?

EG> Hашлась статья, в которой говорится, что проблема именно в этом:
EG> http://www.clearchain.com/blog/posts/freebsd-windows-vista

Так и есть, убедился в этом сам (ниже).

EG> Более того, там указывается элементарный способ оторвать Висте
EG> хотение этого Number в MBR вообще. Hадо проверить.

Тот способ с настройкой Vista BCD обладает некоторыми ограничениями,
да ещё и были репорты о том, что в некоторых случаях в итоге получается
незагружаемая система. Пробовать не стал, обновил патч на BootEasy
для семерки.

EG> Кроме того, оказывается, есть такой PR, в котором мой код засабмичен:
EG> http://www.freebsd.org/cgi/query-pr.cgi?pr=127764
EG> И месяц назад luigi в CURRENT нечто в этом стиле уже добавил в boot0,
EG> ссылаясь на тот PR, но в форме условной компиляции:
EG> http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/boot/i386/boot0/boot0.S#rev1.20
EG> В семерке же boot0 почти не отличается от его же в шестерке,
EG> поэтому старый патч, годный для 6.2, должен сработать и для семерки,
EG> надо попробовать...

Прямо в том же самом виде патч от 6.2 не пошел (смещения поменялись),
чуток подправил. Hо это даже к лучшему, потому что в итоге отличий
от штатного BootEasy для семерки получилось даже меньше. В семерке
исполняемый код на один байт короче, чем в шестерке. Плюс в CURRENT
для экономии места сообщение "Default:" заменили на "Boot:", сделал
то же самое в своём патче - ещё три байта, итого четыре свободных байта,
это помогло. Патчи на boot0cfg и libdisk в точности как в старом варианте
для шестерки. Прикладывать:

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

В итоге получаем boot0, который не затирает нужные Висте байты во время
своей работы и boot0cfg и sysinstall, которые не затирают их
во время установки BootEasy в MBR. И BootEasy замечательно грузит Висту.

- --- sys/boot/i386/boot0/boot0.S.orig 2008-12-31 00:31:12.000000000 +0700
+++ sys/boot/i386/boot0/boot0.S 2009-01-06 17:35:49.000000000 +0700
@@ -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
@@ -401,7 +401,7 @@
/* Menu strings */

item: .ascii " "; .byte ' '|0x80
-prompt: .ascii "\nDefault:"; .byte ' '|0x80
+prompt: .ascii "\nBoot:"; .byte ' '|0x80
crlf: .ascii "\r"; .byte '\n'|0x80

/* Partition type tables */
@@ -442,6 +442,11 @@
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
@@ -451,11 +456,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

/*
- --- usr.sbin/boot0cfg/boot0cfg.c.orig Fri Jun 9 01:48:04 2006
+++ 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а этом-то и держится режим!..

Eugene Grosbein

unread,
May 4, 2009, 10:26:43 AM5/4/09
to
06 ��� 2009, �������, � 18:03 KRAT, Eugene Grosbein �������(�):

EG>> ����� ����, �����������, ���� ����� PR, � ������� ��� ��� ����������:
EG>> http://www.freebsd.org/cgi/query-pr.cgi?pr=127764
EG>> � ����� ����� luigi � CURRENT ����� � ���� ����� ��� ������� � boot0,
EG>> �������� �� ��� PR, �� � ����� �������� ����������:
EG>> http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/boot/i386/boot0/boot0.S#rev1.20
EG>> � ������� �� boot0 ����� �� ���������� �� ��� �� � ��������,
EG>> ������� ������ ����, ������ ��� 6.2, ������ ��������� � ��� �������,
EG>> ���� �����������...
EG> ����� � ��� �� ����� ���� ���� �� 6.2 �� ����� (�������� ����������),
EG> ����� ���������.

������ �ӣ, finita la comedia. 7.2-RELEASE ����� � � ��� ��� ��������������
������������� � ���� �������� ���� � MBR.

Eugene
--
���������� �����������, ������� � ���������� �������� �������� �������
�������� ��� ������������ ��������� ��� ������� ������. (H������ �����)

0 new messages