ボリューム(論理ドライブ)を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
を使用したところ、ReadFile
はERROR_INVALID_PARAMETER
で失敗し、lenToBeRead
= 0x1000になりました。私は最初の修正を完全に忘れて、今思い出しています。
'ERROR_INVALID_PARAMETER'は、読み込みを試みる' lenToBeRead'やファイルオフセットが無効であるため、すべてが速くなります。このデータは表示されません – RbMm
あなたが読もうとしているセクタは実際に存在していますか?論理ボリュームではなく物理ドライブから同じセクタを読み取ろうとするとどうなりますか? –
@RbMmそれだった。残りのスペースに収まるように 'lenToBeRead'をカットするのを忘れました。このデータを追加するために質問を編集しました。ありがとうございました。 – lyosha