Как в Delphi получить номер первого кластера из дескриптора файла в FAT32?

На вход подается директория (полный путь к файлу), на выходе получаем номер первого кластера файла в FAT32. C помощью hFile := CreateFile(PChar(FilePath), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); можно получить handle (дескриптор) файла. А как из этого дескриптора достать нужную мне информацию? В FAT32 структура дескриптора выглядит следующим образом

Мне нужно достать из него младшую (0х1A) и старшую (0х14) часть номера первого кластера. Не представляю как мне программно в делфи это сделать.

Пробовал использовать функцию GetFileInformationByHandle, но в структуре TByHandleFileInformation есть только поля .nFileIndexHigh и .nFileIndexLow, которые возвращают какие-то слишком большие числа для текстового файла на почти пустом логическом томе.


Ответы (1 шт):

Автор решения: PRODIGY

Расположение файла на диске можно получить через DeviceIoControl() с кодом FSCTL_GET_RETRIEVAL_POINTERS = 0x00090073. Детали здесь: https://learn.microsoft.com/en-us/windows/win32/api/winioctl/ni-winioctl-fsctl_get_retrieval_pointers

Драйвер вернёт вам данные через структуру RETRIEVAL_POINTERS_BUFFER с таким содержимым, где найдёте первый кластер, и счётчик последовательной цепочки кластеров. Если файл фрагментирован, то вернётся и кол-во фрагментов с их адресами. У меня структура представлена в формате ассемблера fasm, а вы смотрите по ссылке выше:

struct RETRIEVAL_POINTERS_BUFFER
   ExtentCount    dd  0       ;// кол-во элементов 'Extents' в массиве 
   StartingVcn    dq  0       ;// стартовый номер первой цепочки кластеров
  struct                 ;// <---- массив элементов 'Extents'
      NextVcn     dq  0       ;// кол-во кластеров в цепочке
      Lcn         dq  0       ;// номер первого кластера в данной цепочке
  ends
ends
→ Ссылка