Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
При удалении дочернего устройства (дочернего PDO) драйвер родительской шины должен отменить все операции, выполняемые для добавления и запуска устройства.
Драйвер шины удаляет дочернее устройство с помощью следующей процедуры в подпрограмме DispatchPnP:
Обрабатывает ли драйвер предыдущий запрос IRP_MN_SURPRISE_REMOVAL для этого PDO?
Если это так, выполните любую оставшуюся очистку и перейдите к шагу 4.
Драйвер обычно содержит флаг в расширении устройства, который указывает, обрабатывал ли драйвер запрос IRP_MN_SURPRISE_REMOVAL для устройства.
Выполните все запросы в очереди драйвера.
Удалите питание с устройства, если драйвер шины способен сделать это, и уведомите диспетчер питания, вызвав PoSetPowerState.
Водитель автобуса выключает подключенное устройство, если это возможно, и уведомляет менеджера питания об изменении его состояния питания. Водитель шины выполняет это в ответ на запрос IRP_MN_REMOVE_DEVICE; владелец политики управления питанием устройства не отправляет запрос IRP_MN_SET_POWER при удалении устройства. Дополнительные сведения см. в разделе Управление питанием.
Если драйвер шины сообщил об этом устройстве в последнем ответе на запрос IRP_MN_QUERY_DEVICE_RELATIONS для BusRelations, устройство по-прежнему физически присутствует на компьютере. В этом случае водитель автобуса:
Удерживает PDO для устройства до тех пор, пока оно не будет физически удалено.
Задает для Irp-IoStatus.Status> значение STATUS_SUCCESS.
Завершает IRP с помощью IoCompleteRequest.
Возвращается из подпрограммы DispatchPnP .
Драйвер шины должен продолжать отчитываться об этом устройстве в последующих перечислениях (IRP_MN_QUERY_DEVICE_RELATIONS для BusRelations), пока устройство не будет физически удалено. Диспетчер PnP отслеживает, было ли добавлено и запущено перечисленное устройство.
Если устройство не было включено в последний ответ драйвера шины на запрос 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.