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


Использование интерфейса устройства

Интерфейсы устройств доступны как для компонентов режима ядра, так и для приложений в пользовательском режиме. Код пользовательского режима может использовать функции CfgMgr32 (например, CM_Get_Device_Interface_List) или функции SetupDiXxx (см. раздел Функции интерфейса устройства SetupDi) для получения сведений о зарегистрированных включенных интерфейсах устройств. Затем приложение пользовательского режима может использовать API-интерфейсы ввода-вывода, такие как CreateFile , чтобы получить дескриптор для устройства, чтобы отправить ему ввод-вывод. Чтобы получать уведомления о включении и отключении интерфейсов устройств, а также о том, как реагировать на эти действия, см. раздел Регистрация для получения уведомлений о прибытии интерфейса устройства и удалении устройства.

Прежде чем компонент режима ядра сможет использовать определенное устройство или файловый объект, он должен выполнить следующие действия.

  1. Определите, зарегистрирован и включен ли требуемый класс интерфейса устройства.

    Драйвер может зарегистрироваться в диспетчере PnP, чтобы получать уведомления о включении или отключении экземпляра интерфейса устройства. Для регистрации компонент вызывает IoRegisterPlugPlayNotification. Эта подпрограмма сохраняет адрес обратного вызова, предоставленного драйвером, который вызывается всякий раз, когда экземпляр интерфейса устройства включен или отключен, для указанного класса устройства. Подпрограммы обратного вызова получают структуру DEVICE_INTERFACE_CHANGE_NOTIFICATION , которая содержит строку Юникода, представляющую символьную ссылку экземпляра интерфейса. Дополнительные сведения см. в разделе Использование уведомления об изменении интерфейса устройства PnP .

    Драйвер или другой компонент режима ядра также может вызвать IoGetDeviceInterfaces , чтобы получить список всех зарегистрированных экземпляров включенных интерфейсов устройств для определенного класса интерфейса устройства. Возвращенный список содержит указатели на символьные строки ссылок Юникода, которые идентифицируют экземпляры интерфейса устройства.

  2. Получение указателя на устройство или файловый объект, соответствующий экземпляру интерфейса.

    Чтобы получить доступ к определенному объекту устройства, драйвер должен вызвать IoGetDeviceObjectPointer, передав строку Юникода для требуемого интерфейса в параметре ObjectName . Чтобы получить доступ к объекту файла, драйвер должен вызвать InitializeObjectAttributes, передав строку Юникода в параметре ObjectName , а затем передать успешно инициализированную структуру атрибута в вызове ZwCreateFile.