Написание процедур диспетчеризации IRP

Примечание

Для оптимальной надежности и производительности используйте драйверы минифильтров файловой системы с поддержкой диспетчера фильтров вместо устаревших драйверов фильтров файловой системы. Сведения о переносе устаревшего драйвера в драйвер минифильтра см. в статье Рекомендации по переносу устаревших драйверов фильтров.

Драйверы фильтров файловой системы используют подпрограммы диспетчеризации, аналогичные тем, которые используются в драйверах устройств. Подпрограмма диспетчеризации обрабатывает один или несколько типов irP. ( Тип IRP определяется его основным кодом функции.) Подпрограмма DriverEntry драйвера регистрирует точки входа подпрограммы отправки, сохраняя их в таблице диспетчеризации объекта драйвера. Когда IRP отправляется драйверу, подсистема ввода-вывода вызывает соответствующую подпрограмму диспетчеризации на основе кода основной функции IRP.

Каждая подпрограмма отправки IRP определяется следующим образом:

NTSTATUS
(*PDRIVER_DISPATCH) (
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

Подпрограммы диспетчеризации драйвера фильтра файловой системы чаще всего вызываются на PASSIVE_LEVEL IRQL в контексте потока, который был источником запроса ввода-вывода, который обычно является потоком приложения в пользовательском режиме. Но это правило имеет некоторые исключения. Например, ошибки страниц приводят к вызову подпрограмм диспетчеризации чтения и записи на APC_LEVEL IRQL. Эти исключения приведены в таблице в разделе Диспетчеризация подпрограммы IRQL и контекста потока. К сожалению, в настоящее время невозможно запретить драйверам в цепочке фильтров вызывать IoCallDriver в IRQL > PASSIVE_LEVEL (например, не выпустив спин-блокировку или быстрый мьютекс). Тем не менее настоятельно рекомендуется, чтобы процедуры диспетчеризации фильтров всегда вызывали IoCallDriver в том же IRQL, в котором они были вызваны.

Подпрограммы диспетчеризации можно сделать доступными на страницы при условии, что они соответствуют критериям, описанным в разделе Создание драйверов для страничных страниц руководства по архитектуре Kernel-Mode драйверов.

Если драйвер фильтра файловой системы имеет объект устройства управления (CDO), его подпрограммы диспетчеризации должны иметь возможность обнаруживать и обрабатывать случаи, когда целевым объектом устройства IRP является CDO, а не объект устройства тома (VDO) для подключенного тома. Дополнительные сведения о CDO см. в разделе Объект управляющего устройства драйвера фильтра.

В этом разделе рассматриваются следующие темы:

Завершение IRP

Передача IRP вниз в драйверы Lower-Level

Возврат состояния из подпрограмм диспетчеризации

Пример. Передача IRP без настройки процедуры завершения

Ограничения подпрограмм диспетчеризации

Подпрограмма диспетчеризации IRQL и контекст потока