在FSCTL_ALLOW_EXTENDED_DASD_IO

时间:2017-06-07 18:10:55

标签: winapi readfile

我正在使用ReadFile读取音量(逻辑驱动器)。我正在使用带有DeviceIoContro代码的FSCTL_ALLOW_EXTENDED_DASD_IO l,因为我希望能够访问所有(包括最后一个)字节并且在尝试读取最后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句柄的所有工作都是同步的。

EDIT。我解决了这个问题。我试图读取最后的字节。所以我的音量长度L = 0x...200,我处理了位置pos = L - 0x200。在我做FSCTL_ALLOW_EXTENDED_DASD_IO事之前我做了什么 - 我切lenToBeRead以适应剩余空间(因此,如果它是0x1000,它将变为0x200),因为我发现{{1}如果ReadFile大于当前句柄位置剩余的字节数,则不保证读取EOF的所有字节。这没有帮助,lenToBeRead仍然成功返回,0字节读取。我删除了该修复程序,然后使用ReadFile,然后FSCTL_ALLOW_EXTENDED_DASD_IO ReadFile ERROR_INVALID_PARAMETER lenToBeRead $.ajax({ url: baseUrl, type: "post", contentType: "application/json", dataType: "json", success: function (data) { window.location = ('http://localhost:9000/#/home.html?' + (data.search)) }, data: JSON.stringify(body), }); return false; } }; %7B%22clientName%22:%blah%22,%22em%22:%22mLigDACsBihAL2RETse06351MuCNehZQ%22,%22partnercode%22:%blah%22%7D 我完全忘记了第一个修复,现在记住它,现在它可以工作。

1 个答案:

答案 0 :(得分:0)

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