Написание процедур диспетчеризации 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 вниз в драйверы Lower-Level
Возврат состояния из подпрограмм диспетчеризации
Пример. Передача IRP без настройки процедуры завершения
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по