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
- 总线类型如
PCI
,USB
,HID
等。 - 总线类型之后为硬件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:
磁盘驱动器 :
- Class:
DiskDrive
- GUID:
{4d36e967-e325-11ce-bfc1-08002be10318}
- Class:
网络适配器 :
- Class:
Net
- GUID:
{4d36e972-e325-11ce-bfc1-08002be10318}
- Class:
注意,这里的类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进制0x1
为1
,0x2
为2
....
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
- 类型:
注意:需要管理员权限才能修改这些键,并且不正确的修改可能导致服务或驱动程序无法正常工作,甚至导致系统无法启动。建议在修改前备份注册表。