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


Удаление устройства через драйвер шины

При удалении дочернего устройства (дочернего PDO) драйвер родительской шины должен отменить все операции, выполняемые для добавления и запуска устройства.

Драйвер шины удаляет дочернее устройство с помощью следующей процедуры в подпрограмме DispatchPnP:

  1. Обрабатывает ли драйвер предыдущий запрос IRP_MN_SURPRISE_REMOVAL для этого PDO?

    Если это так, выполните любую оставшуюся очистку и перейдите к шагу 4.

    Драйвер обычно содержит флаг в расширении устройства, который указывает, обрабатывал ли драйвер запрос IRP_MN_SURPRISE_REMOVAL для устройства.

  2. Выполните все запросы в очереди драйвера.

  3. Удалите питание с устройства, если драйвер шины способен сделать это, и уведомите диспетчер питания, вызвав PoSetPowerState.

    Водитель автобуса выключает подключенное устройство, если это возможно, и уведомляет менеджера питания об изменении его состояния питания. Водитель шины выполняет это в ответ на запрос IRP_MN_REMOVE_DEVICE; владелец политики управления питанием устройства не отправляет запрос IRP_MN_SET_POWER при удалении устройства. Дополнительные сведения см. в разделе Управление питанием.

  4. Если драйвер шины сообщил об этом устройстве в последнем ответе на запрос IRP_MN_QUERY_DEVICE_RELATIONS для BusRelations, устройство по-прежнему физически присутствует на компьютере. В этом случае водитель автобуса:

    • Удерживает PDO для устройства до тех пор, пока оно не будет физически удалено.

    • Задает для Irp-IoStatus.Status> значение STATUS_SUCCESS.

    • Завершает IRP с помощью IoCompleteRequest.

    • Возвращается из подпрограммы DispatchPnP .

    Драйвер шины должен продолжать отчитываться об этом устройстве в последующих перечислениях (IRP_MN_QUERY_DEVICE_RELATIONS для BusRelations), пока устройство не будет физически удалено. Диспетчер PnP отслеживает, было ли добавлено и запущено перечисленное устройство.

  5. Если устройство не было включено в последний ответ драйвера шины на запрос IRP_MN_QUERY_DEVICE_RELATIONS для BusRelations, драйвер шины считает устройство физически удалённым из системы. В этом случае водитель автобуса выполняет следующее:

    • Очищает выделения, относящиеся к устройству, память, события и т. д.

    • Задает для Irp-IoStatus.Status> значение STATUS_SUCCESS.

    • Завершает IRP с помощью IoCompleteRequest.

    • Освобождает PDO при помощи IoDeleteDevice.

      Драйвер шины должен удалить PDO, если драйвер опустил устройство из своего последнего списка BusRelations . Если пользователь снова подключает устройство к компьютеру, драйвер шины должен создать новый PDO в ответ на следующий запрос BusRelations . Если драйвер шины повторно использует тот же PDO для нового экземпляра устройства, оно не будет работать должным образом.

    • Возвращается из функции DispatchPnP.

Если устройство по-прежнему присутствует, когда диспетчер PnP отправляет запрос IRP_MN_REMOVE_DEVICE , драйвер шины сохраняет PDO. Если в более позднее время устройство будет физически удалено из шины, диспетчер PnP отправляет еще один IRP_MN_REMOVE_DEVICE. После получения последующего удаления IRP драйвер шины удаляет PDO для устройства.

Водитель шины должен иметь возможность обрабатывать IRP_MN_REMOVE_DEVICE для устройства, которое уже удалено и чей PDO помечен для удаления. В ответ на такой IRP драйвер шины может выполнить IRP успешно или вернуть STATUS_NO_SUCH_DEVICE. PDO для устройства в данном случае еще не удален, несмотря на предыдущий вызов драйвера шины в IoDeleteDevice, поскольку какой-то компонент все еще имеет ссылку на объект. Таким образом, драйвер шины может получить доступ к PDO во время обработки второго IRP на удаление. Водитель автобуса не должен вызывать IoDeleteDevice во второй раз для PDO; Система ввода-вывода удаляет PDO, когда его число ссылок достигает нуля.

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