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


Подпрограммы отправки и IRQLs

Большинство диспетчерских процедур драйверов вызываются в произвольном контексте потока при IRQL = PASSIVE_LEVEL, со следующими исключениями:

  • Все подпрограммы отправки драйвера высокого уровня вызываются в контексте потока, который вызвал запрос ввода-вывода, который обычно является потоком приложения в пользовательском режиме.

    Другими словами, подпрограммы диспетчеризации драйверов файловой системы и другие драйверы верхнего уровня вызываются в контексте недетерминированного потока на уровне IRQL, равном PASSIVE_LEVEL.

  • Подпрограммы DispatchRead, DispatchWrite и DispatchDeviceControl для драйверов устройств низкого уровня и промежуточных драйверов, расположенные поверх них в системном пути страничного обмена, можно вызывать в IRQL = APC_LEVEL и в произвольном контексте потока.

    Подпрограммы DispatchRead и/или DispatchWrite , а также любая другая подпрограмма, которая также обрабатывает запросы на чтение и /или запись в таких устройствах с наименьшим уровнем или промежуточным драйвером, должны быть резидентами в любое время. Эти подпрограммы драйверов не могут быть пагинируемыми и не могут быть частью раздела образа драйвера; они не должны обращаться к пагинируемой памяти. Кроме того, они не должны зависеть от каких-либо блокирующих вызовов (например, KeWaitForSingleObject с ненулевым временем ожидания).

  • Подпрограмму DispatchPower драйверов в пути гибернации и/или разбиения на страницы можно вызывать на уровне IRQL = DISPATCH_LEVEL. Подпрограммы DispatchPnP таких драйверов должны быть подготовлены для обработки запросов PnP IRP_MN_DEVICE_USAGE_NOTIFICATION .

  • Процедура DispatchPower драйверов, которые требуют впускной мощности при запуске, может вызываться на IRQL = DISPATCH_LEVEL.

  • Подпрограммы DispatchPower, DispatchRead, DispatchWrite, DispatchDeviceControl и DispatchInternalDeviceControl можно вызывать в IRQL <= DISPATCH_LEVEL.

Дополнительные сведения см. в разделе "Управление приоритетами оборудования".