|
|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Eugene Grosbein 2:5006/1 19 Mar 2005 17:09:31 To : Sergey Korolew Subject : Re: BootEasy и WinXP -------------------------------------------------------------------------------- 15 мар 2005, вторник, в 13:02 KRAST, Sergey Korolew написал(а): SK> В принципе, не фря положила в mbr этот тэг и не ей его оттуда стирать. SK> Это по логике. Hо патч я предложить не смогу - некогда :-(( SK> А с другой стороны - взгляни вот сюда: SK> http://archives.neohapsis.com/archives/openbsd/cvs/2002-01/0122.html SK> Может это не бага а фича ? Возможно EasyBoot просто туда не умещается так SK> чтобы SK> не затереть этот nt serial number. Если захотеть - умещается, по крайней мере односекторный boot0 от четверки src/sys/boot/i386/boot0/boot0.s,v 1.14.2.6 мне удалось поправить. Задача: освободить четыре байта по смещению 0x1b8. Hепосредственно перед этими байтами лежит строка "Drive ", а следующий байт (0x1b8) используется для систем с более чем одним диском, сюда пишется номер диска, с какого нужно загружаться, этот байт завершает строку и в результате в меню выводится пункт "Drive 1" (или другая цифра). Изменением строки на "Disk" выигрываем один байт и освобождаем первый из четырех байтов. В остальных трех байтах лежат три независимые байтовые переменные, которым, в сущности, все равно где лежать. Hепосредственно после таблицы названий операционок есть два неиспользуемых байта. Вместо типа 0x63 (UNIX) ставим тип 0x7 (NTFS), а в таблице имен вместо UNIX пишем NT5, выигрывая еще один байт, итого три свободных. Сюда переносим байтовые переменные. Hовый boot0 готов. Теперь осталось научить инсталляторы boot0 не гробить NT Drive Serial Number и отразить в них изменения адресов перемещенных переменных. В четверке таких инсталляторов два: boot0cfg и sysinstall. boot0cfg все делает сам, а sysinstall пользуется libdisk, его и пришлось пропатчить. Установка: cd /usr/src; patch < /path/to/diff cd /usr/src/sys/boot/i386/boot0; make all install cd /usr/src/lib/libdisk; make all install cd /usr/src/release/sysinstall; make all install Сам патч ниже. - --- sys/boot/i386/boot0/boot0.s.orig Sat Mar 19 14:17:38 2005 +++ sys/boot/i386/boot0/boot0.s Sat Mar 19 15:49:46 2005 @@ -37,10 +37,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 @@ -364,7 +364,7 @@ # # These values indicate bootable types we know the names of # - .byte 0x1, 0x4, 0x6, 0xb, 0xc, 0xe, 0x63, 0x83 + .byte 0x1, 0x4, 0x6, 0x7, 0xb, 0xc, 0xe, 0x83 .byte 0x9f, 0xa5, 0xa6, 0xa9 # # These are offsets that match the known names above and point to the strings @@ -374,10 +374,10 @@ .byte os_dos-. # DOS .byte os_dos-. # DOS .byte os_dos-. # DOS + .byte os_nt-. # Windows NTFS .byte os_dos-. # Windows .byte os_dos-. # Windows .byte os_dos-. # Windows - .byte os_unix-. # UNIX .byte os_linux-. # Linux .byte os_bsd-. # BSD/OS .byte os_freebsd-. # FreeBSD @@ -389,12 +389,14 @@ # os_misc: .ascii "?"; .byte '?'|0x80 os_dos: .ascii "DO"; .byte 'S'|0x80 -os_unix: .ascii "UNI"; .byte 'X'|0x80 +os_nt: .ascii "NT"; .byte '5'|0x80 os_linux: .ascii "Linu"; .byte 'x'|0x80 os_freebsd: .ascii "Free" os_bsd: .ascii "BS"; .byte 'D'|0x80 - .org PRT_OFF-0xe,0x90 +opt: .byte 0x0 # Option +setdrv: .byte 0x80 # Drive to force +flags: .byte FLAGS # Flags .word B0MAGIC # Magic number @@ -403,11 +405,10 @@ # 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 Sat Mar 19 00:54:26 2005 +++ usr.sbin/boot0cfg/boot0cfg.c Sat Mar 19 14:12:25 2005 @@ -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; @@ -330,7 +333,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[] = {'D', 'i', 's', 'k', ' '}; static struct { unsigned off; unsigned len; - --- lib/libdisk/write_disk.c.orig Sat Mar 19 14:17:38 2005 +++ lib/libdisk/write_disk.c Sat Mar 19 15:05:07 2005 @@ -177,9 +177,9 @@ { if (mbr[0x1b0] == 0x66 && mbr[0x1b1] == 0xbb) { if (edd) - mbr[0x1bb] |= 0x80; /* Packet mode on */ + mbr[0x1af] |= 0x80; /* Packet mode on */ else - mbr[0x1bb] &= 0x7f; /* Packet mode off */ + mbr[0x1af] &= 0x7f; /* Packet mode off */ } } #endif @@ -204,6 +204,11 @@ int s[4]; #ifdef __i386__ int need_edd = 0; /* Need EDD (packet interface) */ + +#ifndef OFF_NTSERNUM +#define OFF_NTSERNUM 0x1b8 +#endif + unsigned char ntsernum[4]; #endif #endif int one = 1; @@ -244,6 +249,9 @@ } dp = (struct dos_partition*)(mbr + DOSPARTOFF); memcpy(work, dp, sizeof work); +#ifdef __i386__ + memcpy(ntsernum, mbr + OFF_NTSERNUM, sizeof(ntsernum)); +#endif dp = work; free(mbr); for (c1 = d1->chunks->part; c1; c1 = c1->next) { @@ -398,6 +406,9 @@ } if (d1->bootmgr) { memcpy(mbr, d1->bootmgr, DOSPARTOFF); +#ifdef __i386__ + memcpy(mbr + OFF_NTSERNUM, ntsernum, sizeof(ntsernum)); +#endif Cfg_Boot_Mgr(mbr, need_edd); } memcpy(mbr + DOSPARTOFF, dp, sizeof *dp * NDOSPART); Eugene --- slrn/0.9.8.0 (FreeBSD) * Origin: Svyaz Service JSC (2:5006/1@fidonet) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/260933b4b3900.html, оценка из 5, голосов 10
|