Опытным путём было установлено, что все разделы жёсткого диска отстают друг от друга ровно на 32256 байт. Честно говоря, думалось что разделы пишутся прямо друг за другом, без всяких промежутков... Никто не подскажет с чем это связано? Код (Text): #include <windows.h> #include <Winioctl.h> #include <stdio.h> #include <iostream> using namespace std; void ErrorExit(LPTSTR lpszFunction) { TCHAR szBuf[80]; LPVOID lpMsgBuf; DWORD dw = GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); wsprintf(szBuf, "%s failed with error %d: %s", lpszFunction, dw, lpMsgBuf); MessageBox(NULL, szBuf, "Error", MB_OK); LocalFree(lpMsgBuf); ExitProcess(dw); } void main() { PARTITION_INFORMATION pinf; DRIVE_LAYOUT_INFORMATION dli; int size_dli = sizeof(dli)+(11*sizeof(pinf)); char * temp = new char[size_dli]; BOOL pResult; HANDLE hDevice1; LPDWORD junk1; hDevice1 = CreateFile("\\\\.\\PHYSICALDRIVE0", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hDevice1 == INVALID_HANDLE_VALUE) { return; } pResult = DeviceIoControl(hDevice1, IOCTL_DISK_GET_DRIVE_LAYOUT, NULL, 0, (LPVOID) temp, (DWORD) size_dli, (LPDWORD)&junk1, (LPOVERLAPPED) NULL); CloseHandle(hDevice1); if (pResult) { DRIVE_LAYOUT_INFORMATION *ptr = (DRIVE_LAYOUT_INFORMATION *)temp; cout << "Partition Count = \t\t" << ptr->PartitionCount << endl << endl; for (unsigned int i=0; i<unsigned(ptr->PartitionCount); i++) { if ((ptr->PartitionEntry[i].PartitionNumber)==0) cout << "not a real volume" << endl; else { printf("Starting Offset =\t\t %I64d\n", ptr->PartitionEntry[i].StartingOffset); printf("Partition Length =\t\t %I64d\n", ptr->PartitionEntry[i].PartitionLength); cout << "Partition Number = \t\t" << (ULONG)ptr->PartitionEntry[i].PartitionNumber << endl; cout << "BootIndicator = \t\t" << (ULONG)ptr->PartitionEntry[i].BootIndicator << endl; cout << "HiddenSectors = \t\t" << (ULONG)ptr->PartitionEntry[i].HiddenSectors << endl; cout << "PartitionType = \t\t" << (ULONG)ptr->PartitionEntry[i].PartitionType << endl; cout << "RecognizedPartition = \t\t" << (ULONG)ptr->PartitionEntry[i].RecognizedPartition << endl; cout << "RewritePartition = \t\t" << (ULONG)ptr->PartitionEntry[i].RewritePartition << endl << endl; } } } else { ErrorExit(0); } }
слово MBR... MBR располагается только в начале жёсткого диска. Тут же все разделы находятся на одном жёстком диске. А BR (Boot Record) насколько я понимаю входит в состав каждого раздела. Я не прав?
кроме того размер MBR, если уж на то пошло, всего 512 байт (446 - загрузочный код, 4 записи таблицы разделов по 16 байт и сигнатура 0xAA55 - 2 байта)
"...Перед этим разделом пропущен участок в одну головку (или первые 63 сектора), т.к. там записаны специальные данные (вроде boot record, partition table и т.д.)..." странно, почему же пропускается участок в одну головку (63 сектора или 32256 байт)... все структуры по размеру как правило не превышают 1 сектора....
вопрос решён.... режим совместимости BIOS определяет размер резервируемого пространства перед томом в 63 сектора... Хотя зачем? Отсюда и появилась возможность записи стороннего загрузчика... Всем спасибо, тема закрыта