创建 WDF HID 微型驱动程序

本主题介绍如何使用 Windows 驱动程序框架(WDF)创建人机接口设备(HID) 微型驱动程序。

可以使用 KMDF 或 UMDF 编写 HID 微型驱动程序。 建议从 vhidmini2 微型驱动程序示例开始。 可以使用 KMDF 或 UMDF 2.x 编译此示例驱动程序。

要提供的内容

  1. 你将在 MsHidUmdf.sys (对于 UMDF)或 MsHidKmdf.sys (对于 KMDF)下编写较低筛选器驱动程序,这两个驱动程序都包含在作系统中。

  2. 下载并查看 vhidmini2 示例

  3. 从驱动程序的 EvtDriverDeviceAdd 回调函数调用 WdfFdoInitSetFilter

  4. 创建 I/O 队列,以接收类驱动程序传递给您驱动程序的 I/O 请求,这些请求由 MsHidUmdf.sysMsHidKmdf.sys 传递。

  5. 提供一个 EvtIoDeviceControl 回调函数,用于分派到各个 IOCTL 特定的方法处理程序。 查看 WDF HID 微型驱动程序 IOCTL 中所述的 IOCTL,并确保您的驱动程序能够处理与您的设备相关的 IOCTL。

  6. 对于 UMDF,如果驱动程序是由 ACPI 枚举的,可以选择启用选择性挂起。 在设备的硬件密钥中,添加 EnableDefaultIdleNotificationHandler 子项并将其设置为 1。

  7. 对于 UMDF,请在 INF 文件的 WDF 特定 DDInstall 节中设置以下 INF 指令

    • UmdfKernelModeClientPolicy 更改为 AllowKernelModeClients;这样内核模式透传驱动程序可以在堆栈中加载。
    • UmdfMethodNeitherAction 设置为 Copy,以允许 UMDF 处理 METHOD_NEITHER 类型的 IOCTL。
    • UmdfFileObjectPolicyAllowNullAndUnknownFileObjects
    • UmdfFsContextUsePolicyCanUseFsContext2

    例如:

    [hidumdf.NT.Wdf]
    UmdfKernelModeClientPolicy = AllowKernelModeClients
    UmdfMethodNeitherAction=Copy
    UmdfFileObjectPolicy=AllowNullAndUnknownFileObjects
    UmdfFsContextUsePolicy = CanUseFsContext2
    

如果要编写适用于 Windows 7 的 UMDF HID 微型驱动程序,请下载 Windows 驱动程序工具包 (WDK) 8.1 以获取 HidUmdf.sys的源代码。 然后,编写 UMDF 1.11 驱动程序,并在驱动程序包中包含 HidUmdf.sys 和 UMDF 1.11。

Architecture

HID 类驱动程序(HidClass.sys)和框架为微型驱动程序提供冲突的 WDM 调度例程来处理某些 I/O 请求(如即插即用和电源管理请求)。 因此,HID 微型驱动程序无法链接到类驱动程序和框架。 因此,Microsoft提供 MsHidUmdf.sysMsHidKmdf.sys,这些驱动程序是驻留在类驱动程序和微型驱动程序之间的 WDM 驱动程序。

MsHidUmdf.sysMsHidKmdf.sys 调用 HID 类驱动程序的 HidRegisterMinidriver 例程以注册为实际的 HID 微型驱动程序。 尽管这些驱动程序充当设备的功能驱动程序,但它们只是将类驱动程序的 I/O 请求传递到您的驱动程序(因此有时称为 直通驱动程序)。 对于 KMDF 和 UMDF,你提供的唯一组件是 HID 微型驱动程序,它是直通驱动程序下的下层过滤驱动程序。

UMDF 体系结构

展示驱动程序堆栈中 hidumdf.sys 位置的示意图。

KMDF 体系结构

显示驱动程序堆栈中 mshidkmdf.sys 位置的关系图。