Entschuldigung erst einmal, dass ich mich erst so spät wieder melde.
Ich habe jetzt mal in dem Programm von Luckie gestöbert und bin dabei auf die Funktion DeviceIOControl gestoßen. In der
MSDN fand ich dann dies hier:
*klick*
Ich denke, dass dies genau das Richtige ist. Daher hab ich in Anlehnung an Luckies Code ein wenig rumprobiert:
Delphi-Quellcode:
...
type
STARTING_VCN_INPUT_BUFFER = record
StartingVCN: LARGE_INTEGER;
end;
PSTARTING_VCN_INPUT_BUFFER = ^STARTING_VCN_INPUT_BUFFER;
type
EXTENT = record
NextVcn: LARGE_INTEGER;
Lcn: LARGE_INTEGER;
end;
type EXTENTS = array of EXTENT;
type
RETRIEVAL_POINTERS_BUFFER = record
ExtentCount: DWORD;
StartingVcn: LARGE_INTEGER;
Extents: EXTENTS;
end;
PRETRIEVAL_POINTERS_BUFFER = ^RETRIEVAL_POINTERS_BUFFER;
...
und
Delphi-Quellcode:
procedure GetLocation(FileName: String);
var hFile: THandle;
InBuffer: STARTING_VCN_INPUT_BUFFER;
OutBuffer: PRETRIEVAL_POINTERS_BUFFER;
BytesReturned: DWORD;
StartingVCN: String;
begin
hFile := CreateFile(PAnsiChar(FileName), GENERIC_READ, FILE_SHARE_READ, nil,
OPEN_EXISTING, 0, 0);
if hFile <> INVALID_HANDLE_VALUE then
begin
with InBuffer.StartingVCN do
begin
LowPart := 0;
HighPart := 0;
QuadPart := 0;
end;
OutBuffer := PRETRIEVAL_POINTERS_BUFFER(LocalAlloc(LMEM_ZEROINIT, ???));
if not DeviceIOControl(hFile, FSCTL_GET_RETRIEVAL_POINTERS, @InBuffer,
sizeof(InBuffer), OutBuffer, sizeof(OutBuffer), BytesReturned, nil) then
begin
MessageBox(0, PChar(SysErrorMessage(GetLastError)), 'DeviceIOControl-Error',0);
exit;
end;
StartingVCN := IntToStr(OutBuffer.StartingVcn.LowPart) +
IntToStr(OutBuffer.StartingVcn.HighPart) +
IntToStr(OutBuffer.StartingVcn.QuadPart);
LocalFree(Integer(OutBuffer));
CloseHandle(hFile);
WriteLn('Starting VCN of '+ FileName +': ' + StartingVCN);
end;
end;
Mein Problem: Ich bekomme immer die Meldung, dass der übergebene Datenbereich für die Rückgabe zu klein sei.
Meine Frage: Ist der Code überhaupt brauchbar? Und wenn ja: Wie kann ich berechnen wie groß der Buffer sein muss?