ПредишенСледващото

// Диск - брой Disc (номерирани от нула).

hFile: = CreateFile (PChar ( ". \\ \ PhysicalDrive '+ IntToStr (диск)), GENERIC_READ, FILE_SHARE_READ + FILE_SHARE_WRITE, нула, OPEN_EXISTING, 0,0);
ако след hFile = INVALID_HANDLE_VALUE Изход;

По този начин, ние можем да възприемаме физическия диск като един голям файл.
Второто нещо, което да се направи - е да се получи информация за геометрията на диска.

конст IOCTL_DISK_GET_DRIVE_GEOMETRY = $ 70000;

тип
TDiskGeometry = опаковани рекорд
Цилиндри: Int64; // брой
цилиндри
MediaType: DWORD; // тип носители
TracksPerCylinder: DWORD; // песни на цилиндъра
SectorsPerTrack: DWORD; // сектори на писта
BytesPerSector: DWORD; // байта на сектор
приключи;

Резултат: = DeviceIoControl (hFile, IOCTL_DISK_GET_DRIVE_GEOMETRY, нула, 0,
@ DiskGeometry, SizeOf (TDiskGeometry), боклуци, нула) и (боклуци = SizeOf (TDiskGeometry));

Функцията връща True, ако операцията е била успешна, и False в противен случай
случай.

Сега можем да започнем да се определи местоположението на логически дялове на
твърд диск. Тя трябва да започне с четене на нула сектор на физическия диск.
Той съдържа MBR (магистър Boot Record), както и таблицата на дяловете. Между другото, мисля,
Ще бъде интересно да спаси MBR във файл и да видим програмата обувка
някои dizasmom. Но в момента ние се интересуваме само от таблицата на дяловете.

Тази таблица се намира в сектора на офсет 1BE $ и се състои от четири
идентични елементи, всеки от които описва една част:

TPartitionTableEntry = опаковани рекорд
BootIndicator: Byte; // 80 $, ако активното (стартиращ) дяла
StartingHead: Byte;
StartingCylAndSect: Word;
SystemIndicator: Byte;
EndingHead: Byte;
EndingCylAndSect: Word;
StartingSector: DWORD; // започне сектор
NumberOfSects: DWORD; // брой сектори
приключи;

Следователно е възможно да се представи като масив от разпределение таблица:

TPartitionTable = опаковани масив [0..3] на TPartitionTableEntry;

Примери за полеви стойности SystemIndicator:
01 - FAT12
04 - FAT16
05 - РАЗШИРЕНИЕ
06 - FAT16
07 - NTFS
0B - FAT32
0F - РАЗШИРЕНИЕ

Сега можем да се пристъпи към анализ на структурата на логически дялове. в момента
(И по-късно), тя е полезна функция ReadSectors.

// като устройството за нас - това е голям файл, а след това да се движат по него
// използване SetFilePointer нужда 64hrazryadnaya аритметика

функционира __Mul (а, б: DWORD; Var HiDWORD: DWORD): DWORD; // Резултат = LoDWORD
ASM
MUL EDX
Mov [ECx], EDX
приключи;

функционални ReadSectors (DriveNumber: Байт; StartingSector, SectorCount: DWORD;
Буфер: Pointer; BytesPerSector: DWORD = 512): DWORD;
Var
hFile: THandle;
Br, TmpLo, TmpHi: DWORD;
започвам
Резултати: = 0;
hFile: ". \\ \ PhysicalDrive '= CreateFile (PChar (+ IntToStr (DriveNumber)),
GENERIC_READ, FILE_SHARE_READ, нула, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
ако след hFile = INVALID_HANDLE_VALUE Изход;
TmpLo: = __Mul (StartingSector, BytesPerSector, TmpHi);
ако SetFilePointer (hFile, TmpLo, @ TmpHi, FILE_BEGIN) = TmpLo тогава
започвам
SectorCount: = SectorCount * BytesPerSector;
ако не ReadFile (hFile, буфер ^, SectorCount, Br, нула) след излизане;
Резултати: = Вг;
приключи;
CloseHandle (hFile);
приключи;

И в същото време функцията за запис:

функционални WriteSectors (DriveNumber: Байт; StartingSector, SectorCount: DWORD;
Буфер: Pointer; BytesPerSector: DWORD = 512): DWORD;
Var
hFile: THandle;
тт, TmpLo, TmpHi: DWORD;
започвам
Резултати: = 0;
hFile: ". \\ \ PhysicalDrive '= CreateFile (PChar (+ IntToStr (DriveNumber)),
GENERIC_WRITE, FILE_SHARE_READ, нула, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
ако след hFile = INVALID_HANDLE_VALUE Изход;
TmpLo: = __Mul (StartingSector, BytesPerSector, TmpHi);
ако SetFilePointer (hFile, TmpLo, @ TmpHi, FILE_BEGIN) = TmpLo тогава
започвам
SectorCount: = SectorCount * BytesPerSector;
ако не WriteFile (hFile, Буфер ^, SectorCount, телесно тегло, нула), след това излизане;
Резултат: = телесно тегло;
приключи;
CloseHandle (hFile);
приключи;

PDriveInfo = ^ TDriveInfo;
TDriveInfo = рекорд
PartitionTable: TPartitionTable;
LogicalDrives: масив [0..3] на PDriveInfo;
приключи;

И сега в самия код:

конст
PartitionTableOffset = $ 1be;
ExtendedPartitions = [5, $ т];

Var
MainExPartOffset: DWORD = 0;

функционира GetDriveInfo (DriveNumber: Байт; DriveInfo: PDriveInfo;
StartingSector: DWORD; BytesPerSector: DWORD = 512): булева;
Var
Buf: масив от байтове;
CurExPartOffset: DWORD;
I: цяло число;
започвам
SetLength (Buf, BytesPerSector);
// във буфер сектор
ако ReadSectors (DriveNumber, MainExPartOffset + StartingSector, 1, @ Buf [0]) = 0, тогава
започвам
Резултат: = False;
Завършване (Buf);
Exit;
приключи;
// попълнете структура DriveInfo.PartitionTable
Преместване (Buf [PartitionTableOffset] DriveInfo.PartitionTable, SizeOf (TPartitionTable));
Завършване (Buf); // вече не е необходимо буфер

Резултат: = True;
защото: = 0 до 3 направи // за всяко вписване в таблица на разпределение
ако DriveInfo.PartitionTable [Ь] .SystemIndicator в ExtendedPartitions тогава
започвам
Нови (DriveInfo.LogicalDrives [I]);
ако MainExPartOffset = 0, тогава
започвам
MainExPartOffset: = DriveInfo.PartitionTable [I] .StartingSector;
CurExPartOffset: = 0;
края друг CurExPartOffset: = DriveInfo.PartitionTable [I] .StartingSector;
Резултати: = Резултати и GetDriveInfo (DriveNumber, DriveInfo.LogicalDrives [I],
CurExPartOffset);
края друг DriveInfo.LogicalDrives [I]: = нула;
приключи;

Функцията запълва структура и се връща DriveInfo
Вярно е, ако операцията е била успешна, или невярно друго.
Сега имаме тази полезна информация за теми като първоначалната
сектор, общият брой на сектори, както и файловата система.
В нула сектора на всяка основна точка е BIOS параметър
Блок, който съдържа информацията, като името на файловата система, броят на сектори в
клъстер и т.н. Както и програма товарач (с изключение на сектора към файл и да потърсите
любимата си dizasmom).

За щастие, те вече имат Delphi (IntToHex и StrToInt) и остава единственото им
правилна употреба. StrToInt може да се използва за преобразуване на низ,
съдържащ шестнадесетично число в цяло число, ако завърши пред символа на $.

Пълен програмен код демонстрирането описан в статия
приложен. Програмата е в състояние да покаже структурата на логически устройства, показване на съдържанието на
сектор, а също така ви позволява да съхранявате сметището файл в избраната сектор. изпълнение
редактиране на диск опции в програмата оставят като домашна работа.

За да получите достъп до физическия диск, отворихме устройството \\. \ PHYSICALDRIVE,
Допълнителна демонтирани неговата структура. Човек би могъл да го направи по-лесно. Open веднага логика
колела (\\ \ C:. \\ \ D:., и т.н.), но в тази версия, че сме загубили от поглед някои
площ на диска. Например, диск MBR и неразпределено пространство. По принцип, в зависимост от задачата,
с които да работят.

Покажете тази статия на приятел:

Подкрепете проекта - споделете линка, благодаря!