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


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)
 
 

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

 Тема:    Автор:    Дата:  
 BootEasy и WinXP   Eugene Grosbein   09 Jun 2006 01:19:58 
 Re: BootEasy и WinXP   Eugene Grosbein   09 Jun 2006 12:28:34 
Архивное /ru.unix.bsd/26093057dc60c.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional