04.10.2011, 18:01
|
Прохожий
|
|
Регистрация: 04.10.2011
Сообщения: 28
Репутация: 1351
|
|
Исходник - Анализ физического размещения файла на диске
Функция возвращает номер первого кластера первого фрагмента заданного файла. Номера кластеров остальных фрагментов выводятся через OutputDebugString().
Код:
const
FSCTL_GET_RETRIEVAL_POINTERS = $90073;
type
TExt = packed record
NextVcn: LARGE_INTEGER;
Lcn: LARGE_INTEGER;
end;
PRETRIEVAL_POINTERS_BUFFER = ^_RETRIEVAL_POINTERS_BUFFER;
_RETRIEVAL_POINTERS_BUFFER = packed record
ExtentCount: DWORD;
StartingVcn: TLargeInteger;
Extents: array [0..0] of TExt;
end;
_STARTING_VCN_INPUT_BUFFER = packed record
StartingVcn: TLargeInteger;
end;
function FileAllocation(AFileName:string):cardinal;
var Handle : THandle;
i,cbBytesReturned : cardinal;
ok : boolean;
iBuf : _STARTING_VCN_INPUT_BUFFER;
oBuf : array of byte;
ppointers : PRETRIEVAL_POINTERS_BUFFER;
begin
Result:=0;
Handle := CreateFile (PChar(AFileName),0,FILE_SHARE_READ or FILE_SHARE_WRITE,
nil,OPEN_EXISTING,0,0);
if (Handle=INVALID_HANDLE_VALUE) then exit;
try
iBuf.StartingVcn := 0;
SetLength(oBuf,16*1024);
ok := DeviceIoControl (
Handle,
FSCTL_GET_RETRIEVAL_POINTERS,
@iBuf, sizeof(iBuf),
@oBuf[0], length(oBuf),
cbBytesReturned,
nil
);
if ok then begin
ppointers:=@oBuf[0];
// Возвращаем номер первого кластера файла
Result := ppointers.Extents[0].Lcn.HighPart;
// Выводим номера кластеров всех фрагментов файла
OutputDebugString(PChar('File: '+AFileName));
for i:=0 to ppointers.ExtentCount-1 do with ppointers.Extents[i] do begin
OutputDebugString(PChar(Format('VCN: %.8X %.8X LCN: %.8X %.8X',[NextVcn.HighPart,NextVcn.LowPart,Lcn.HighPart,Lcn.LowPart])));
Result := Lcn.QuadPart;
end;
end
finally
CloseHandle(Handle);
end;
end;
Ради наглядности, в пример сознательно не включена обработка ошибок.
|