Windows驱动有硬件(或实例), 类和服务三种注册表键负责配置。

  • 硬件(或实例)键包含单个设备的信息
  • 类键涉及所有相同类型设备的共同信息
  • 服务键包含驱动程序信息
注册表路径
类(class)键[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Control \Class\GUID]
服务(service)键[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet \ Services \服务名]
硬件(hardware)键[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Enum \总线\硬件ID]

注册表的根寻址

用户模式

在用户模式下,Win32 API 提供了一组预定义的句柄常量,用于访问注册表的顶级键:

  • HKEY_CLASSES_ROOT (HKCR) : 包含文件类型关联和类的信息。
  • HKEY_CURRENT_USER (HKCU) : 包含当前登录用户的配置信息。
  • HKEY_LOCAL_MACHINE (HKLM) : 包含计算机范围内的配置信息。
  • HKEY_USERS (HKU) : 包含所有用户的配置信息。
  • HKEY_CURRENT_CONFIG (HKCC) : 包含当前硬件配置文件的信息。

这些句柄常量可以直接用于调用 Win32 API 函数来访问相应的注册表键。

内核模式

在内核模式下,注册表的访问使用了一种基于内核命名空间的命名方案。顶级键的命名如下:

  • \Registry\User : 对应用户模式下的 HKEY_USERS (HKU)
  • \Registry\Machine : 对应用户模式下的 HKEY_LOCAL_MACHINE (HKLM)

内核模式下,使用以下命名方案可以访问不同的注册表键:

  • \Registry\Machine\Software : 对应用户模式下的 HKLM\Software
  • \Registry\User <SID> : 对应用户模式下的 HKU <SID> ,其中 <SID> 是安全标识符。

在编写驱动程序或其他内核模式代码时,使用这些内核命名空间路径来访问注册表。

硬件键 (实例键)

硬件键出现在注册表的 HKEY_LOCAL_MACHINE 分支下,路径 \System\CurrentControlSet\Enum。这些键包含与系统中硬件设备相关的信息,如设备驱动程序、设备实例ID、设备状态等。硬件键的访问权限非常严格,通常情况下只有系统帐号和内核模式程序可以访问这些键。即使是管理员帐户,也不建议直接修改这些键,因为这些键直接影响系统硬件的配置和操作。修改不当可能导致系统硬件无法正常工作或系统崩溃。查看硬件键的内容,可以在具有Administrator特权的帐户下使用注册表编辑器工具,如REGEDIT32.EXE。在Windows 10及以后的版本中,注册表编辑器 (regedit.exe) 也可以查看这些内容。需要注意的是,查看和编辑权限是受限制的,即使在管理员帐户下,也可能需要进一步提升权限才能查看和编辑某些键的内容。

硬件(或实例)键Enum之后:

例如(显卡):PCI\VEN_10DE&DEV_2487&SUBSYS_762819DA&REV_A1\4&22817009&0&0008
  • 总线类型如 PCIUSBHID等。
  • 总线类型之后为硬件ID PCI\VEN_10DE&DEV_2487&SUBSYS_762819DA&REV_A1
  • 硬件ID之后为该设备的实例ID 4&22817009&0&0008

    实例路径在整个系统中是唯一的,代表着具体的设备,是设备的身份ID,不能重复。

类Class键

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class

每个类键的名称是一个 GUID (全局唯一标识符),这些 GUID 是 Microsoft 分配的,用于唯一标识不同类型的设备。设备管理器使用这些类 GUID 对设备进行分类。

INF 文件中的 ClassGuid

在设备的 INF 文件中,Version 节中包含一个 ClassGuid 指定的 GUID,这个 GUID 对应于设备的类别。例如:

[Version]
Signature="$WINDOWS NT$"
Class=Display
ClassGuid={4d36e968-e325-11ce-bfc1-08002be10318}

设备管理器通过这些类 GUID 将设备进行分类。每个设备类对应一个 GUID,可以在注册表的 HKLM\SYSTEM\CurrentControlSet\Control\Class 键中找到相应的条目。

Windows 提供的 GUID 分类

Windows 提供了一个预定义的设备类别 GUID 集合,用于标准设备分类。以下是一些常见的设备类 GUID:

🚀️更多见 微软官方文档

  • 显示设备 :

    • Class: Display
    • GUID: {4d36e968-e325-11ce-bfc1-08002be10318}
  • 磁盘驱动器 :

    • Class: DiskDrive
    • GUID: {4d36e967-e325-11ce-bfc1-08002be10318}
  • 网络适配器 :

    • Class: Net
    • GUID: {4d36e972-e325-11ce-bfc1-08002be10318}
注意,这里的类GUID和Windows驱动预定义设备GUID不同,一个是INF文件中指定的设备分类,另一个是设备名组。

设备管理器默认就是通过类GUID来进行设备分类的。类GUID注册表中比较关键的就是UpperFilters和LowerFilters,一般用于实现类过滤驱动。

服务(或软件)键

服务键用于指定驱动程序(.sys 文件)的位置以及控制驱动程序加载的一些参数。这些键存储在注册表的以下路径中:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services

结构

每个服务键(即服务或驱动程序的名称)下包含若干子键和值,描述了该服务的详细信息。以下是一个示例服务键及其常见子键和值:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ExampleService
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ExampleService]
"Type"=dword:00000001
"Start"=dword:00000002
"ErrorControl"=dword:00000001
"ImagePath"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,\
  74,00,25,00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,64,\
  00,72,00,69,00,76,00,65,00,72,00,73,00,5c,00,45,00,78,00,61,00,6d,00,70,00,\
  6c,00,65,00,44,00,72,00,69,00,76,00,65,00,72,00,2e,00,73,00,79,00,73,00,00,\
  00
"DisplayName"="Example Service"
"Description"="This is an example service."

子键和值

其中的键值可简写16进制0x110x22....
  • ImagePath :

    • 类型: REG_EXPAND_SZ
    • 描述: 指定驱动程序或服务的可执行文件路径。对于驱动程序,这是 .sys 文件的位置。
    • 示例: \SystemRoot\System32\drivers\ExampleDriver.sys
  • Type :

    • 类型: REG_DWORD
    • 描述: 指定服务的类型。例如,0x1 表示内核驱动程序,0x2 表示文件系统驱动程序,0x10 表示 Win32 服务。
    • 示例: 0x1 (内核驱动程序)
  • Start :

    • 类型: REG_DWORD
    • 描述: 指定服务的启动类型。例如,0x0 表示引导启动,0x1 表示系统启动,0x2 表示自动启动,0x3 表示手动启动,0x4 表示已禁用。
    • 示例: 0x2 (自动启动)
  • ErrorControl :

    • 类型: REG_DWORD
    • 描述: 指定启动失败时的错误控制行为。例如,0x0 表示忽略错误,0x1 表示正常错误处理,0x2 表示严重错误处理,0x3 表示关键错误处理。
    • 示例: 0x1 (正常错误处理)
  • DisplayName :

    • 类型: REG_SZ
    • 描述: 服务的显示名称。
    • 示例: Example Service
  • Description :

    • 类型: REG_SZ
    • 描述: 服务的描述信息。
    • 示例: This is an example service.
  • DependOnService :

    • 类型: REG_MULTI_SZ
    • 描述: 指定该服务依赖的其他服务。
    • 示例: Tcpip
注意:需要管理员权限才能修改这些键,并且不正确的修改可能导致服务或驱动程序无法正常工作,甚至导致系统无法启动。建议在修改前备份注册表。

参考

最后修改:2024 年 07 月 01 日
如果觉得我的文章对你有用,请随意赞赏