Поделиться через


Отдельные подпрограммы DispatchCreate и DispatchClose

Подпрограммы диспетчеризации драйвера для запросов IRP_MJ_CREATE и IRP_MJ_CLOSE могут выполнять только выполнение входного IRP с помощью STATUS_SUCCESS. Дополнительные сведения см. в разделе Завершение irP.

Подпрограммы диспетчеризации другого драйвера для запросов IRP_MJ_CREATE и IRP_MJ_CLOSE могут выполнять больше работы в зависимости от драйвера базового устройства или базового устройства. Рассмотрим следующие сценарии.

  • Получив запрос на создание, драйвер класса может инициализировать внутреннюю очередь и отправить запрос IRP_MJ_INTERNAL_DEVICE_CONTROL соответствующему драйверу порта, запрашивая сведения о конфигурации устройства или монопольный доступ к порту контроллера.

  • Получение IRP_MJ_CLOSE указывает, что последняя ссылка на файловый объект, связанный с целевым объектом устройства, была удалена. Это означает, что все дескрипторы для объекта файла были закрыты, а все невыполненные запросы ввода-вывода завершены или отменены.

  • Получив запрос на создание, драйвер редко используемого устройства может вызвать MmLockPagableCodeSection , чтобы выполнить резидентные процедуры драйвера, обрабатывающие другие запросы IRP_MJ_XXX . Получив ответный запрос на закрытие, драйвер может вызвать MmUnlockPagableImageSection , чтобы сэкономить системную память путем выгружения раздела страничного изображения при закрытии всех дескрипторов файловых объектов для объектов устройств такого драйвера.

Некоторые драйверы обрабатывают запросы IRP_MJ_CLOSE только для симметрии, так как после того, как их объекты устройств были открыты защищенной подсистемой или драйвером более высокого уровня, объекты устройств драйверов нижнего уровня не закрываются до завершения работы самой системы. Например, драйверы клавиатуры и мыши настраивают объекты устройств, представляющие физические устройства, которые должны быть функциональными во время работы системы, поэтому эти драйверы могут иметь минимальные подпрограммы DispatchClose для симметрии или могут иметь объединенные подпрограммы DispatchCreateClose .

Если устройство, управляемое драйвером более низкого уровня, должно быть доступно для продолжения работы системы, подпрограмма DispatchClose драйвера, как правило, не вызывается. Например, некоторые из драйверов системных дисков не имеют подпрограммы DispatchClose , но эти драйверы обычно имеют подпрограммы DispatchFlushBuffers и DispatchShutdown для выполнения любых невыполненных операций ввода-вывода файлов до завершения работы системы.

Хотя вы можете реализовать отдельные подпрограммы DRIVER_DISPATCH и DispatchClose , драйверы иногда имеют одну подпрограмму DispatchCreateClose для обработки запросов на создание и закрытие.