Остановка устройства для повторной балансировки ресурсов

На следующем рисунке показана последовательность поставщиков интеграции, участвующих в остановке и перезапуске устройства для перераспределения ресурсов.

схема, иллюстрирующая остановку устройства для перераспределения ресурсов.

Следующие примечания соответствуют обведенным числам на предыдущем рисунке:

  1. Диспетчер PnP выдает IRP_MN_QUERY_STOP_DEVICE , чтобы спросить, могут ли драйверы устройства остановить устройство и освободить его аппаратные ресурсы.

    Если все драйверы в стеке устройств возвращают STATUS_SUCCESS, драйверы переводят устройство в состояние (ожидание остановки), из которого устройство можно быстро остановить.

    Если стек устройств возвращает что-либо, кроме STATUS_SUCCESS, он не будет участвовать в процессе перераспределения. Так как перебалансирование ресурсов — это наиболее трудоемкое действие, в этом случае система по-прежнему пытается выполнить операцию перебалансирования для удовлетворения требований к ресурсам устройств в системе. Однако если устройства не останавливают запросы, может оказаться невозможным достичь требуемых результатов (например, если новое устройство перечислено и активирует повторную балансировку, оно может не получить необходимые ресурсы, что в конечном итоге не удастся запустить).

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

    Диспетчер PnP запрашивает столько стеков устройств, сколько необходимо для перераспределения необходимых ресурсов.

  2. Диспетчер PnP выдает IRP_MN_STOP_DEVICE для остановки устройства.

    В Windows 2000 и более поздних версиях Windows диспетчер PnP отправляет stop IRP только в том случае, если предыдущий IRP с остановкой запроса для устройства успешно завершен. В ответ на остановку IRP драйверы освобождают аппаратные ресурсы устройства (например, порты ввода-вывода) и удерживают все irP, которым требуется доступ к устройству.

  3. После успешной перебалансировки ресурсов диспетчер PnP выдает IRP_MN_START_DEVICE запросы на перезапуск всех устройств, которые были остановлены во время повторной балансировки.

  4. В противном случае диспетчер PnP отменяет запрос, отправляя IRP_MN_CANCEL_STOP_DEVICE.

    В ответ на IRP_MN_CANCEL_STOP_DEVICE драйверы устройства возвращают устройство в запущенное состояние и возобновляют обработку запросов ввода-вывода для устройства.

    Диспетчер PnP отменяет остановку запроса для стека устройств, если один драйвер в стеке не выполнил запрос или если произошел сбой общей операции балансировки и он отменяет все свои запросы на остановку запроса. Когда диспетчер PnP отменяет остановку запроса только на одном стеке устройств, он отправляет запрос IRP_MN_CANCEL_STOP_DEVICE , так как все драйверы, подключенные над драйвером, который не выполнил запрос, имеют устройство в состоянии ожидания остановки. После успешного выполнения IRP_MN_CANCEL_STOP_DEVICE драйверы возвращают устройство в запущенное состояние.

  5. Если драйверу не удается перезагрузить устройство после перебалансировки ресурсов, диспетчер PnP отправляет irp удаления в стек устройств (в Windows 2000 и более поздних версиях Windows).

    Диспетчер PnP сначала отправляет запрос IRP_MN_SURPRISE_REMOVAL . Затем он отправляет запрос IRP_MN_REMOVE_DEVICE , но только после закрытия всех открытых дескрипторов на устройстве.

Перебалансирование аппаратных ресурсов устройства PnP должно быть прозрачным для приложений и конечных пользователей. Пользователи могут столкнуться с временной задержкой в работе, но данные не должны быть потеряны. Это необходимо учитывать при обработке останова IRP.