Как в 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 шт):
Расположение файла на диске можно получить через 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