Я пытаюсь найти последний кластер целевого файла и прочитать двоичные данные из него. Я начал с CreateFile () и использовал этот результат в DeviceIoControl () с управляющим кодом FSCTL_GET_RETRIEVAL_POINTERS.
hfile = CreateFile(result,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
RETRIEVAL_POINTERS_BUFFER retrievalBuffer;
const DWORD Clusters = 1000;
const DWORD rpBufferSize = sizeof(RETRIEVAL_POINTERS_BUFFER) + (2 * (Clusters - 1) *sizeof(LARGE_INTEGER));
BYTE output[rpBufferSize];
STARTING_VCN_INPUT_BUFFER startVcn;
startVcn.StartingVcn.QuadPart = 0;
returns = DeviceIoControl(hfile,
FSCTL_GET_RETRIEVAL_POINTERS,
&startVcn,
sizeof(startVcn),
&output,
sizeof(output),
&bytesReturned,
NULL);
Так что я не знаю, что делать дальше. Если я покажу LARGE_INTEGER Lcn
от RETRIEVAL_POINTERS_BUFFER
Я получаю огромное количество, которое представляет текущую степень. У меня также есть случай ошибки коммутатора, который появляется как NO_ERROR
поэтому я предполагаю, что все данные кластера были прочитаны успешно. Что я могу сделать, какой номер Lcn, чтобы помочь мне найти последний кластер файла?
retrievalBuffer
должен быть указатель:
RETRIEVAL_POINTERS_BUFFER *retrievalBuffer = (RETRIEVAL_POINTERS_BUFFER *) output;
Таким образом, последняя степень начинается в
DWORD lastExtentN = retrievalBuffer->ExtentCount - 1;
LARGE_INTEGER extentLcn = retrievalBuffer->Extents[ lastExtentN ].Lcn;
Размер экстента
LARGE_INTEGER extentClusters = retrievalBuffer->Extents[ lastExtentN ].NextVcn
- lastExtentN ? retrievalBuffer->Extents[ lastExtentN - 1 ].NextVcn
: retrievalBuffer->StartingVcn;
Таким образом, последний номер логического кластера (LCN) файла:
LARGE_INTEGER lastLcn = extentLcn + extentClusters - 1;
Теперь вы можете открыть логический том, используя CreateFile()
и читать этот кластер, используя ReadFile()
ПРИМЕЧАНИЕ: вам нужно проверить extentLcn
против -1
поддерживать разреженные файлы.