【发布时间】:2025-12-08 02:10:03
【问题描述】:
我正在尝试使用 ReadFile 功能。这是我的代码:
#define BUFFERSIZE 5
int main(int argc, char* argv[])
{
OVERLAPPED overlapIn = {};
HANDLE tHandle;
char buf[BUFFERSIZE] = {};
DWORD lpNumberOfBytesRead;
tHandle = CreateFile(
L"\\\\.\\D:",
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (tHandle == INVALID_HANDLE_VALUE)
{
DWORD error = GetLastError();
assert(0);
}
if (ReadFile(tHandle, &buf, BUFFERSIZE - 1, &lpNumberOfBytesRead, NULL) == 0)
{
int error = GetLastError();
printf("Terminal failure: Unable to read from disk.\n GetLastError=%d\n", error);
CloseHandle(tHandle);
return 1;
}
GetLastError 函数返回代码 87,即 ERROR_INVALID_PARAMETER。
很明显,其中一个参数是错误的,但我不知道是哪一个,因为我尝试按照文档中所写的那样做所有事情。
【问题讨论】:
-
我想你在第一个
if之后得到了错误。你不能像这样简单地从驱动器号中读取。 -
不,我不知道,我说的是 ReadFile 函数。是的,我可以从这样的驱动器中读取数据。
-
BUFFERSIZE-1 错误。当您从磁盘驱动器读取原始数据时,您不能指望文件系统缓存。支持的对齐方式取决于文件系统,4096 是一个不错的整数。您还必须在 CreateFile() 调用中指定 FILE_SHARE_WRITE。当 CreateFile() 失败时,你需要发出更多的声音,assert() 不会削减它。
-
哇,原来如此,谢谢!
-
从设备读取的原始数据必须是块大小的倍数。