Registriert seit: 23. Feb 2010
10 Beiträge
FreePascal / Lazarus
|
AW: Direktes lesen auf dem physischen Datenträger
19. Jun 2018, 21:54
Das Programm ist jetzt so weit, das die Infos zur Partition angezeigt werden und nach der Auswahl der erste Sektor ausgelesen wird.
Siehe Screenshot.
MBR_Auslesen.png
Allerdings funktioniert das Offset bei ReadFile nicht richtig, bzw. ich konnte nicht wirklich finden, womit der Record von ^Overlapped befüllt werden muss.
Delphi-Quellcode:
type TSECTOR= Array[0..511] of Byte;
const SectorSize = 512;
var Sector: TSector;
nBytesRead ,
fHandle : Cardinal;
theOverlapped: Overlapped;
//funktioniert:
Result := ReadFile(fHandle, Sector[0], SectorSize, nBytesRead, nil);
//funktioniert nicht:
theOverlapped.OffsetHigh:=0;
theOverlapped.Offset:=Offset*SectorSize;
Result := ReadFile(fHandle, Sector[0], SectorSize, nBytesRead, @theOverlapped);
Komplette Funktion:
Delphi-Quellcode:
Function GetSector ( const PhysDrive: String; const Offset: DWord; out Sector: TSector): Boolean;
const SectorSize = 512;
var
nBytesRead ,
fHandle : Cardinal;
theOverlapped: Overlapped;
begin
fHandle := CreateFile(
PChar(PhysDrive), //PChar('\\.\PHYSICALDRIVE'+IntToStr(DiskNumber)),
GENERIC_READ, FILE_SHARE_WRITE,
nil,
OPEN_EXISTING,
0,
0);
if fHandle = INVALID_HANDLE_VALUE then
begin
Result := False;
ShowMessage(' CreateFile - Fehler: Invalid Handle' +#13#10#13#10+
' Hinweis: liegen Admin-Rechte vor?');
exit;
end;
Result := ReadFile(fHandle, Sector[0], SectorSize, nBytesRead, nil);
if nBytesRead-1 <> High(Sector) then Result := False;
if not Result then
begin
ShowMessage(' ReadFile - Fehler' +#13#10#13#10+
' Es sollten '+IntToStr(High(Sector))+ ' bytes gelesen werden' +#13#10+
' aber nur '+ IntToStr(nBytesRead-1) +' bytes waren lesbar!');
end;
CloseHandle(fHandle);
end;
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
Künstliche Intelligenz ist gar nichts - verglichen mit natürlicher Dummheit
Geändert von Delphi-Delphin (19. Jun 2018 um 22:15 Uhr)
|
|
Zitat
|