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


Перенос драйвера из UMDF 1 в UMDF 2

В этом разделе описывается перенос драйвера User-Mode Driver Framework (UMDF) 1 в UMDF 2. Вы можете начать с драйвера UMDF 1, использующего файлы Sources/Dirs (не проект Visual Studio), или преобразовать драйвер UMDF 1, содержащийся в проекте Visual Studio. Результатом будет проект драйвера UMDF 2 в Visual Studio. Драйверы UMDF 2 работают в Windows 10 для классических выпусков (Home, Pro, Enterprise и Education) и Windows 10 Mobile.

Пример драйвера Echo — это пример драйвера, перенесенного из UMDF 1 в UMDF 2.

Начало работы

Чтобы начать, откройте новый проект драйвера в Visual Studio. Выберите шаблон Visual C++->драйвер Windows->WDF->драйвер пользовательского режима (UMDF 2). Visual Studio открывает частично заполненный шаблон, включающий заглушки для функций обратного вызова, которые должен реализовать драйвер. Этот новый проект драйвера будет основой драйвера UMDF 2. Используйте пример UMDF 2 Echo в качестве руководства по типу кода, который необходимо представить.

Затем просмотрите существующий код драйвера UMDF 1 и определите сопоставления объектов. Каждый COM-объект в UMDF 1 имеет соответствующий объект WDF в UMDF 2. Например, интерфейс IWDFDevice сопоставляется с объектом устройства WDF, который представлен дескриптором WDFDEVICE. Практически все предоставляемые платформой методы интерфейса в UMDF 1 имеют соответствующие методы в UMDF 2. Например, IWDFDevice::GetDefaultIoQueue сопоставляется с WdfDeviceGetDefaultQueue.

Аналогичным образом функции обратного вызова, предоставляемые драйвером, имеют эквиваленты в двух версиях. В UMDF 1 соглашение об именовании для интерфейсов, предоставляемых драйвером (за исключением IDriverEntry), — это IObjectCallbackXxx. В то время как в UMDF 2 соглашение об именовании для подпрограмм драйвера — EvtObjectXxx. Например, метод обратного вызова IDriverEntry::OnDeviceAdd сопоставляется с EvtDriverDeviceAdd.

Драйвер реализует функции обратного вызова как в UMDF 1, так и в 2, но способ, которым драйвер предоставляет указатели на обратные вызовы, отличается. В UMDF 1 драйвер реализует методы обратного вызова в качестве членов интерфейсов, предоставляемых драйвером. Драйвер регистрирует эти интерфейсы в платформе при создании объектов платформы, например путем вызова IWDFDriver::CreateDevice.

В UMDF 2 драйвер предоставляет указатели на функции обратного вызова, предоставляемые драйвером, в таких структурах конфигурации, как WDF_DRIVER_CONFIG и WDF_IO_QUEUE_CONFIG.

Управление временем существования объекта

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

В UMDF 2 каждый объект платформы имеет родительский объект по умолчанию. При удалении родительского объекта платформа удаляет связанные дочерние объекты. Когда драйвер вызывает метод создания объектов, например WdfDeviceCreate, он может принять родительский элемент по умолчанию или указать настраиваемый родительский элемент в структуре WDF_OBJECT_ATTRIBUTES. Список объектов платформы и их родительских объектов по умолчанию см. в сводке объектов Платформы.

Инициализация драйвера

Драйвер UMDF 1 реализует интерфейс IDriverEntry. В методе обратного вызова IDriverEntry::OnDeviceAdd драйвер обычно:

  • Создает и инициализирует экземпляр объекта обратного вызова устройства.
  • Создает новый объект устройства платформы путем вызова IWDFDriver::CreateDevice.
  • Настраивает очереди устройства и соответствующие объекты обратного вызова.
  • Создает экземпляр класса интерфейса устройства путем вызова IWDFDevice::CreateDeviceInterface.

Драйвер UMDF 2 реализует DriverEntry и EvtDriverDeviceAdd. В своей подпрограмме DriverEntry драйвер UMDF 2 обычно вызывает WDF_DRIVER_CONFIG_INIT для инициализации структуры WDF_DRIVER_CONFIG драйвера. Затем она передает эту структуру в WdfDriverCreate.

В функции EvtDriverDeviceAdd драйвер может выполнить некоторые из следующих действий:

Установка драйвера

При создании проекта драйвера в Visual Studio новый проект содержит inx-файл. При сборке драйвера Visual Studio компилирует inx-файл в INF-файл, который можно использовать в составе пакета драйвера.

Хотя INF-файл для драйвера UMDF 1 должен содержать идентификатор класса драйвера, ДрайверCLSID не требуется в INF-файле для драйвера UMDF 2.

Кроме того, хотя драйвер UMDF 1 должен ссылаться на соустановщик в своем INF-файле, в INF-файле UMDF 2 ссылка на соустановщик не требуется. Хотя ссылка на коинсталлер может появиться в INF-файле для драйвера UMDF 2, она не обязательна.

Хранение контекста устройства

В UMDF 1 драйвер обычно хранит контекст устройства в созданном драйвером объекте обратного вызова, например путем указания частных членов класса объекта обратного вызова устройства. Кроме того, драйвер UMDF 1 может вызывать метод IWDFObject::AssignContext для регистрации контекста в объекте платформы.

В UMDF 2 платформа выделяет пространство контекста на основе необязательной структуры WDF_OBJECT_ATTRIBUTES, которую драйвер предоставляет при вызове метода создания объекта. После вызова метода создания объекта драйвер может вызывать WdfObjectAllocateContext один или несколько раз, чтобы выделить дополнительное пространство контекста для определенного объекта. Для этапов, которые должен использовать драйвер UMDF 2 для определения структуры контекста и метода доступа, см. раздел Пространство контекста объекта Framework.

Отладка драйвера

Для отладки драйвера UMDF 2 вы будете использовать расширения в Wdfkd.dll вместо Wudfext.dll. Дополнительные сведения о расширениях в Wudfext.dllсм. в сводке расширений отладчика в Wdfkd.dll.

В UMDF 2 вы также можете получить дополнительные сведения об отладке драйвера с помощью Inflight Trace Recorder (IFR), как описано в Использование Inflight Trace Recorder в драйверах KMDF и UMDF 2. Кроме того, вы можете использовать собственный рекордер полета (IFR). См. использование средства ведения журнала событий фреймворка.

начало работы с UMDF

пространство контекста объекта Framework

История версий UMDF

объекты платформы