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

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

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

  1. Убедитесь, что устройство приостановлено.

    Если драйвер не полностью приостанавливал устройство в ответ на запрос IRP_MN_QUERY_STOP_DEVICE , он должен сделать это сейчас. Задайте флаг HOLD_NEW_REQUESTS в расширении устройства и выполните другие необходимые операции для приостановки устройства.

    Устройство может потерять мощность во время операции перебалансации ресурсов и, таким образом, может потерять состояние устройства. Драйверы для устройства должны сохранять сведения о состоянии устройства и восстанавливать его при получении последующего запроса IRP_MN_START_DEVICE .

  2. Освободите аппаратные ресурсы устройства.

    В функциональном драйвере точные операции зависят от устройства и драйвера, но могут включать отключение прерывания с помощью IoDisconnectInterrupt, освобождение физических адресных диапазонов с помощью MmUnmapIoSpace и освобождение портов ввода-вывода.

    Если драйвер фильтра или шины приобрел какие-либо аппаратные ресурсы для устройства, этот драйвер должен освободить ресурсы в ответ на запрос IRP_MN_STOP_DEVICE .

  3. Задайте значение Irp->IoStatus.Status на STATUS_SUCCESS.

  4. Передайте этот IRP следующему нижнему драйверу или завершите выполнение IRP.

    • В функции или драйвере-фильтре установите следующее расположение стека с помощью IoSkipCurrentIrpStackLocation, передайте IRP в следующий нижележащий драйвер с помощью IoCallDriver, и верните состояние из IoCallDriver в качестве состояния возврата процедуры DispatchPnP. Не завершайте IRP.

    • В драйвере шины завершите IRP с помощью IoCompleteRequest с IO_NO_INCREMENT и вернитесь из процедуры DispatchPnP.

Хотя устройство остановлено для перебалансировки ресурсов, драйвер не может запускать какие-либо IRPs, которые обращаются к устройству. Драйвер должен ставить такие IRP в очередь, как описано в разделе "Хранение входящих IRP при приостановке устройства", или завершать их с ошибкой, если драйвер не реализует очередь хранения IRP, и не должен удалять запросы ввода-вывода.