NtReadFile()是否可以在不达到eof的情况下产生简短的读取?

时间:2020-06-17 20:41:32

标签: winapi driver windows-kernel nt-native-api

我正在针对NTFS卷在Win7上测试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_FILE io.Information包含原始垃圾,并且(似乎)在该调用中未读取任何数据。

因此,我可以假设r == STATUS_SUCCESSio.Information < buf_size是否已到达文件结尾?还是应该继续调用NtReadFile直到返回STATUS_END_OF_FILE? (即可以进行短读)。

一方面,Microsoft claims不可能进行短读:

NtReadFile ...在下列情况之一下终止读取操作:

  • 缓冲区已满,因为已经读取了由Length参数指定的字节数。因此,没有更多数据不能放入缓冲区而不会发生溢出。
  • 在读取操作期间到达文件末尾,因此文件中没有更多数据要传输到缓冲区中。

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

0 个答案:

没有答案
相关问题