ReadFile在读取PhysicalDrive的末尾不会发出EOF信号。

4
我正在尝试在Windows中实现一个与dd相当的功能。[澄清:我试图复制dd的if = /dev/hda of = /dev/hdb功能,以便将Windows安装迁移到更大的硬盘上。令人惊讶的是,我已经成功地使用了这种方法几次。-G]
程序可以工作(源数据被复制到目标磁盘),但不会自动终止-我必须在确定整个源磁盘已被读取后才能使用tskill终止程序。
我没有问题使用“\\.\PhysicalDriveX”语法在CreateFile调用中打开和锁定源和目标物理驱动器。
我的问题在于成功检测源驱动器数据的末尾。
目前,我正在使用以下方式读取32K块:
// doesn't work - won't detect End-of-valid drive data and reads endlessly
while (( success = ReadFile(hInfile, buffer, BUFSIZE, &nRead, NULL )) && nRead != 0) {
    // ... write the data to the target drive; break if it fails.
    // ... write a progress indicator to the console
}

// should execute but never does
if (! success) {
    // an error occurred, do cleanup.
}
else {
    // all done, unlock & close filehandles
    puts("ta da!");
}

当进行同步 io 时,对于“普通”文件的 EOF 是由 ReadFile 返回 TRUE,但将读取的字节数(nRead)设置为 0 来表示的。这就是我在我的 while() 语句中尝试的。

一旦 ReadFile 已经读取了源 PhysicalDrive 上有效数据的结尾,它似乎会返回一系列空字节块。

如何知道何时停止阅读? - 我应该在开始之前使用 IOCTL_DISK_GET_LENGTH_INFO 吗? 这似乎有点多余,因为 ReadFile 应该在读取磁盘结尾后报告 EOF(或失败)。

提前感谢您。

1个回答

1
根据MSDN的说法,您需要使用GetLastError来检查ERROR_HANDLE_EOF。也许这会有所帮助。虽然在这种情况下它也应该返回0。

1
嗯,我对此不太确定。根据SDK文档,只有在ReadFile返回FALSE时才需要调用GetLastError,并且仅在执行OVERLAPPED IO时才需要检测EOF。我的ReadFile调用的最后一个参数是空指针;我正在执行同步IO。 - Gerard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接