2017-06-07 7 views
0

ボリューム(論理ドライブ)をReadFileで読み取っています。最後の512バイト(ReadFileが成功しましたが、0バイトが読み込まれました)を読み込もうとする問題があったため、FSCTL_ALLOW_EXTENDED_DASD_IOのコードでDeviceIoControを使用しています。 。残念ながらReadFileは呼び出されてから呼び出されません。DeviceIoControlが呼び出されます。FSCTL_ALLOW_EXTENDED_DASD_IOの後、ボリューム上のReadFileがERROR_INVALID_PARAMETERで失敗する

HANDLE fd; 
    DWORD junk; 
    int lenToBeRead = 0x1000; 
    DWORD nread; 
    char* alignedBuf = new char[lenToBeRead]; 

    fd = CreateFile("path to volume", FILE_READ_DATA, 
     FILE_SHARE_READ | FILE_SHARE_WRITE, 
     NULL, OPEN_EXISTING, 0, NULL)) //success 

    DeviceIoControl(fd, FSCTL_ALLOW_EXTENDED_DASD_IO, 
     NULL, 0, NULL, 0, &junk, (LPOVERLAPPED) NULL) //success 

    ReadFile(fd, alignedBuf, (DWORD) lenToBeRead, &nread, NULL) 
    // fails with 0x57 code, ERROR_INVALID_PARAMETER 

FDハンドルを持つすべての作業が同期している: のコードでは、この(すべての成功チェックは簡略化のために省略されている)のように見えます。

EDIT。私はこの問題を解決しました。私は最後のバイトを読み込もうとしていました。だから私の音量は長さがL = 0x...200で、位置はpos = L - 0x200です。私がReadFileがすべてのバイトをEOFに読み込むことが保証されていないことがわかったので、FSCTL_ALLOW_EXTENDED_DASD_IOの事を行う前に何をしましたか?残りのスペースに収まるようにlenToBeReadをカットしました(0x1000なら0x200に変わります) lenToBeReadの場合は、現在のハンドル位置から残っているバイト数を超えています。これは助けにならなかった、ReadFileはまだ成功して戻って0バイトを読んでいた。その修正を削除してFSCTL_ALLOW_EXTENDED_DASD_IOを使用したところ、ReadFileERROR_INVALID_PARAMETERで失敗し、lenToBeRead = 0x1000になりました。私は最初の修正を完全に忘れて、今思い出しています。

+0

'ERROR_INVALID_PARAMETER'は、読み込みを試みる' lenToBeRead'やファイルオフセットが無効であるため、すべてが速くなります。このデータは表示されません – RbMm

+0

あなたが読もうとしているセクタは実際に存在していますか?論理ボリュームではなく物理ドライブから同じセクタを読み取ろうとするとどうなりますか? –

+0

@RbMmそれだった。残りのスペースに収まるように 'lenToBeRead'をカットするのを忘れました。このデータを追加するために質問を編集しました。ありがとうございました。 – lyosha

答えて

0

解決策が見つかりました。問題の本文に追加しました。 ReadFileで作業するときに考慮すべき点は、引数(長さ)をファイルの境界を超えないように制御することです。 私はFSCTL_ALLOW_EXTENDED_DASD_IOのことをする前に修正してみましたが、それは助けになりませんでした。しかし、FSCTL_ALLOW_EXTENDED_DASD_IOのものと境界チェックの組み合わせは、私が望む結果をもたらしました - 私はその最後のバイトを読むことができました。

関連する問題