0

我在我的 Win7 上针对 NTFS 卷测试NtReadFile()功能,并注意到在以下代码中(句柄是用FILE_SYNCHRONOUS_IO_NONALERT标志打开的):

IO_STATUS_BLOCK io;
NTSTATUS r = NtReadFile(h, NULL, NULL, NULL, &io, buf, buf_size, &pos, NULL);

io.Information(应该包含接收的字节数)仅在r == STATUS_SUCCESS. 如果r == STATUS_END_OF_FILEio.Information 包含原始垃圾并且(似乎)在该调用中没有读取数据。

r == STATUS_SUCCESS那么,我可以假设io.Information < buf_size我们是否已经到达文件末尾?还是我应该一直打电话NtReadFile直到它回来STATUS_END_OF_FILE?(即短读是可能的)。

一方面,微软声称短读是不可能的:

NtReadFile ... 在下列条件之一下终止读取操作:

  • 缓冲区已满,因为已读取 Length 参数指定的字节数。因此,在没有溢出的情况下,不能再将数据放入缓冲区。
  • 在读取操作期间到达文件末尾,因此文件中没有更多数据要传输到缓冲区中。

...我想避免不必要的NtReadFile电话。另一方面,我的经验表明永远不要 100% 相信微软。

4

0 回答 0