我正在使用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
我完全忘记了第一个修复,现在记住它,现在它可以工作。
答案 0 :(得分:0)
我找到了解决方案并将其添加到问题正文中。
使用ReadFile
时必须记住的是控制参数(长度)以不跨越文件的边界。
在做FSCTL_ALLOW_EXTENDED_DASD_IO
事之前,我曾尝试将其作为修复程序,并没有帮助。但是FSCTL_ALLOW_EXTENDED_DASD_IO
事物和边界检查的组合给了我想要的结果 - 我可以读到最后的字节。