Szerkesztő vezetni a saját kezét
// meghajtó - Lemez száma (számozott nulla).
hFile: = CreateFile (PChar ( '\\ \ PhysicalDrive.' + IntToStr (meghajtó)), GENERIC_READ, FILE_SHARE_READ + FILE_SHARE_WRITE, nulla, OPEN_EXISTING, 0,0);
ha hFile = INVALID_HANDLE_VALUE majd a Kilépés;
Így tudjuk érzékelni a fizikai lemezen, mint egy nagy fájlba.
A második dolog - az, hogy a lemezek geometria.
const IOCTL_DISK_GET_DRIVE_GEOMETRY = $ 70.000;
típus
TDiskGeometry = csomagolt rekord
Hengerek: Int64; // száma
hengerek
MediaType: DWORD; // típusú média
TracksPerCylinder: DWORD; // zeneszámokat a henger
SectorsPerTrack: DWORD; // szektort sávonként
BytesPerSector: DWORD; // bájt szektoronként
végén;
Eredmény: = DeviceIoControl (hFile, IOCTL_DISK_GET_DRIVE_GEOMETRY, nulla, 0,
@ DiskGeometry, sizeof (TDiskGeometry), junk, nulla) és (junk = sizeof (TDiskGeometry));
A függvény értéke igaz, ha a művelet sikeres volt, és egyébként pedig false
ügyben.
Most kezdődik azonosítani a helyét a logikai meghajtók
merevlemez. Meg kell kezdeni az olvasást a nulla szektor a fizikai lemez.
Ez tartalmazza az MBR (Master Boot Record), valamint a partíciós táblát. By the way, azt hiszem,
Érdekes lesz, hogy mentse az MBR egy fájlba, és látni a boot program
Egyes dizasmom. De ebben a pillanatban mi csak az érdekli, Partition Table.
Ez a táblázat található a szektor eltolás 1BE $ és négy
azonos elemeket, amelyek mindegyike leírja egy szakasz:
TPartitionTableEntry = csomagolt rekord
BootIndicator: Byte; // $ 80, ha az aktív (indítható) partíció
StartingHead: Byte;
StartingCylAndSect: Szó;
SystemIndicator: Byte;
EndingHead: Byte;
EndingCylAndSect: Szó;
StartingSector: DWORD; // kezdőszektorát
NumberOfSects: DWORD; // szektorok száma
végén;
Ennek megfelelően, lehetséges, hogy be magát, mint egy sor Partíciótábla:
TPartitionTable = csomagolt array [0..3] a TPartitionTableEntry;
Példák a terület értékeit SystemIndicator:
01 - FAT12
04 - FAT16
05 - BŐVÍTETT
06 - FAT16
07 - NTFS
0B - FAT32
0F - BŐVÍTETT
Most folytassa elemzése a szerkezet a logikai meghajtókat. most
(És később), hasznos funkció ReadSectors.
// a meghajtó számunkra - ez egy nagy fájlt, majd mozgatni rajta
// használatával SetFilePointer szükség 64hrazryadnaya számtani
működnek __Mul (a, b: DWORD; var HiDWORD: DWORD): DWORD; // Eredmény = LoDWORD
asm
mul edx
mov [ECx], EDX
végén;
funkció ReadSectors (DriveNumber: byte; StartingSector, SectorCount: DWORD;
Puffer: Pointer; BytesPerSector: DWORD = 512): DWORD;
var
hFile: THandle;
br, TmpLo, TmpHi: DWORD;
kezdődik
Eredmény: = 0;
hFile: = CreateFile (PChar ( '\\ \ PhysicalDrive.' + IntToStr (DriveNumber)),
GENERIC_READ, FILE_SHARE_READ, nulla, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
ha hFile = INVALID_HANDLE_VALUE majd a Kilépés;
TmpLo: = __Mul (StartingSector, BytesPerSector, TmpHi);
ha SetFilePointer (hFile, TmpLo, @ TmpHi, FILE_BEGIN) = TmpLo majd
kezdődik
SectorCount: = SectorCount * BytesPerSector;
ha nem readfile (hFile, puffer ^, SectorCount, br, nil) majd a Kilépés;
Eredmény: = Br;
végén;
CloseHandle (hFile);
végén;
És ugyanakkor funkció a felvételhez:
funkció WriteSectors (DriveNumber: byte; StartingSector, SectorCount: DWORD;
Puffer: Pointer; BytesPerSector: DWORD = 512): DWORD;
var
hFile: THandle;
BW, TmpLo, TmpHi: DWORD;
kezdődik
Eredmény: = 0;
hFile: = CreateFile (PChar ( '\\ \ PhysicalDrive.' + IntToStr (DriveNumber)),
GENERIC_WRITE, FILE_SHARE_READ, nulla, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
ha hFile = INVALID_HANDLE_VALUE majd a Kilépés;
TmpLo: = __Mul (StartingSector, BytesPerSector, TmpHi);
ha SetFilePointer (hFile, TmpLo, @ TmpHi, FILE_BEGIN) = TmpLo majd
kezdődik
SectorCount: = SectorCount * BytesPerSector;
ha nem WriteFile (hFile, puffer ^, SectorCount, BW, nil) majd a Kilépés;
Eredmény: = BW;
végén;
CloseHandle (hFile);
végén;
PDriveInfo = ^ TDriveInfo;
TDriveInfo = rekord
PartitionTable: TPartitionTable;
LogicalDrives: array [0..3] a PDriveInfo;
végén;
És most maga a kód:
const
PartitionTableOffset = $ 1BE;
ExtendedPartitions = [5, $ f];
var
MainExPartOffset: DWORD = 0;
működnek GetDriveInfo (DriveNumber: byte; driveinfot: PDriveInfo;
StartingSector: DWORD; BytesPerSector: DWORD = 512): Boole;
var
buf: tömb byte;
CurExPartOffset: DWORD;
i: integer;
kezdődik
SetLength (buf, BytesPerSector);
// olvassa az ágazatban pufferben
ha ReadSectors (DriveNumber, MainExPartOffset + StartingSector, 1, @ buf [0]) = 0, akkor
kezdődik
Eredmény: = false;
Lezárás (buf);
Kilépés;
végén;
// töltse szerkezet DriveInfo.PartitionTable
Mozgatás (buf [PartitionTableOffset], DriveInfo.PartitionTable, sizeof (TPartitionTable));
Lezárás (buf); // puffert már nincs szükség
Eredmény: = true;
i: = 0 és 3 do // minden egyes bejegyzés a Partíciótábla
ha DriveInfo.PartitionTable [i] .SystemIndicator a ExtendedPartitions majd
kezdődik
Új (DriveInfo.LogicalDrives [I]);
ha MainExPartOffset = 0, akkor
kezdődik
MainExPartOffset: = DriveInfo.PartitionTable [I] .StartingSector;
CurExPartOffset: = 0;
véget mást CurExPartOffset: = DriveInfo.PartitionTable [I] .StartingSector;
Eredmény: = Eredmény és GetDriveInfo (DriveNumber, DriveInfo.LogicalDrives [I],
CurExPartOffset);
véget mást DriveInfo.LogicalDrives [I]: = nil;
végén;
A függvény kitölti a szerkezet, és visszatér driveinfot
Igaz, ha a művelet sikeres volt, vagy hamis egyébként.
Most ezt a hasznos információt témákról, mint az eredeti
ágazat, az összes szektorban, valamint a fájlrendszert.
A zéró szektor minden főbb rész BIOS Paraméter
Block, hogy tartalmazza azokat az információkat, például a nevét, a fájlrendszer, a több szektorában
klaszter, stb Csakúgy, mint egy programot rakodó (kivéve az ágazat egy fájlba, és nézd
kedvenc dizasmom).
Szerencsére már van Delphi (IntToHex és StrToInt), és továbbra is az egyetlen
megfelelő használatát. StrToInt lehet felhasználni, hogy egy string,
tartalmazó hexadecimális számot Integer, ha befejezem előtte a $ jelet.
Teljes programkód bizonyítékaképpen cikkelyben leírt
csatolva. A program képes megmutatni a szerkezet logikai meghajtót, jelenítse meg a tartalmát a
ágazat, és azt is lehetővé teszi, hogy tárolja a memóriaképfájlt a kiválasztott szektorban. végrehajtás
lemez szerkesztési lehetőségek a programban hagyja a házi feladatot.
Ahhoz, hogy hozzáférjen a fizikai lemez, megnyitottuk a készülék \\. \ PHYSICALDRIVE
További bontott felépítését. Lehetne csinálni könnyebb. Nyílt azonnal logika
kerekek (\\ \ C:. \\ \ D:., stb), de ez a verzió, szem elől tévesztettük néhány
a korongon. Például az MBR-lemezen és szabad terület. Általában a feladattól függően,
amellyel dolgozni.
Itt található az ezt a cikket egy ismerősének: