Обработка запроса 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. Отложить перезапуск устройства до тех пор, пока более низкие драйверы не завершили свои операции перезапуска. (См. раздел "Отложенная обработка IRP PnP", пока не завершится завершение работы с более низкими драйверами.)

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

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

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

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

  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. Когда устройство запущено и активно, драйверы могут безопасно и успешно выполнять запросы на отмену остановки для устройства.