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 Lcnから表示RETRIEVAL_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 に答える