Может ли NtReadFile () произвести короткое чтение без достижения eof? - PullRequest
0 голосов
/ 17 июня 2020

Я тестировал функцию NtReadFile() на моем Win7 против тома NTFS и заметил, что в следующем коде (дескриптор был открыт с флагом 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 утверждает короткие чтения невозможны:

NtReadFile ... завершает операцию чтения под одно из следующих условий:

  • Буфер заполнен, так как было прочитано количество байтов, указанное параметром Length. Следовательно, данные в буфер нельзя помещать без переполнения.
  • Достигнут конец файла во время операции чтения, поэтому в файле больше нет данных для передачи в буфер.

... и я хотел бы избежать ненужного звонка NtReadFile. С другой стороны, мой опыт подсказывает, что никогда нельзя доверять Microsoft на 100%.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...