Понимание, когда выдаются IRPs на удаление

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

схема, иллюстрирующая типичные переходы irp.

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

  1. Удалить запрос

    Диспетчер 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 для устройства, которое не запущено. Это может произойти, если пользователь запрашивает динамическое удаление устройства, которое физически присутствует на компьютере, но отключено.

  2. Удаление после успешного запроса

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

    Драйверы должны выполнить этот запрос. Драйверы для устройства выполняют любую необходимую очистку, отсоединяются от стека устройств и удаляются FDO и все фильтры DO. Родительский драйвер шины сохраняет PDO, пока пользователь физически не удаляет устройство с компьютера.

    Обратите внимание, что драйверы могут получать IRP_MN_STOP_DEVICE перед удалением IRP, но это не обязательно. В Windows 2000 и более поздних версий IRP_MN_STOP_DEVICE используется только для приостановки устройства для перебалансирования ресурсов; Это не шаг к удалению. Если пользователь извлекает аппаратное обеспечение устройства во время остановки устройства, диспетчер PnP отправляет IRP удаления через некоторое время после IRP остановки, но остановка не является предварительным условием для удаления.

  3. Переиндексация устройства

    Если устройство повторно переопределяется после удаления драйверами их объектов устройств, диспетчер PnP вызывает подпрограммы AddDevice драйверов и инициирует IRP_MN_START_DEVICE для повторной активации устройства. (См. также состояния устройства на рисунке перспективы PnP .)

  4. Отменить удаление запроса

    Диспетчер PnP выдает IRP_MN_CANCEL_REMOVE_DEVICE для отмены запроса на удаление устройства.

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

  5. Неожиданное удаление (Windows 2000 и более поздних версий Windows)

    В системах Windows 2000 и более поздних версий, если пользователь отключает устройство с компьютера, не используя программу отмены установки или извлечения оборудования, диспетчер PnP отправляет IRP_MN_SURPRISE_REMOVAL IRP.

    Это называется "непредвиденное удаление", так как водители не получают предварительного предупреждения.

    В ответ на IRP типа IRP_MN_SURPRISE_REMOVAL драйверы устройства завершают все незавершённые операции ввода-вывода с ошибкой и освобождают аппаратные ресурсы, используемые устройством. Драйверы должны убедиться, что никакие компоненты не пытаются получить доступ к устройству, так как они больше не присутствуют.

    Все драйверы должны обрабатывать IRP_MN_SURPRISE_REMOVAL IRP и должны задать состояние STATUS_SUCCESS.

    Невозможно отменить IRP_MN_SURPRISE_REMOVAL.

  6. Удаление после внезапного удаления (Windows 2000 и более поздние версии Windows)

    Когда все открытые дескрипторы устройства закрыты, диспетчер PnP отправляет IRP_MN_REMOVE_DEVICE запрос драйверам для устройства. Каждый драйвер отсоединяется от стека устройства и удаляет его объект устройства.

  7. Неожиданное удаление (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).

  8. Удаление после сбоя запуска (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 драйвера.