Будет элемент завершения ввода-вывода, поставленный в очередь для операции ввода-вывода, всякий раз, когда операция ввода-вывода может начаться.Независимо от того, возникла ошибка или нет после начала операции ввода-вывода, элемент завершения будет поставлен в очередь на порт завершения.
Существует проблема с отображением между кодами NTSTATUS
, возвращаемыми системой ввода-вывода и Win32коды ошибок, из-за которых сложно определить, какие состояния являются ошибками, а какие только информационными.NTSTATUS
, который используется ядром и собственным API, имеет четыре уровня серьезности: успех, информация, предупреждение и ошибка.Все, кроме кода ошибки, может указывать на то, что операция ввода-вывода могла начаться.Win32 имеет только одну серьезность (ERROR_*
), поэтому коды успеха, информации и предупреждения должны были отображаться вместе с кодами ошибок.
ERROR_IO_PENDING
- STATUS_PENDING
- это статус успеха ERROR_MORE_DATA
- STATUS_BUFFER_OVERFLOW
предупреждение или STATUS_MORE_ENTRIES
статус успеха
Вы можете игнорировать любые коды ошибок, которые возвращают ReadFile или WriteFile, и ожидать элемент завершения в очереди, ноопределение того, что является чем-то вроде боли.Было бы хорошо, если бы коды ошибок Win32 были лучше организованы, но Microsoft предоставляет сопоставление от NTSTATUS
до кодов ошибок Win32: http://support.microsoft.com/kb/113996. См. ntstatus.h
в SDK платформы или в вашей установке VS, чтобы определить степень серьезностиNTSTATUS
код:.
Возможно выполнение операции ввода-вывода при возврате исходного вызова API, например, запрос на чтение, который был только что скопирован из кэша (асинхронно ждать нечего).Сообщение о завершении все еще будет поставлено в очередь в таких случаях для согласованности.