1

我试图找到目标文件的最后一个集群并从中读取二进制数据。我从 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 LcnRETRIEVAL_POINTERS_BUFFER我会得到一个代表当前范围的巨大数字。我也出现了一个开关错误情况,NO_ERROR因此我假设所有集群数据都已成功读取。Lcn号怎么办才能帮我找到文件的最后一个簇?

4

1 回答 1

2

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支持稀疏文件。

于 2014-06-04T19:27:30.130 回答