将驱动程序从 UMDF 1 移植到 UMDF 2

本主题介绍如何将 User-Mode Driver Framework (UMDF) 1 驱动程序移植到 UMDF 2。 可以从使用源/Dirs 文件的 UMDF 1 驱动程序开始, (不是 Visual Studio 项目) ,也可以转换包含在 Visual Studio 项目中的 UMDF 1 驱动程序。 结果将是 Visual Studio 中的 UMDF 2 驱动程序项目。 UMDF 2 驱动程序在桌面版Windows 10上运行, (家庭版、专业版、企业版和教育版) 和Windows 10 移动版。

Echo 驱动程序示例是从 UMDF 1 移植到 UMDF 2 的驱动程序示例。

入门

若要开始,请在 Visual Studio 中打开一个新的驱动程序项目。 选择 Visual C++->Windows Driver-WDF-User>> Mode Driver (UMDF 2) 模板。 Visual Studio 将打开一个部分填充的模板,其中包含驱动程序必须实现的回调函数的存根。 此新驱动程序项目将成为 UMDF 2 驱动程序的基础。 使用 UMDF 2 Echo 示例作为应引入的代码类型的指南。

接下来,查看现有的 UMDF 1 驱动程序代码并确定对象映射。 UMDF 1 中的每个 COM 对象在 UMDF 2 中都有相应的 WDF 对象。 例如, IWDFDevice 接口映射到 WDF 设备对象,该对象由 WDFDEVICE 句柄表示。 UMDF 1 中几乎所有框架提供的接口方法在 UMDF 2 中都有相应的方法。 例如, IWDFDevice::GetDefaultIoQueue 映射到 WdfDeviceGetDefaultQueue

同样,驱动程序提供的回调函数在两个版本中具有等效项。 在 UMDF 1 中,驱动程序提供的接口的命名约定 (IDriverEntry) 除外是 I对象回调Xxx,而在 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 结构中指定自定义父级。 有关框架对象及其默认父对象的列表,请参阅 Framework 对象的摘要

驱动程序初始化

UMDF 1 驱动程序实现 IDriverEntry 接口。 在其 IDriverEntry::OnDeviceAdd 回调方法中,驱动程序通常:

UMDF 2 驱动程序实现 DriverEntryEvtDriverDeviceAdd。 在其 DriverEntry 例程中,UMDF 2 驱动程序通常调用 WDF_DRIVER_CONFIG_INIT 来初始化驱动程序 的 WDF_DRIVER_CONFIG 结构。 然后,它将此结构传递给 WdfDriverCreate

在其 EvtDriverDeviceAdd 函数中,驱动程序可能会执行以下操作:

安装驱动程序

在 Visual Studio 中创建新的驱动程序项目时,新项目包含一个 .inx 文件。 生成驱动程序时,Visual Studio 将 .inx 文件编译为可用作驱动程序包一部分的 INF 文件。

虽然 UMDF 1 驱动程序的 INF 文件必须包含驱动程序类 ID,但 UMDF 2 驱动程序的 INF 文件中不需要 DriverCLSID。

此外,尽管 UMDF 1 驱动程序必须在其 INF 文件中引用共同安装程序,但 UMDF 2 INF 文件中不需要 constaller 引用。 尽管 UMDF 2 驱动程序的 INF 文件中可以显示 cointaller 引用,但不需要一个。

存储设备上下文

在 UMDF 1 中,驱动程序通常将设备上下文存储在驱动程序创建的回调对象中,例如通过指定设备回调对象类的私有成员。 或者,UMDF 1 驱动程序可以调用 IWDFObject::AssignContext 方法在框架对象上注册上下文。

在 UMDF 2 中,框架根据驱动程序在调用对象创建方法时提供的可选 WDF_OBJECT_ATTRIBUTES 结构分配上下文空间。 调用对象的 create 方法后,驱动程序可以调用 WdfObjectAllocateContext 一次或多次,以向特定对象分配额外的上下文空间。 有关 UMDF 2 驱动程序在定义上下文结构和访问器方法时应使用的步骤,请参阅 Framework 对象上下文空间

调试驱动程序

若要调试 UMDF 2 驱动程序,请使用 Wdfkd.dll 中的扩展,而不是Wudfext.dll。 有关 Wudfext.dll 中的扩展的详细信息,请参阅 Wdfkd.dll中的调试器扩展摘要

在 UMDF 2 中,还可以通过机上跟踪记录器 (IFR) 获取其他驱动程序调试信息,如 在 KMDF 和 UMDF 2 驱动程序中使用机上跟踪记录器中所述。 此外,可以使用框架自己的 未完成记录器 (IFR) 。 请参阅 使用框架的事件日志器

UMDF 入门

框架对象上下文空间

UMDF 版本历史记录

框架对象