Использование процедур IoCompletion
Драйверы более высокого уровня, которые отслеживают на основе IRP, как драйверы более низкого уровня выполняют определенные запросы, могут иметь одну или несколько подпрограмм IoCompletion . Драйверы более высокого уровня, которые выделяют IRP для отправки запросов к более низким драйверам, должны иметь подпрограмму IoCompletion .
Подпрограмма DispatchRead или DispatchWrite драйвера самого высокого или промежуточного уровня, скорее всего, устанавливает подпрограмму IoCompletion для IRP, так как драйверы более низкого уровня должны обрабатывать запросы на передачу асинхронно.
Драйвер самого низкого уровня в стеке драйверов не может зарегистрировать подпрограммы IoCompletion .
Как правило, драйверы не регистрируют подпрограммы IoCompletion для irP, связанных с синхронными операциями ввода-вывода. Например, подпрограмма DispatchDeviceControl драйвера более высокого уровня может выделить IRP с помощью IoBuildDeviceIoControlRequest. В этом случае подпрограмма диспетчеризации обычно не регистрирует подпрограмму IoCompletion , так как запросы на управление устройствами обычно обрабатываются синхронно. Вместо этого драйвер может выделить и инициализировать объект события, а его подпрограмма DispatchDeviceControl может ждать инициализации события при отправке по выделенным драйвером IRP. Как правило, драйвер более высокого уровня не регистрирует подпрограмму IoCompletion для IRP, выделенного с помощью IoBuildSynchronousFsdRequest, по той же причине.
В этом разделе рассматриваются следующие вопросы.