我正在用ReadFile
阅读一个卷(逻辑驱动器)。我将DeviceIoContro
l与FSCTL_ALLOW_EXTENDED_DASD_IO
代码一起使用,因为我希望能够访问所有字节(包括最后一个字节),并且有一个问题试图读取最后512个字节(ReadFile
成功了,但是报告了0字节读取),并看到了使用它的建议。不幸的是,ReadFile
在DeviceIoControl
调用之后无法被调用。在代码中,如下所示(为了简洁起见,省略了所有成功检查):
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句柄的所有工作都是同步的。
编辑。我解决了问题。我在试着读最后几个字节。因此,我的音量是长度的L = 0x...200
,我有我的处理位置pos = L - 0x200
。我在做FSCTL_ALLOW_EXTENDED_DASD_IO
之前所做的事情--我剪切了lenToBeRead
以适应剩余的空间(所以,如果它是0x1000,它将更改为0x200),因为我发现ReadFile
没有保证在lenToBeRead
大于当前句柄位置的剩余字节的情况下,将所有字节读入EOF。这于事无补,ReadFile
仍在成功返回并读取0字节。我删除了这个修复程序,然后使用了FSCTL_ALLOW_EXTENDED_DASD_IO
,它提供给我的是ReadFile
在lenToBeRead
= 0x1000上的ERROR_INVALID_PARAMETER
失败。我完全忘记了第一次修复,并记得现在和现在,它的工作。
发布于 2017-06-08 11:40:08
我找到了解决方案,并将其添加到问题体中。在使用ReadFile
时,需要记住的是控制参数(长度),而不是跨越文件的边界。在做FSCTL_ALLOW_EXTENDED_DASD_IO
之前,我试过把它作为一个修复程序,但它没有帮助。但是FSCTL_ALLOW_EXTENDED_DASD_IO
和边界检查的结合给了我想要的结果--我可以读取最后的字节。
https://stackoverflow.com/questions/44419943
复制相似问题