Windows驱动注册表(硬件、服务、类)项详解
Windows驱动有三种注册表键负责配置。它们是硬件(或实例), 类和 服务。
- 硬件(或实例)键包含单个设备的信息。
- 类键涉及所有相同类型设备的共同信息。
- 服务键包含驱动程序信息。
注册表 | 路径 |
---|---|
硬件(hardware)键 | [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Enum\总线\硬件ID] |
类(class)键 | [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Control\Class\GUID] |
服务(service)键 | [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\服务名] |
注册表的根寻址
在用户模式的Win32API函数访问注册表时,可以用HKEY_CLASSES_ROOT、HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE,等等的预定义句柄常量代表顶级注册表键。
也可以使用缩写HKCR、HKCU、HKLM代替它们。
在内核模式中,使用另一种基于内核命名空间的命名方案。顶级键命名为\Registry\User和\Registry\Machine。
Machine分支就是用户模式中的HKLM分支
硬件(或实例)键
设备的硬件键出现在注册表local machine分支的\System\CurrentControlSet\Enum子键上。通常你不能查看到该键的内部信息,系统只允许拥有系统帐号的用户访问该键。即只有内核模式程序和运行在系统帐号下的用户模式服务可以读写Enum键和其子键,但是即使是管理员也不应该直接修改这些键的内容。要想查看Enum键的内容,可以在Administrator特权级帐户下使用REGEDIT32.EXE工具查看。
硬件(或实例)键Enum之后:
- 首先是总线类型,这里如PCI,USB,HID等。
- 总线类型之后为硬件ID,如VEN_10DE&DEV_10F1&SUBSYS_11C21B4C&REV_A1。
- 硬件ID之后为该设备的实例ID.如4&2d78ab8f&0&0108。
实例路径在整个系统中是惟一的,代表着具体的设备,是设备的身份ID,不能重复。
硬件ID
实例ID
类Class键
所有设备类的类键都出现在HKLM\System\CurrentControlSet\Control\Class键中。它们的键名是由Microsoft赋予的GUID值。
类键的GUID是指INF文件Version节中ClassGuid指定的GUID,其GUID有一个对应名称Class,这两个需保持一致。Windows提供了一系列的GUID分类,详见:http://www.pnpon.com/article/detail-214.html
注意,这里的类GUID和Windows驱动预定义设备GUID不同,一个是INF文件中指定的设备分类,另一个是设备名组。
设备管理器默认就是通过类GUID来进行设备分类的。
类GUID注册表中比较关键的就是UpperFilters和LowerFilters,一般用于实现类过滤驱动。当然这两项是是可选的。
Windows系统中提供了大量的过滤驱动程序,如鼠标的:
服务(或软件)键
服务(或软件)键指出驱动程序sys文件的位置,以及控制驱动程序装入的一些参数。服务键位于HKLM\System\CurrentControlSet\Services键中。
服务名一般为驱动程序sys的名称。如USB中文网虚拟的摄像头如下:
其中ImagePath标识了驱动程序所在的路径,Owners指定了驱动的INF文件。如果有多个INF文件,说明当系统中有多个版本的驱动。
其它键值:
- Type(1) 指出该表项描述一个内核模式驱动程序。
- Start(3) 指出系统应动态装入这个驱动程序。(该值与CreateService中的SERVICE_DEMAND_START常量对应,用于内核模式驱动程序时它代表不必明确调用StartService函数或发出NET START命令来启动驱动程序):http://www.pnpon.com/article/detail-115.html
- ErrorControl(1) 指出如果装入该驱动程序失败,系统应登记该错误并显示一个消息框。
[UsbzhVKM_Device.NT.Services] ;可以看到是服务项下的内容
AddService = UsbzhVKM,%SPSVCINST_ASSOCSERVICE%, UsbzhVKM_Service_Inst
[UsbzhVKM_Service_Inst]
DisplayName = %UsbzhVKM.SVCDESC%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 3 ; SERVICE_DEMAND_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %12%\UsbzhVKM.sys
LoadOrderGroup = Extended Base