注册表
+ -

Windows驱动注册表(硬件、服务、类)项详解

2022-08-18 1908 1

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

实例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系统中提供了大量的过滤驱动程序,如鼠标的:
类Class键

服务(或软件)键

服务(或软件)键指出驱动程序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

0 篇笔记 写笔记

Windows驱动注册表写数据
实际上注册表的写入比读取要简单。因为这省略了一个尝试数据的大小的过程。直接将数据写入即可。写入值一般使用函数ZwSetValueKey 。这个函数的原型如下:NTSTATUS ZwSetValueKey( IN HANDLE KeyHandle, IN PUNICODE_STRI......
WDDM显卡驱动
WDDM,全称是Windows Display Driver Model(WDDM),是微软从Vista(包括)之后的新一代图形驱动程序模型。用于代替老的图形驱动程序模型XDDM(XPDM)。名词解释:XPDM - Windows XP Display Driver ModelWDDM - ......
ReactOS 卸载驱动IopUnloadDriver
内核卸载驱动调用的函数是NtUnloadDriver,这个函数只是对IopUnloadDriver的包装。NTSTATUS NTAPINtUnloadDriver(IN PUNICODE_STRING DriverServiceName){ return IopUnloadDriver(......
Windows应用层写数据到驱动
应用层传入信息的时候,可以使用WriteFile,也可以使用DeviceIoControl。DeviceIoControl是双向的,在读取设备的信息也可以使用。因此本书以DeviceIoControl为例子进行说明。DeviceIoControl称为设备控制接口。其特点是可以发送一个带有特定控制码的......
Windows驱动注册表数据
一般使用ZwQueryValueKey来读取注册表中键的值。要注意的是注册表中的值可能有多种数据类型。而且长度也是没有定数的。为此,在读取过程中,就可能要面对很多种可能的情况。ZwQueryValueKey这个函数的原型如下:NTSTATUS ZwQueryValueKey( IN HAN......
WDM驱动相同硬件相同驱动接口区分
在项目开发的时候,经常会做一些设备驱动,一块主板上安装上多块相同的板卡,(例如:同一PC机的主板上会插多块PCI 串口板卡。)这时在驱动开发的时候,在AddDevice回调函数中会以设备类的方式注册设备。DEFINE_GUID(PCI_DEVICE, 0x5f655dad, 0x16d4, 0x4......
Windows修改注册表使应用程序开机自动运行
先向大家介绍能让WINDOWS自动启动的2个文件和8个注册键1: 当前用户专用的启动文件夹 将快捷方式放入WINDOWS的用户启动文件夹中.在开始菜单的启动文件夹上,右键选中“打开”菜单如在本机win7 x64下为:C:/Users/Administrator/AppData/Roaming/M......
windows驱动协安装的配置及源安装路径获取
在做windows驱动开发时,有时需要在驱动安装前,安装后,等事件发生时进行一系列的处理工作,当然如果在驱动内部配置相关的IRP回调函数,但有时多有不便。微软给我们提供了一种叫做协安装的方法,由系统调用,我们只需要生成DLL并导出函数即可。以vm虚拟机的显卡驱动为例,inf文件配置如下:[vmx......
CreateFile打开驱动设备权限不足
记得以前写了一个文件过滤驱动,使用的是minifilter的框架。在创建设备时,很常规的使用IoCreateDevice来创建一个命名的设备对象,然后对这个设备名使用IoCreateSymbolicLink创建其应用层的链接符号名,这样我们在应用层就可以通过CreateFile函数就可以打开这个设备......
Windows内核驱动创建线程
有时候需要使用线程来完成一个或者一组任务。这些任务可能耗时过长,而开发者又不想让当前系统停止下来等待。在驱动中停止等待很容易使整个系统陷入“停顿”,最后可能只能重启电脑。但一个单独的线程长期等待,还不至于对系统造成致命的影响。另一些任务是希望长期、不断的执行,比如不断写入日志。为此启动一个特殊的线程......
驱动层信息传出
驱动主动通知应用和应用通知驱动的通道是同一个。只是方向反过来。应用程序需要开启一个线程调用DeviceIoControl,(调用ReadFile亦可)。而驱动在没有消息的时候,则阻塞这个IRP的处理。等待有信息的时候返回。有的读者可能听说过在应用层生成一个事件,然后把事件传递给驱动驱动有消息要通......
Windows内核驱动中使用new和delete
在Windows驱动中如果要分配内存,我们使用的ExAllocatePoolWithTag,ExAllocatePool,而释放内存时使用的是ExAllocatePoolWithTag和ExFreePool函数。我们知道,在内核中其实不是不能用C++,而是使用时有很大的限制。如果稍不留神,就会掉进......
WDDM KMDOD驱动介绍及驱动初始化
KMOD驱动是微软提供的一个Display Only驱动。WDDM KMOD驱动初始化Windows驱动的入口函数是DriverEntry,所以显示Mini小端口驱动程序也不例外。和其它Mini小端口驱动的入口函数实现一致,在其DriverEntry只做一件事,就是分配系统指定的一个结构体,然后......
驱动入口与驱动对象
驱动开发程序员所编写的驱动程序对应有一个结构。这个结构名为DRIVER_OBJECT。对应一个“驱动程序”。下面的代码展示的是一个最简单的驱动程序。 #include NTSTATUS DriverEntry ( ......
WDDM KMOD驱动设备的创建与启动
创建设备 DxgkDdiAddDevice/BddDdiAddDeviceWDM驱动的一个核心思想是代码的重用,这样如果是同一型号的显卡芯片,可以使用同一套代码,而对于每一个芯片,只需要保留相关的上下文即可。这里“代码”就是WDM驱动架构中的DRIVER_OBJECT,而每个芯片就叫做DEVICE_......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!