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

Большинство подпрограмм диспетчеризации драйверов вызываются в произвольном контексте потока в 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.

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