驱动程序通常使用一组系统定义的注册表项来存储或访问特定于驱动程序或特定于设备的信息。 驱动程序可能会访问以下注册表项:
1. 参数 键
驱动程序 的参数密钥 可以包含驱动程序的配置信息,可以通过调用 WdfDriverOpenParametersRegistryKey 进行访问。 对于 Kernel-Mode Driver Framework (KMDF) 驱动程序,此密钥位于驱动程序的相应 服务 树中。 对于 User-Mode Driver Framework (UMDF) 驱动程序,此键位于 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WUDF\Services 树的驱动程序服务名称下。 驱动程序的子项始终使用驱动程序的服务名称,即使驱动程序二进制文件的文件名与服务名称不同。注意UMDF 不支持创建子项。
当系统调用驱动程序的 DriverEntry 例程时,它会在相应的 服务 树中向驱动程序的密钥传递路径。 驱动程序必须将此路径传递给 WdfDriverCreate。 随后,驱动程序可以通过调用 WdfDriverGetRegistryPath 来获取路径。
2. 软件密钥
驱动程序的软件密钥也称为其 驱动程序密钥。 系统在其软件密钥下存储有关每个驱动程序的信息。驱动程序可以调用 WdfFdoInitOpenRegistryKey 和 WdfDeviceOpenRegistryKey 来打开设备的软件密钥。
驱动程序的 INF 文件可以包含 INF AddReg 指令 ,这些指令使用 INF DDInstall 节在软件键下设置注册表值。
3. 硬件密钥
当驱动程序堆栈通知即插即用 (PnP) 管理器设备已连接到系统时,PnP 管理器会为设备创建硬件密钥。 此密钥也称为 设备密钥。 驱动程序可以在此处存储与硬件 (相关的设置,例如中断设置) 。
驱动程序可以调用 WdfFdoInitOpenRegistryKey 和 WdfDeviceOpenRegistryKey 来打开设备的硬件密钥。
驱动程序的 INF 文件可以包含 INF AddReg 指令 ,这些指令使用 INF DDInstall.HW 部分在硬件键下设置注册表值。
使用框架注册表项对象
基于框架的驱动程序使用 框架注册表项对象访问注册表。 注册表项对象定义使驱动程序能够创建、打开和关闭注册表项的方法;添加和删除注册表值;和 读取或写入分配给注册表值的数据。
若要打开注册表项,驱动程序必须调用 WdfRegistryOpenKey。 如果该密钥不存在,驱动程序必须调用 WdfRegistryCreateKey,这将创建新密钥并打开它。
当驱动程序打开注册表项时,框架会创建一个表示打开的项的注册表项对象,并将对象句柄返回给驱动程序。 驱动程序必须使用对象句柄来访问密钥、键下存在的任何子项,以及该键或其子项下存在的任何值。
若要读取当前分配给注册表值名称的数据,驱动程序可以调用以下对象方法之一:
- WdfRegistryQueryMemory:检索当前分配给值名称的数据,将数据存储在框架分配的缓冲区中,并创建表示缓冲区的框架内存对象;
- WdfRegistryQueryMultiString:检索当前分配给多字符串类型值名称的字符串数据,为每个字符串创建框架字符串对象,并将每个字符串对象添加到对象集合;
- WdfRegistryQueryString:检索当前分配给字符串类型值名称的字符串数据,并将字符串分配给指定的框架字符串对象;
- WdfRegistryQueryUnicodeString:检索当前分配给字符串类型值名称的字符串数据,并将字符串复制到指定的 UNICODE_STRING 结构;
- WdfRegistryQueryULong:检索当前分配给值名称的无符号长字 (REG_DWORD) 数据,并将数据复制到指定位置;
- WdfRegistryQueryValue:检索当前分配给值名称的数据,并将数据复制到驱动程序提供的缓冲区;
若要将数据写入注册表值,驱动程序可以调用以下方法之一。 如果值名称已存在,则操作系统会更新该值的数据:
- WdfRegistryAssignMemory:将内存缓冲区中包含的数据分配给注册表中的指定值名称;
- WdfRegistryAssignMultiString:将一组字符串分配给注册表中的指定值名称。 字符串包含在驱动程序提供的框架字符串对象的集合中;
- WdfRegistryAssignString:将字符串分配给注册表中的指定值名称。 字符串包含在框架字符串对象中;
- WdfRegistryAssignUnicodeString:将指定的 Unicode 字符串分配给注册表中的指定值名称;
- WdfRegistryAssignULong:将指定的无符号长字值分配给注册表中的指定值名称;
- WdfRegistryAssignValue:将驱动程序提供的数据缓冲区的内容分配给注册表中的指定值名称;
若要删除注册表值,驱动程序必须调用 WdfRegistryRemoveValue。 若要删除密钥,驱动程序必须调用 WdfRegistryRemoveKey。
若要获取有关注册表的 WDM 信息,驱动程序可以调用 WdfRegistryWdmGetHandle,这将向框架注册表项对象表示的注册表项返回 WDM 句柄。
在驱动程序完成访问注册表项后,它必须调用 WdfRegistryClose 或 WdfObjectDelete 来关闭该注册表项并删除该注册表项对象。