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

Discussion in 'WASM.WIN32' started by Cneg, Oct 23, 2007.

  1. Cneg

    Cneg New Member

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

    Code (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

    Blog Posts:
    0
    Joined:
    Jun 25, 2006
    Messages:
    170
    А вам слово MBR ничего не говорит?
     
  3. Cneg

    Cneg New Member

    Blog Posts:
    0
    Joined:
    Mar 28, 2007
    Messages:
    78
    слово MBR... MBR располагается только в начале жёсткого диска. Тут же все разделы находятся на одном жёстком диске. А BR (Boot Record) насколько я понимаю входит в состав каждого раздела. Я не прав?
     
  4. Cneg

    Cneg New Member

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

    Cneg New Member

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

    Cneg New Member

    Blog Posts:
    0
    Joined:
    Mar 28, 2007
    Messages:
    78
    вопрос решён.... режим совместимости BIOS определяет размер резервируемого пространства перед томом в 63 сектора... Хотя зачем? Отсюда и появилась возможность записи стороннего загрузчика...
    Всем спасибо, тема закрыта