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


Обработка запроса IRP_MN_CANCEL_STOP_DEVICE (Windows 2000 и более поздних версий)

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

В ответ на запрос IRP_MN_CANCEL_STOP_DEVICE драйвер должен вернуть устройство в запущенное состояние и возобновить нормальную работу. Драйверы должны успешно выполнить IRP отмены и остановки.

Драйвер обрабатывает запрос IRP_MN_CANCEL_STOP_DEVICE с помощью следующей процедуры:

  1. Отложите перезапуск устройства до тех пор, пока более низкие драйверы не завершат операции перезапуска. (См. раздел Перенос обработки PnP IRP до завершения работы с более низкими драйверами.)

  2. После завершения работы с более низкими драйверами верните устройство в запущенное состояние.

    Точные операции зависят от устройства и драйвера.

  3. Запустите IRP в очереди хранения IRP.

    Если драйвер держал запросы, пока устройство находилось в состоянии ожидания остановки, снимите флаг HOLD_NEW_REQUESTS и запустите IRP в очереди IRP-удержания. Дополнительные сведения см. в разделе Удержание входящих irP при приостановке устройства .

  4. Завершите IRP с помощью IoCompleteRequest.

    • В драйвере функции или фильтра:

      Подпрограмма IoCompletion драйвера возвращала STATUS_MORE_PROCESSING_REQUIRED, как описано в разделе Перенос обработки IRP PnP до завершения более низких драйверов, поэтому подпрограмма DispatchPnP драйвера должна вызвать IoCompleteRequest , чтобы возобновить обработку завершения ввода-вывода.

      Драйвер устанавливает для Irp-IoStatus.Status> значение STATUS_SUCCESS, вызывает IoCompleteRequest с повышением приоритета IO_NO_INCREMENT и возвращает STATUS_SUCCESS из своей подпрограммы DispatchPnP.

      Драйверы не должны завершить эту операцию. Если драйвер не сможет перезапустить IRP, устройство находится в несогласованном состоянии и не будет работать должным образом.

    • В родительском водителе автобуса:

      Драйвер присваивает Irp-IoStatus.Status> значение STATUS_SUCCESS и вызывает IoCompleteRequest, указывая приоритет повышения IO_NO_INCREMENT. Водитель автобуса возвращает STATUS_SUCCESS из своей процедуры DispatchPnP .

      Водитель автобуса не должен завершить эту операцию. Если драйвер не сможет перезапустить IRP, устройство находится в несогласованном состоянии и не будет работать должным образом.

Драйвер может получить нечестный запрос на отмену при запуске и активности устройства. Это может произойти, например, если драйверу (или драйверу выше в стеке устройств) не удалось выполнить запрос IRP_MN_QUERY_STOP_DEVICE . Когда устройство запущено и активно, драйверы могут успешно выполнять фиктивные запросы на отмену и остановку для устройства.