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


Включение и отключение инстанции интерфейса устройства

После успешного запуска устройства драйвер, зарегистрировавший интерфейс, вызывает функцию 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".