Registriert seit: 23. Feb 2010
10 Beiträge
FreePascal / Lazarus
|
AW: Direktes lesen auf dem physischen Datenträger
19. Jun 2018, 22: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.
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 23:15 Uhr)
|
|
Zitat
|