微型驱动程序和 HID 类驱动程序

本文介绍微型驱动程序和 HID 类驱动程序。

有关详细信息,请参阅 创建 WDF HID 微型驱动程序

HID 类驱动程序的操作功能

HID 类驱动程序执行以下操作:

  • 提供和管理内核模式驱动程序和用户模式应用程序用于访问输入设备支持的 HID 集合 的上层接口。

    HID 类驱动程序以透明方式管理和路由上层驱动程序和应用程序与支持 HID 集合的基础输入设备之间的所有通信。 它管理不同输入设备和输入队列使用的不同数据协议,这些协议支持同一 HID 集合上的多个打开文件。

    HID 集合的上层接口由 HID 类驱动程序 IOCTLHIDClass 支持例程HIDClass 结构组成。

  • 通过调用微型驱动程序的标准驱动程序例程与 HID 微型驱动程序进行通信。

  • 为较低级别的总线或端口驱动程序枚举的 HIDClass 输入设备创建 (FDO) 功能设备对象。

    例如,HID 类驱动程序创建和管理 FDO 的操作,该 FDO 表示由系统提供的 USB 驱动程序堆栈枚举的 USB HID 设备。

  • 为基础输入设备支持的子设备提供总线驱动程序的功能 (HID 集合) 。

    HID 类驱动程序为输入设备支持的每个 HID 集合创建一个物理设备对象 (PDO) ,并管理集合的操作。

将微型驱动程序绑定到 HIDClass

HID 微型驱动程序通过调用 HidRegisterMinidriver 向 HID 类驱动程序注册自身,将其操作绑定到 HID 类驱动程序。 注册操作:

  • 保存入口点的副本, (指针) HID 类驱动程序的设备扩展中的 HID 微型驱动程序的标准驱动程序例程。

    HID 微型驱动程序在驱动程序对象中设置其入口点,微型驱动程序接收该入口点作为其 DRIVER_INITIALIZE 例程的输入。 HID 微型驱动程序在注册到 HID 类驱动程序之前设置这些入口点。

  • 将微型驱动程序的驱动程序对象中的入口点重置为 HID 类驱动程序提供的标准驱动程序例程的入口点。

HID 类驱动程序提供以下标准驱动程序例程:

注册过程还会为 HID mind river 设备扩展分配内存。 尽管内存由 HID 类驱动程序分配,但只有 HID 微型驱动程序使用此设备扩展。

与 HID 微型驱动程序通信

HID 类驱动程序通过调用 HID 微型驱动程序的 DRIVER_ADD_DEVICEDRIVER_UNLOAD和调度例程来与 HID 微型驱动程序通信,如下所示:

调用 AddDevice 例程

调用 HID 类驱动程序的 AddDevice 例程以 (FDO) 创建功能设备对象时,HID 类驱动程序将创建 FDO,初始化它,并调用 HID 微型驱动程序 AddDevice 例程。 HID 微型驱动程序 AddDevice 例程执行特定于设备的内部初始化,如果成功,则返回STATUS_SUCCESS。 如果 HID 微型驱动程序 AddDevice 例程不成功,HID 类驱动程序将删除 FDO 并返回 HID 微型驱动程序 AddDevice 例程返回的状态。

调用 Unload 例程

调用 HID 类驱动程序 Unload 例程时,HID 类驱动程序完成释放与 FDO 关联的所有资源,并调用 HID 微型驱动程序的 Unload 例程。

调用 Dispatch 例程

为了操作设备,HID 类驱动程序主要为内部设备控制请求调用 HID 微型驱动程序调度例程。

当 I/O 管理器将请求发送到 HID 类驱动程序时,HID 类驱动程序将处理请求,并调用 HID 微型驱动程序的相应调度例程。

HID 类驱动程序不会向 HID 微型驱动程序发送以下请求:创建、关闭或设备控制。

HID 微型驱动程序的操作

HID 传输微型驱动程序将硬件总线或输入设备连接到的端口的操作抽象化。

HID 微型驱动程序可以使用以下框架之一生成:

  • UMDF - 用户模式驱动程序框架
  • KDMF – 内核模式驱动程序框架
  • WDF - Windows 驱动程序框架
  • WDM - Windows 驱动程序模型 (旧版)

Microsoft 建议使用基于框架的解决方案 (KMDF 或 UMDF) 。 有关每个驱动程序模型的详细信息,请访问以下部分:

  • 基于 KMDF 的 HID 微型驱动程序,请参阅创建基于框架的 HID 微型驱动程序
  • 基于 UMDF 的 HID 微型驱动程序,请参阅 创建 WDF HID 微型驱动程序

以下部分讨论了如何注册基于 WDM 的 HID 微型驱动程序,但其中的大部分内容也与基于 KMDF 的框架驱动程序相关。 所有 HID 微型驱动程序都必须注册到 HID 类驱动程序,HID 类驱动程序通过调用微型驱动程序的标准驱动程序例程与微型驱动程序进行通信。

有关 HID 微型驱动程序在其标准驱动程序例程中必须支持的功能的详细信息,请参阅以下部分:

有关 HID 类驱动程序的详细信息,请参阅 HID 微型驱动程序的操作

注册 HID 微型驱动程序

HID 微型驱动程序在其 DRIVER_INITIALIZE 例程中完成所有其他驱动程序初始化后,HID 微型驱动程序通过调用 HidRegisterMinidriver 将其操作绑定到 HID 类驱动程序。

当 HID 微型驱动程序注册到 HID 类驱动程序时,它使用 HID_MINIDRIVER_REGISTRATION 结构。 结构指定:

  • HID 修订版
  • HID 微型驱动程序驱动程序对象
  • HID 微型驱动程序设备扩展的大小
  • 是否轮询设备

HID 微型驱动程序扩展

HID 微型驱动程序设备扩展特定于设备,仅供 HID 微型驱动程序使用。 当类驱动程序为功能设备对象创建其设备扩展时,HID 类驱动程序为微型驱动程序设备扩展分配内存 (FDO) 。 HID 微型驱动程序在向 HID 类驱动程序注册微型驱动程序时指定其设备扩展的大小。 大小由 HID_MINIDRIVER_REGISTRATION 结构的 DeviceExtensionSize 成员指定。

使用 HID_DEVICE_EXTENSION 结构

HID 微型驱动程序必须使用 HID_DEVICE_EXTENSION 结构作为由 HID 类驱动程序为功能设备对象创建的设备扩展的布局, (FDO) 。 HID 类驱动程序在初始化 FDO 时设置此结构的成员。 HID 微型驱动程序不得更改此结构中的信息。

HID_DEVICE_EXTENSION结构包含以下成员:

  • PhysicalDeviceObject 是指向表示基础输入设备的 PDO) (物理设备对象的指针。

  • NextDeviceObject 是指向 FDO 下设备堆栈顶部的指针。

  • MiniDeviceExtension 是指向 HID 微型驱动程序设备扩展的指针。

给定指向输入设备的 FDO 的指针,以下GET_MINIDRIVER_DEVICE_EXTENSION宏返回指向 HID 微型驱动程序扩展的指针:

#define GET_MINIDRIVER_DEVICE_EXTENSION(DO) ((PDEVICE_EXTENSION) (((PHID_DEVICE_EXTENSION)(DO)->DeviceExtension)->MiniDeviceExtension))

PDEVICE_EXTENSION是指向 HID 微型驱动程序声明的设备特定设备扩展的指针。

同样,HID 微型驱动程序可以获取指向输入设备的 PDO 和输入设备的 FDO 下设备堆栈顶部的指针。

当 HID 微型驱动程序向设备堆栈发送 IRP 时,它应使用 NextDeviceObject 作为目标设备对象。

标准微型驱动程序例程

HID 微型驱动程序必须提供以下标准驱动程序支持例程:

  • HID 微型驱动程序 DriverEntry 例程
  • HID 微型驱动程序 AddDevice 例程
  • HID 微型驱动程序卸载例程

HID 微型驱动程序还必须支持调度 HID 微型驱动程序提供的例程中所述的调度例程。

DriverEntry 例程

HID 微型驱动程序中的 DRIVER_INITIALIZE 例程执行以下操作:

  • 为链接的驱动程序对创建驱动程序对象, (HID 类驱动程序和 HID 微型驱动程序) 。

  • 在 HID 微型驱动程序对象中设置所需的驱动程序入口点。

  • 调用 HidRegisterMinidriver 将 HID 微型驱动程序注册到 HID 类驱动程序。

  • 仅限 HID 微型驱动程序使用的特定于设备的配置。

AddDevice 例程

HID 类驱动程序处理为基础输入设备创建和初始化功能设备对象 (FDO) 。 HID 类驱动程序还从基础设备的上层接口的角度操作 FDO,其子设备 (HID 集合) 。

HID 类驱动程序 DRIVER_ADD_DEVICE 例程调用 HID 微型驱动程序 AddDevice 例程,以便微型驱动程序可以执行特定于设备的内部初始化。

传递给 HID 微型驱动程序 DRIVER_ADD_DEVICE 例程的参数是微型驱动程序对象和 FDO。 HID 类驱动程序将 FDO 传递给微型驱动程序 AddDevice 例程,而不是传递到基础输入设备的物理设备对象。

HID 微型驱动程序 DRIVER_ADD_DEVICE 例程从 FDO 获取指向微型驱动程序设备扩展的指针。

  • 通常,HID 微型驱动程序 DRIVER_ADD_DEVICE 例程执行以下操作:

  • 初始化微型驱动程序设备扩展。 设备扩展仅由微型驱动程序使用。

  • 返回STATUS_SUCCESS。 如果微型驱动程序返回错误状态,HID 类驱动程序会删除 FDO 并将错误状态返回到即插即用管理器。

卸载例程

HID 类驱动程序的 Unload 例程调用 HID 微型驱动程序 DRIVER_UNLOAD 例程。 HID 微型驱动程序释放由微型驱动程序分配的任何内部资源。

调度例程

HID 微型驱动程序必须提供以下调度例程:创建、关闭、内部设备控制、系统控制、即插即用和电源管理。 除了内部设备控制请求外,这些调度例程中的大多数都提供最少的功能。 当 HID 类驱动程序调用这些调度例程时,它将微型驱动程序对象和功能设备对象 (FDO) 传递。

IRP_MJ_CREATE

根据 WDM 要求,HID 类驱动程序和 HID 微型驱动程序为创建请求提供调度例程。 但是,无法打开 FDO。 HID 类驱动程序返回STATUS_UNSUCCESSFUL。

HID 微型驱动程序只需提供存根。 从不调用创建调度例程。

IRP_MJ_CLOSE

根据 WDM 要求,HID 类驱动程序和 HID 微型驱动程序必须为关闭请求提供调度例程。 但是,无法打开 FDO。 HID 类驱动程序返回STATUS_INVALID_PARAMETER_1。

HID 微型驱动程序只需提供存根。 从不调用关闭调度例程。

IRP_MJ_DEVICE_CONTROL

HID 微型驱动程序不需要设备控制请求的调度例程。 HID 类驱动程序不会将设备控制请求传递给微型驱动程序。

IRP_MJ_INTERNAL_DEVICE_CONTROL

HID 微型驱动程序必须为支持 HID 微型驱动程序 IOCTL 中所述的请求的内部设备控制请求提供调度例程。

HID 类驱动程序主要使用内部设备控制请求来访问基础输入设备。

HID 微型驱动程序以特定于设备的方式处理这些请求。

IRP_MJ_SYSTEM_CONTROL

HID 微型驱动程序必须为系统控制请求提供调度例程。 但是,HID 微型驱动程序只需将系统控制请求向下传递设备堆栈,如下所示:

  • 跳过当前 IRP 堆栈位置

  • 将请求向下发送 FDO 的设备堆栈

IRP_MJ_PNP

HID 微型驱动程序必须为即插即用请求提供调度例程。

HID 类驱动程序执行与 FDO 关联的所有即插即用处理。 当 HID 类驱动程序处理即插即用请求时,它会调用 HID 微型驱动程序的即插即用调度例程。

HID 微型驱动程序即插即用调度例程:

  • 处理将请求向下发送 FDO 的设备堆栈,并在备份设备堆栈时完成请求,具体取决于每种类型的请求。

  • 是否与某些请求关联的特定于设备的处理来更新有关 FDO 状态的信息。

    例如,微型驱动程序可能会更新 FDO (的即插即用状态,尤其是无论 FDO 是启动、停止还是正在) 删除。

IRP_MJ_POWER

HID 微型驱动程序必须为电源请求提供调度例程。 但是,HID 类驱动程序处理 FDO 的电源处理。

为了符合 WDM 要求,HID 微型驱动程序以这种方式将电源请求发送到 FDO 的设备堆栈:

  • 跳过当前 IRP 堆栈位置

  • 启动下一个电源 IRP

  • 将电源 IRP 向下发送 FDO 的设备堆栈

通常,HID 微型驱动程序将电源请求向下传递设备堆栈,而无需额外处理。