Общие сведения о том, когда выдаются команды удаления irp
На следующем рисунке показана типичная последовательность irP, участвующих в удалении драйверов для устройства.
Следующие примечания соответствуют обведенным числам на предыдущем рисунке:
Удаление запроса
Диспетчер PnP выдает IRP_MN_QUERY_REMOVE_DEVICE , чтобы спросить, можно ли удалить устройство без прерывания работы компьютера. Он также отправляет этот IRP, когда пользователь запрашивает обновление драйверов для устройства и (в Windows 2000 и более поздних версиях), когда диспетчер устройств отключает устройство. (В Windows 98/Me диспетчер PnP отправляет остановку IRP в этой ситуации. Дополнительные сведения см. в статье Остановка устройства .)
Если все драйверы в стеке устройств возвращают STATUS_SUCCESS, драйверы переводят устройство в состояние ожидания удаления. В этом состоянии драйверы не должны запускать какие-либо операции, препятствующие удалению устройства.
В этом случае удаления "чистого" диспетчер PnP отправляет запрос на удаление IRP, прежде чем он отправляет IRP удаления. Описание удаления "сюрприза" см. в шаге 5.
Хотя это не показано на приведенной выше схеме, водитель автобуса может получить IRP_MN_QUERY_REMOVE_DEVICE для устройства, которое не запущено. Это может произойти, если пользователь запросит динамическое удаление устройства, которое физически присутствует на компьютере, но отключено.
Удалить после успешного запроса
Диспетчер PnP выдает IRP_MN_REMOVE_DEVICE для удаления драйверов для устройства.
Драйверы должны выполнить этот запрос. Драйверы для устройства выполняют необходимую очистку, отсоединяются от стека устройств и удаляют FDO и все DOS фильтра. Родительский драйвер шины сохраняет PDO до тех пор, пока пользователь физически не удалит устройство с компьютера.
Обратите внимание, что драйверы могут получить IRP_MN_STOP_DEVICE до удаления IRP, но это необязательно. В Windows 2000 и более поздних версиях IRP_MN_STOP_DEVICE используется только для приостановки устройства для перебалансирования ресурсов; это не шаг к удалению. Если пользователь удаляет оборудование устройства во время остановки устройства, диспетчер PnP отправляет IRP удаления в какой-то момент после остановки IRP, но остановка не является обязательным условием для удаления.
Повторная регистрация устройства
Если устройство повторно возвращается после удаления драйверов своих объектов устройства, диспетчер PnP вызывает процедуры AddDevice драйверов и выдает IRP_MN_START_DEVICE для восстановления устройства. (См. также состояния устройств на рисунке перспектива PnP .)
Отмена удаления запроса
Диспетчер PnP выдает IRP_MN_CANCEL_REMOVE_DEVICE для отмены запроса на удаление запроса.
В ответ на IRP_MN_CANCEL_REMOVE_DEVICE драйверы возвращают устройство в запущенное состояние.
Неожиданное удаление (Windows 2000 и более поздние версии Windows)
В windows 2000 и более поздних версиях, если пользователь отключает устройство от компьютера без использования программы Отсоединить или Извлечь оборудование, диспетчер PnP отправляет IRP_MN_SURPRISE_REMOVAL IRP.
Этот случай называется удалением "сюрприза", так как водители не получают предварительного предупреждения.
В ответ на IRP_MN_SURPRISE_REMOVAL IRP драйверы устройства завершаются сбоем всех незавершенных операций ввода-вывода и освобождают аппаратные ресурсы, используемые устройством. Драйверы должны гарантировать, что никакие компоненты не пытаются получить доступ к устройству, так как оно больше отсутствует.
Все драйверы должны обрабатывать IRP_MN_SURPRISE_REMOVAL IRP и устанавливать состояние STATUS_SUCCESS.
Отменить IRP_MN_SURPRISE_REMOVAL нельзя.
Удалить после неожиданного удаления (Windows 2000 и более поздние версии Windows)
При закрытии всех открытых дескрипторов устройства диспетчер PnP отправляет IRP_MN_REMOVE_DEVICE запрос драйверам устройства. Каждый драйвер отсоединяется от стека устройств и удаляет свой объект устройства.
Неожиданное удаление (Windows 98/Me)
В Windows 98/Me драйвер не получает IRP_MN_SURPRISE_REMOVAL при удалении устройства без предупреждения. Диспетчер PnP отправляет только IRP_MN_REMOVE_DEVICE. Драйверы WDM должны иметь код для обработки IRP_MN_SURPRISE_REMOVAL за которым следует IRP_MN_REMOVE_DEVICE (поведение Windows 2000 и более поздних версий для неожиданного удаления) и IRP_MN_REMOVE_DEVICE без предварительного IRP для неожиданного удаления (поведение Windows 98/Me).
Удаление после неудачного запуска (Windows 2000 и более поздних версий)
Если один из драйверов для устройства завершается сбоем IRP_MN_START_DEVICE, диспетчер PnP отправляет IRP_MN_REMOVE_DEVICE запрос в стек устройств. Такое удаление IRP гарантирует, что все драйверы устройства будут уведомлены о том, что устройство не было успешно запущено. В ответ на IRP_MN_REMOVE_DEVICE IRP драйверы устройства отменяют операции запуска (если они успешно запускают IRP) и отменяют операции AddDevice . Диспетчер PnP помечает такое устройство как "неудачный запуск".
Это поведение применяется только к платформам Windows 2000 и более поздних версий. В Windows 98/Me диспетчер PnP отправляет IRP_MN_STOP_DEVICE в ответ на сбой запуска.
Драйвер для устройства PnP может получить IRP_MN_SURPRISE_REMOVAL в большем случае, чем в тех ситуациях, которые показаны на рисунке, иллюстрируя типичные переходы удаления IRP. Например, пользователь может вставить карточку КОМПЬЮТЕРА в компьютер, а затем удалить ее перед запуском устройства. В этом случае менеджер PnP выдает неожиданное удаление IRP после вызова процедур AddDevice драйверов, но перед выдачей запроса IRP_MN_START_DEVICE . Драйвер для устройства PnP должен быть готов к удалению IRP в любое время после вызова процедуры AddDevice драйвера.