Freunde, die sich mit Real-Mode-Programmierung auskennen, wissen, dass Sie den INT 13-Interrupt des BIOS verwenden können, um absolute Lese- und Schreibvorgänge auf der Festplatte durchzuführen. In der NT-Umgebung können Sie den INT 13-Interrupt jedoch nicht zum direkten Lesen und Schreiben der Festplatte verwenden. Hier können wir CreateFile verwenden und den Pfadnamen auf „//./X:“ setzen, um die logische Festplatte zu öffnen und Lese- und Schreibvorgänge durchzuführen. X ist der Laufwerksbuchstabe.
Der Prototyp der Funktion „CreateFile“ lautet wie folgt:
HANDLE CreateFile(LPCTSTR lpFileName, DWord dwDesiredaccess, DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
lpFileName: der Name der zu öffnenden Datei
dwDesiredAccess: Wenn es GENERIC_READ ist, bedeutet dies, dass Lesezugriff auf das Gerät zulässig ist. Wenn es GENERIC_WRITE ist, bedeutet dies, dass Schreibzugriff auf das Gerät zulässig ist (kann in Kombination verwendet werden). Es dürfen Informationen zu einem Gerät eingeholt werden.
dwShareMode: Null bedeutet keine Freigabe; FILE_SHARE_READ und/oder FILE_SHARE_WRITE bedeutet, gemeinsamen Zugriff auf die Datei zuzulassen
lpSecurityAttributes: Zeiger auf eine SECURITY_ATTRIBUTES-Struktur, die die Sicherheitsattribute der Datei definiert
dwCreationDistribution: Erstellungsmethode
dwFlagsAndAttributes: Andere Attribute
hTemplateFile: Wenn ungleich Null, wird ein Dateihandle angegeben. Die neue Datei kopiert die erweiterten Attribute aus dieser Datei
Das folgende Beispiel wird unter Windows XP kompiliert und übergeben. Die implementierte Funktion besteht darin, den Bootsektor des Laufwerks C zu lesen und die gelesenen Daten anzuzeigen.
Programm ReadDisk;
verwendet
SysUtils,
Windows;
var
Buf: Array [0..511] von Byte; //Datenpuffer
ShowText, TmpStr: string;
FileHandle: THandle;
ReadCount, i: Kardinal;
beginnen
//Festplatte öffnen
FileHandle := CreateFile('//./C:', GENERIC_READ, FILE_SHARE_READ oder FILE_SHARE_WRITE,
nil, OPEN_EXISTING, 0, 0);
wenn FileHandle = INVALID_HANDLE_VALUE dann
beginnen
MessageBox(GetDesktopWindow, 'Fehler beim Öffnen der Festplatte', 'ERROR', MB_OK);
ExitProcess(0);
Ende;
//Bootsektordaten lesen
if ReadFile(FileHandle, Buf, 512, ReadCount, nil) dann
beginnen
SetLength(ShowText, Länge(Buf) * 3);
//Daten in String konvertieren
for i := Low(Buf) to High(Buf) do
beginnen
TmpStr := Format('%2.2x ', [Buf[i]]);
CopyMemory(@ShowText[i*3+1], @TmpStr[1], 3);
Ende;
Ende;
MessageBox(GetDesktopWindow, PChar(ShowText), 'Boot Sector', MB_OK);
CloseHandle(FileHandle);
ExitProcess(0);
Ende.