Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Запрос IRP_MN_STOP_DEVICE сначала обрабатывается верхним драйвером в стеке устройств, а затем каждым следующим нижним драйвером. Драйвер обрабатывает остановку запросов IRP в подпрограмме DispatchPnP.
Драйвер обрабатывает запрос IRP_MN_STOP_DEVICE с помощью процедуры, например следующей:
Убедитесь, что устройство приостановлено.
Если драйвер не полностью приостанавливал устройство в ответ на запрос IRP_MN_QUERY_STOP_DEVICE , он должен сделать это сейчас. Задайте флаг HOLD_NEW_REQUESTS в расширении устройства и выполните другие необходимые операции для приостановки устройства.
Устройство может потерять мощность во время операции перебалансации ресурсов и, таким образом, может потерять состояние устройства. Драйверы для устройства должны сохранять сведения о состоянии устройства и восстанавливать его при получении последующего запроса IRP_MN_START_DEVICE .
Освободите аппаратные ресурсы устройства.
В функциональном драйвере точные операции зависят от устройства и драйвера, но могут включать отключение прерывания с помощью IoDisconnectInterrupt, освобождение физических адресных диапазонов с помощью MmUnmapIoSpace и освобождение портов ввода-вывода.
Если драйвер фильтра или шины приобрел какие-либо аппаратные ресурсы для устройства, этот драйвер должен освободить ресурсы в ответ на запрос IRP_MN_STOP_DEVICE .
Задайте значение Irp->IoStatus.Status на STATUS_SUCCESS.
Передайте этот IRP следующему нижнему драйверу или завершите выполнение IRP.
В функции или драйвере-фильтре установите следующее расположение стека с помощью IoSkipCurrentIrpStackLocation, передайте IRP в следующий нижележащий драйвер с помощью IoCallDriver, и верните состояние из IoCallDriver в качестве состояния возврата процедуры DispatchPnP. Не завершайте IRP.
В драйвере шины завершите IRP с помощью IoCompleteRequest с IO_NO_INCREMENT и вернитесь из процедуры DispatchPnP.
Хотя устройство остановлено для перебалансировки ресурсов, драйвер не может запускать какие-либо IRPs, которые обращаются к устройству. Драйвер должен ставить такие IRP в очередь, как описано в разделе "Хранение входящих IRP при приостановке устройства", или завершать их с ошибкой, если драйвер не реализует очередь хранения IRP, и не должен удалять запросы ввода-вывода.