Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 BootEasy и WinXP   Eugene Grosbein   14 Mar 2005 18:20:53 
 BootEasy и WinXP   Sergey Korolew   14 Mar 2005 15:02:38 
 Re: BootEasy и WinXP   Eugene Grosbein   14 Mar 2005 21:27:05 
 BootEasy и WinXP   Sergey Korolew   14 Mar 2005 22:42:42 
 Re: BootEasy и WinXP   Eugene Grosbein   15 Mar 2005 14:20:49 
 BootEasy и WinXP   Sergey Korolew   15 Mar 2005 14:02:26 
 Re: BootEasy и WinXP   Eugene Grosbein   15 Mar 2005 21:50:14 
 Re: BootEasy и WinXP   Eugene Grosbein   18 Mar 2005 23:02:21 
 Re: BootEasy и WinXP   Eugene Grosbein   18 Mar 2005 23:36:31 
 Re: BootEasy и WinXP   Eugene Grosbein   19 Mar 2005 03:00:22 
 Re: BootEasy и WinXP   Eugene Grosbein   19 Mar 2005 17:09:31 
 Re: BootEasy и WinXP   Eugene Grosbein   19 Mar 2005 17:12:55 
 Re: BootEasy и WinXP   Eugene Grosbein   20 Mar 2005 00:45:21 
Архивное /ru.unix.bsd/260933b4b3900.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional