Использование объектов управления устройствами

Объект управляющего устройства — это объект устройства платформы, который не поддерживает Plug and Play (PnP) или операции управления питанием. Драйверы могут использовать управляющие объекты устройств для представления виртуальных устройств только программного обеспечения или устаревших аппаратных устройств (то есть устройств, которые не предоставляют возможности PnP или управления питанием).

Драйвер, создающий объект управляющего устройства, также обычно создает символьную ссылку для объекта устройства. Приложения могут отправлять запросы ввода-вывода объекту управляющего устройства, передавая символьное имя ссылки элементу API, например функции CreateFile Microsoft Win32.

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

Использование объектов управляющих устройств

Устройства управления используются двумя типичными способами:

  1. Драйвер фильтра для устройства PnP, если драйвер поддерживает набор пользовательских кодов управления вводом-выводом для приложений.

    Если приложение попыталось отправить пользовательские коды элементов управления вводом-выводом в верхнюю часть стека драйверов (например, используя символьное имя ссылки интерфейса устройства), драйвер над драйвером фильтра может завершить запрос ввода-вывода, если драйвер не распознает пользовательские коды элементов управления вводом-выводом. Чтобы избежать этой проблемы, драйвер фильтра может создать объект управляющего устройства. Приложения могут использовать символьное имя ссылки объекта устройства управления для отправки кодов элементов ввода-вывода непосредственно в драйвер фильтра.

    (Обратите внимание, что лучший способ избежать проблемы для драйвера фильтра — выступать в качестве водителя автобуса и перечислять дочерние устройства, работающие в необработанном режиме. Другими словами, для каждого устройства, которое поддерживает драйвер фильтра, драйвер может создать объект физического устройства (PDO), для которых не требуется драйвер функции. Драйвер вызывает WdfPdoInitAssignRawDevice и WdfDeviceInitAssignName для каждого из этих устройств, и приложение может идентифицировать устройство по имени при отправке пользовательского кода элемента управления ввода-вывода.)

  2. Драйвер для устройства, не поддерживающего PnP.

    Такой драйвер должен использовать управляющие объекты устройства, так как объекты устройств для таких устройств не находятся в стеке устройств и не предоставляют возможности PnP. Дополнительные сведения о поддержке устройств, отличных от PnP, см. в статье Использование платформы Kernel-Mode Driver Framework с драйверами, не использующими PnP.

Создание объекта управляющего устройства

Чтобы создать объект управляющего устройства, драйвер должен:

  1. Вызовите WdfControlDeviceInitAllocate , чтобы получить структуру WDFDEVICE_INIT .

  2. При необходимости вызывайте методы инициализации объектов, чтобы инициализировать структуру WDFDEVICE_INIT. Драйвер может вызывать только следующие методы инициализации:

  3. Вызовите WdfDeviceCreate, который использует содержимое структуры WDFDEVICE_INIT для создания объекта устройства платформы.

  4. Выполните следующие операции инициализации:

  5. Вызовите WdfControlFinishInitializing.

Правила использования объектов управляющих устройств

Драйверы, создающие объекты управляющих устройств, должны соответствовать следующим правилам:

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

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

  • Драйверы могут создавать очереди ввода-вывода и регистрировать обработчики запросов для очередей, но платформа не позволяет управлять очередями с питанием.

  • Драйверы могут создавать объекты файлов для объектов управляющих устройств.

Именование объекта управляющего устройства

Все объекты управляющих устройств должны иметь имена. Как правило, драйвер вызывает WdfDeviceInitAssignName , чтобы назначить имя устройства, а затем вызывает WdfDeviceCreateSymbolicLink , чтобы создать символьное имя ссылки, которое приложения могут использовать для доступа к объекту.

Если драйвер не вызывает WdfDeviceInitAssignName для назначения имени устройства, платформа автоматически создает имя для управляющих устройств, но драйвер не может вызвать WdfDeviceCreateSymbolicLink.

Драйвер может вызвать WdfDeviceInitSetDeviceClass , чтобы указать класс настройки устройства для устройства управления. Класс установки устройства определяет раздел реестра, содержащий предоставленные администратором сведения об устройствах, принадлежащих классу установки. Дополнительные сведения о вызове WdfDeviceInitSetDeviceClass см. в разделе Управление доступом устройств в драйверах Framework-Based.

Получение уведомления о завершении работы системы

Так как объекты управляющих устройств не поддерживают PnP, драйвер не может регистрировать функции обратного вызова, которые информируют драйвер при изменении состояния питания устройства. Однако драйвер может вызвать WdfControlDeviceInitSetShutdownNotification для регистрации функции обратного вызова EvtDeviceShutdownNotification . Эта функция обратного вызова сообщает драйверу о том, что система вот-вот потеряет свою мощность.

Удаление объекта управляющего устройства

Некоторым драйверам необходимо удалить объекты управляющих устройств перед выгрузкой драйвера следующим образом:

  • Если драйвер создает объекты управляющих устройств (которые не поддерживают PnP или управление питанием), а драйвер также создает объекты устройств платформы, поддерживающие PnP и управление питанием, драйвер должен в конечном итоге вызвать WdfObjectDelete по адресу IRQL = PASSIVE_LEVEL, чтобы удалить объекты управляющего устройства.

    Если драйвер создает объекты устройств обоих типов, операционная система не сможет выгрузить драйвер, пока драйвер не удалит объекты управляющего устройства.

    Однако драйвер не должен удалять объекты управляющего устройства до тех пор, пока платформа не удалит другие объекты устройства. Чтобы определить, когда платформа удалила другие объекты устройства, драйвер должен предоставить функции EvtCleanupCallback для этих объектов.

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

    В этом случае платформа удаляет объекты управляющих устройств после возврата функции обратного вызова EvtDriverUnload драйвера.