Остановка устройства для повторной балансировки ресурсов
На следующем рисунке показана последовательность поставщиков интеграции, участвующих в остановке и перезапуске устройства для перераспределения ресурсов.
Следующие примечания соответствуют обведенным числам на предыдущем рисунке:
Диспетчер PnP выдает IRP_MN_QUERY_STOP_DEVICE , чтобы спросить, могут ли драйверы устройства остановить устройство и освободить его аппаратные ресурсы.
Если все драйверы в стеке устройств возвращают STATUS_SUCCESS, драйверы переводят устройство в состояние (ожидание остановки), из которого устройство можно быстро остановить.
Если стек устройств возвращает что-либо, кроме STATUS_SUCCESS, он не будет участвовать в процессе перераспределения. Так как перебалансирование ресурсов — это наиболее трудоемкое действие, в этом случае система по-прежнему пытается выполнить операцию перебалансирования для удовлетворения требований к ресурсам устройств в системе. Однако если устройства не останавливают запросы, может оказаться невозможным достичь требуемых результатов (например, если новое устройство перечислено и активирует повторную балансировку, оно может не получить необходимые ресурсы, что в конечном итоге не удастся запустить).
Устройство, которое не выполняет операцию остановки запроса, по-прежнему находится в рабочем состоянии, даже если остановка запроса завершается сбоем.
Диспетчер PnP запрашивает столько стеков устройств, сколько необходимо для перераспределения необходимых ресурсов.
Диспетчер PnP выдает IRP_MN_STOP_DEVICE для остановки устройства.
В Windows 2000 и более поздних версиях Windows диспетчер PnP отправляет stop IRP только в том случае, если предыдущий IRP с остановкой запроса для устройства успешно завершен. В ответ на остановку IRP драйверы освобождают аппаратные ресурсы устройства (например, порты ввода-вывода) и удерживают все irP, которым требуется доступ к устройству.
После успешной перебалансировки ресурсов диспетчер PnP выдает IRP_MN_START_DEVICE запросы на перезапуск всех устройств, которые были остановлены во время повторной балансировки.
В противном случае диспетчер PnP отменяет запрос, отправляя IRP_MN_CANCEL_STOP_DEVICE.
В ответ на IRP_MN_CANCEL_STOP_DEVICE драйверы устройства возвращают устройство в запущенное состояние и возобновляют обработку запросов ввода-вывода для устройства.
Диспетчер PnP отменяет остановку запроса для стека устройств, если один драйвер в стеке не выполнил запрос или если произошел сбой общей операции балансировки и он отменяет все свои запросы на остановку запроса. Когда диспетчер PnP отменяет остановку запроса только на одном стеке устройств, он отправляет запрос IRP_MN_CANCEL_STOP_DEVICE , так как все драйверы, подключенные над драйвером, который не выполнил запрос, имеют устройство в состоянии ожидания остановки. После успешного выполнения IRP_MN_CANCEL_STOP_DEVICE драйверы возвращают устройство в запущенное состояние.
Если драйверу не удается перезагрузить устройство после перебалансировки ресурсов, диспетчер PnP отправляет irp удаления в стек устройств (в Windows 2000 и более поздних версиях Windows).
Диспетчер PnP сначала отправляет запрос IRP_MN_SURPRISE_REMOVAL . Затем он отправляет запрос IRP_MN_REMOVE_DEVICE , но только после закрытия всех открытых дескрипторов на устройстве.
Перебалансирование аппаратных ресурсов устройства PnP должно быть прозрачным для приложений и конечных пользователей. Пользователи могут столкнуться с временной задержкой в работе, но данные не должны быть потеряны. Это необходимо учитывать при обработке останова IRP.