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


Включение и отключение экземпляра интерфейса устройства

После успешного запуска устройства драйвер, который зарегистрировал интерфейс, вызывает IoSetDeviceInterfaceState , чтобы включить экземпляр интерфейса. Драйвер передает имя символьной ссылки, возвращенное IoRegisterDeviceInterface , вместе с логическим значением TRUE , чтобы включить экземпляр интерфейса.

Если драйвер может успешно запустить свое устройство, он должен вызвать эту подпрограмму при обработке запроса IRP_MN_START_DEVICE диспетчера Plug and Play (PnP).

После выполнения запроса IRP_MN_START_DEVICE диспетчер PnP отправляет уведомления о поступлении интерфейса устройства любым компонентам режима ядра или пользовательского режима, которые их запросили. Дополнительные сведения см. в разделе Регистрация для уведомления об изменении интерфейса устройства.

Чтобы отключить экземпляр интерфейса устройства, драйвер вызывает IoSetDeviceInterfaceState, передавая символы SymbolicLinkName , возвращенные IoRegisterDeviceInterface и FALSE , в качестве значения Enable.

Драйвер должен отключить интерфейсы устройства при обработке запроса IRP_MN_SURPRISE_REMOVAL или IRP_MN_REMOVE_DEVICE для устройства. Если драйвер не отключает интерфейсы устройства при обработке этих irP, он не должен впоследствии пытаться сделать это, так как диспетчер PnP отключит интерфейсы при удалении устройства.

Драйвер не должен отключать интерфейсы при остановке устройства (IRP_MN_STOP_DEVICE); Вместо этого он должен оставить все интерфейсы устройств включенными и ставить запросы ввода-вывода в очередь, пока не получит другой запрос IRP_MN_START_DEVICE . Аналогичным образом драйвер не должен отключать свои интерфейсы, когда устройство находится в спящем режиме. Он должен ставить в очередь запросы ввода-вывода до тех пор, пока устройство не выснется. Дополнительные сведения см. в разделе Поддержка устройств с Wake-Up возможностями.