Пакеты запросов ввода-вывода
Большинство запросов, отправляемых драйверам устройств, упаковываются в пакеты запросов ввода-вывода (IRP). Компонент операционной системы или драйвер отправляет IRP драйверу, вызвав IoCallDriver, который имеет два параметра: указатель на DEVICE_OBJECT и указатель на IRP. DEVICE_OBJECT имеет указатель на связанный DRIVER_OBJECT. Когда компонент вызывает IoCallDriver, мы говорим, что компонент отправляет IRP в объект устройства или отправляет IRP драйверу, связанному с объектом устройства. Иногда мы используем фразу, которая передает IRP или пересылает IRP вместо отправки IRP.
Обычно IRP обрабатывается несколькими драйверами, расположенными в стеке. Каждый драйвер в стеке связан с объектом устройства. Дополнительные сведения см. в разделе "Узлы устройств" и стеки устройств. При обработке Стеком устройств IRP IRP обычно отправляется в верхний объект устройства в стеке устройств. Например, если IRP обрабатывается стеком устройств, показанным на этой схеме, IRP будет отправлен сначала в объект устройства фильтра (Filter DO) в верхней части стека устройства.
Передача IRP вниз стека устройств
Предположим, что диспетчер ввода-вывода отправляет IRP в фильтр DO на схеме. Драйвер, связанный с фильтром DO, AfterThought.sys, обрабатывает IRP, а затем передает его в функциональный объект устройства (FDO), который является следующим нижним объектом устройства в стеке устройств. Когда драйвер передает IRP следующему нижнему объекту устройства в стеке устройств, мы говорим, что драйвер передает IRP вниз стек устройства.
Некоторые irPs передаются вплоть до стека устройств в объект физического устройства (PDO). Другие irPs никогда не достигают PDO, потому что они завершены одним из драйверов над PDO.
IRPs являются автономными
Структура IRP является автономной в том смысле, что она содержит все сведения, необходимые драйверу для обработки запроса ввода-вывода. Некоторые части структуры IRP содержат сведения, общие для всех участвующих драйверов в стеке. Другие части IRP содержат сведения, относящиеся к конкретному драйверу в стеке.