我正在针对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_SUCCESS
和io.Information < buf_size
是否已到达文件结尾?还是应该继续调用NtReadFile
直到返回STATUS_END_OF_FILE
? (即可以进行短读)。
一方面,Microsoft claims不可能进行短读:
NtReadFile ...在下列情况之一下终止读取操作:
- 缓冲区已满,因为已经读取了由Length参数指定的字节数。因此,没有更多数据不能放入缓冲区而不会发生溢出。
- 在读取操作期间到达文件末尾,因此文件中没有更多数据要传输到缓冲区中。
...,我想避免不必要的NtReadFile
通话。另一方面,我的经验表明,永远不要相信Microsoft 100%。