Обработка запроса 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 с помощью следующей процедуры:
Отложите перезапуск устройства до тех пор, пока более низкие драйверы не завершат операции перезапуска. (См. раздел Перенос обработки PnP IRP до завершения работы с более низкими драйверами.)
После завершения работы с более низкими драйверами верните устройство в запущенное состояние.
Точные операции зависят от устройства и драйвера.
Запустите IRP в очереди хранения IRP.
Если драйвер держал запросы, пока устройство находилось в состоянии ожидания остановки, снимите флаг HOLD_NEW_REQUESTS и запустите IRP в очереди IRP-удержания. Дополнительные сведения см. в разделе Удержание входящих irP при приостановке устройства .
Завершите 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 . Когда устройство запущено и активно, драйверы могут успешно выполнять фиктивные запросы на отмену и остановку для устройства.