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


Рекомендации по написанию подпрограмм обратного вызова уведомлений PnP

Диспетчер PnP вызывает подпрограммы обратного вызова уведомлений в IRQL = PASSIVE_LEVEL.

Чтобы обеспечить бесперебойную работу подсистемы PnP, подпрограмма обратного вызова уведомлений PnP должна соответствовать следующим рекомендациям:

  1. Подпрограмма обратного вызова уведомлений не должна блокироваться.

  2. Подпрограмма обратного вызова уведомлений не должна вызывать или вызывать синхронные подпрограммы, которые создают события PnP, или любые подпрограммы, которые блокируют ожидание установки или удаления устройства.

    Вызов таких подпрограмм во время обратного вызова уведомления может привести к взаимоблокировке системы.

    Например, драйвер не должен вызывать IoReportTargetDeviceChange в подпрограмме обратного вызова уведомлений. Вместо этого вызовите IoReportTargetDeviceChangeAsynchronous .

  3. Подпрограмма обратного вызова уведомлений должна возвращать успех для всех событий, которые не завершаются явным сбоем.

    Когда драйвер регистрируется для уведомления о категории событий, диспетчер PnP уведомляет драйвер обо всех событиях в этой категории, настоящем и будущем. Если драйвер возвращает состояние ошибки для событий, которые он не обрабатывает, драйвер рискует по ошибке завершить новое событие запроса.

    Драйвер правильно возвращает состояние ошибки, когда, например, драйвер не получает уведомление о запросе, чтобы наказать вето на предлагаемое событие.

  4. Подпрограмма обратного вызова уведомлений должна быть страничной.