Нахождение последнего кластера файла

Я пытаюсь найти последний кластер целевого файла и прочитать двоичные данные из него. Я начал с 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, чтобы помочь мне найти последний кластер файла?

1

Решение

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 поддерживать разреженные файлы.

2

Другие решения


По вопросам рекламы [email protected]