разделы жёсткого диска

Тема в разделе "WASM.WIN32", создана пользователем Cneg, 23 окт 2007.

  1. Cneg

    Cneg New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2007
    Сообщения:
    78
    Опытным путём было установлено, что все разделы жёсткого диска отстают друг от друга ровно на 32256 байт. Честно говоря, думалось что разделы пишутся прямо друг за другом, без всяких промежутков... Никто не подскажет с чем это связано?

    Код (Text):
    1. #include <windows.h>
    2. #include <Winioctl.h>
    3. #include <stdio.h>
    4. #include <iostream>
    5. using namespace std;
    6.  
    7. void ErrorExit(LPTSTR lpszFunction)
    8. {
    9.     TCHAR szBuf[80];
    10.     LPVOID lpMsgBuf;
    11.     DWORD dw = GetLastError();
    12.  
    13.     FormatMessage(
    14.         FORMAT_MESSAGE_ALLOCATE_BUFFER |
    15.         FORMAT_MESSAGE_FROM_SYSTEM,
    16.         NULL,
    17.         dw,
    18.         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    19.         (LPTSTR) &lpMsgBuf,
    20.         0, NULL );
    21.  
    22.     wsprintf(szBuf,
    23.         "%s failed with error %d: %s",
    24.         lpszFunction, dw, lpMsgBuf);
    25.  
    26.     MessageBox(NULL, szBuf, "Error", MB_OK);
    27.  
    28.     LocalFree(lpMsgBuf);
    29.     ExitProcess(dw);
    30. }
    31.  
    32. void main()
    33. {
    34.   PARTITION_INFORMATION pinf;
    35.   DRIVE_LAYOUT_INFORMATION dli;
    36.   int size_dli = sizeof(dli)+(11*sizeof(pinf));
    37.   char * temp = new char[size_dli];
    38.   BOOL pResult;
    39.   HANDLE hDevice1;
    40.   LPDWORD junk1;
    41.  
    42.   hDevice1 = CreateFile("\\\\.\\PHYSICALDRIVE0",
    43.                     GENERIC_READ,
    44.                     FILE_SHARE_READ | FILE_SHARE_WRITE,
    45.                     NULL,
    46.                     OPEN_EXISTING,
    47.                     0,
    48.                     NULL);
    49.  
    50.   if (hDevice1 == INVALID_HANDLE_VALUE)
    51.   {
    52.     return;
    53.   }
    54.  
    55.   pResult = DeviceIoControl(hDevice1,
    56.                             IOCTL_DISK_GET_DRIVE_LAYOUT,
    57.                             NULL, 0,
    58.                             (LPVOID) temp, (DWORD) size_dli,
    59.                             (LPDWORD)&junk1,
    60.                             (LPOVERLAPPED) NULL);
    61.  
    62.   CloseHandle(hDevice1);
    63.  
    64.   if (pResult)
    65.   {
    66.       DRIVE_LAYOUT_INFORMATION *ptr = (DRIVE_LAYOUT_INFORMATION *)temp;
    67.       cout << "Partition Count = \t\t" << ptr->PartitionCount << endl << endl;
    68.       for (unsigned int i=0; i<unsigned(ptr->PartitionCount); i++)
    69.       {
    70.           if ((ptr->PartitionEntry[i].PartitionNumber)==0) cout << "not a real volume" << endl;
    71.           else
    72.           {
    73.                   printf("Starting Offset =\t\t %I64d\n", ptr->PartitionEntry[i].StartingOffset);
    74.                   printf("Partition Length =\t\t %I64d\n", ptr->PartitionEntry[i].PartitionLength);
    75.                   cout << "Partition Number = \t\t" << (ULONG)ptr->PartitionEntry[i].PartitionNumber << endl;
    76.                   cout << "BootIndicator = \t\t" << (ULONG)ptr->PartitionEntry[i].BootIndicator << endl;
    77.                   cout << "HiddenSectors = \t\t" << (ULONG)ptr->PartitionEntry[i].HiddenSectors << endl;
    78.                   cout << "PartitionType = \t\t" << (ULONG)ptr->PartitionEntry[i].PartitionType << endl;
    79.                   cout << "RecognizedPartition = \t\t" << (ULONG)ptr->PartitionEntry[i].RecognizedPartition << endl;
    80.                   cout << "RewritePartition = \t\t" << (ULONG)ptr->PartitionEntry[i].RewritePartition << endl << endl;
    81.           }
    82.       }
    83.  
    84.   }
    85.     else
    86.     {
    87.         ErrorExit(0);
    88.     }
    89.  
    90.  
    91.  
    92. }
     
  2. Ultrin Faern

    Ultrin Faern New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    170
    А вам слово MBR ничего не говорит?
     
  3. Cneg

    Cneg New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2007
    Сообщения:
    78
    слово MBR... MBR располагается только в начале жёсткого диска. Тут же все разделы находятся на одном жёстком диске. А BR (Boot Record) насколько я понимаю входит в состав каждого раздела. Я не прав?
     
  4. Cneg

    Cneg New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2007
    Сообщения:
    78
    кроме того размер MBR, если уж на то пошло, всего 512 байт (446 - загрузочный код, 4 записи таблицы разделов по 16 байт и сигнатура 0xAA55 - 2 байта)
     
  5. Cneg

    Cneg New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2007
    Сообщения:
    78
    "...Перед этим разделом пропущен участок в одну головку (или первые 63 сектора), т.к. там записаны специальные данные (вроде boot record, partition table и т.д.)..."
    странно, почему же пропускается участок в одну головку (63 сектора или 32256 байт)... все структуры по размеру как правило не превышают 1 сектора....
     
  6. Cneg

    Cneg New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2007
    Сообщения:
    78
    вопрос решён.... режим совместимости BIOS определяет размер резервируемого пространства перед томом в 63 сектора... Хотя зачем? Отсюда и появилась возможность записи стороннего загрузчика...
    Всем спасибо, тема закрыта