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


Обработка запроса 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 .

Пока устройство останавливается для перераспределения ресурсов, драйвер не может запустить irP, которые обращаются к устройству. Драйвер должен ставить такие irP в очередь, как описано в разделе Удержание входящих irPs при приостановке устройства, или сбой, если драйвер не реализует очередь хранения IRP и не должен удалять запросы ввода-вывода.