首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >卷上的ReadFile在FSCTL_ALLOW_EXTENDED_DASD_IO之后与ERROR_INVALID_PARAMETER一起失败

卷上的ReadFile在FSCTL_ALLOW_EXTENDED_DASD_IO之后与ERROR_INVALID_PARAMETER一起失败
EN

Stack Overflow用户
提问于 2017-06-07 18:10:55
回答 1查看 490关注 0票数 0

我正在用ReadFile阅读一个卷(逻辑驱动器)。我将DeviceIoControl与FSCTL_ALLOW_EXTENDED_DASD_IO代码一起使用,因为我希望能够访问所有字节(包括最后一个字节),并且有一个问题试图读取最后512个字节(ReadFile成功了,但是报告了0字节读取),并看到了使用它的建议。不幸的是,ReadFileDeviceIoControl调用之后无法被调用。在代码中,如下所示(为了简洁起见,省略了所有成功检查):

代码语言:javascript
运行
复制
    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,它提供给我的是ReadFilelenToBeRead = 0x1000上的ERROR_INVALID_PARAMETER失败。我完全忘记了第一次修复,并记得现在和现在,它的工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-08 11:40:08

我找到了解决方案,并将其添加到问题体中。在使用ReadFile时,需要记住的是控制参数(长度),而不是跨越文件的边界。在做FSCTL_ALLOW_EXTENDED_DASD_IO之前,我试过把它作为一个修复程序,但它没有帮助。但是FSCTL_ALLOW_EXTENDED_DASD_IO和边界检查的结合给了我想要的结果--我可以读取最后的字节。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44419943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档