C++第三十八篇 -- 研究一下Windows驱动开发(二)--WDM式驱动的加载

80296630 2019-11-02

基于Windows驱动开发技术详解这本书

一、简单的INF文件剖析

INF文件是一个文本文件,由若干个节(Section)组成。每个节的名称用一个方括号指示,紧接着方括号后面的就是节内容。每一行就是一项内容,其形式都是类似SomeEntry=SomwValue。每个项的顺序是可以颠倒的,但系统分析INF文件的时候,是顺序解析的。INF中注释语句是用分号开头的。

C++第三十八篇 -- 研究一下Windows驱动开发(二)--WDM式驱动的加载

二、WDM设备安装在注册表中的变化

WDM式驱动程序的安装会在三个方面修改注册表,分别是硬件子键(Hardware)、类子键(Class)、服务子键(Service)。注册表从这三个方面的子键描述WDM设备。在安装好WDM驱动后,会根据INF的信息,在注册表中有所体现。

安装完WDM式驱动后,除了在注册表中得到体现外,在设备管理器中,设备会同时显示出来。在INF描述的各种信息,都可以从设备管理器中得到体现。

1、硬件子键

硬件子键,也称实例子键。其信息存储在注册表的Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum位置里。访问此子键必须拥有系统管理员的访问权限,因此访问这个子键只能运行在内核的程序或者拥有系统访问权限的应用程序。

我们自己写的设备是一个模拟设备,当安装了以后可以在设备管理器中看见,也可以在注册表中查看Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\KMDFDriver1\0000.这个可以根据设备管理器中的详细信息查到,可以想到,如果PC中有多于一个的同类设备,序号会顺序排列下去0000、0001、0002。。。观察注册表,会有如下内容,且这些内容会和INF中描述的一致。

C++第三十八篇 -- 研究一下Windows驱动开发(二)--WDM式驱动的加载

》ClassGUID:指明此设备所属的类的GUID。

》Class:指明此设备所属于的设备类

》HardwareID:root\驱动名

》Driver:指明驱动的位置。

》Mfg:指明设备制造商的名称

》Service:指明此设备在服务子键的位置。

》DeviceDesc:显示的是此设备在设备管理器中显示的名字。

2、类子键

每个设备都会从属于一个设备类。类子键负责记录这个类的信息。类子键位Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class目录下。这里记录了系统里所有的设备类,且每个设备类都是以一个GUID记录的。GUID是一组128位的数字,形如{25DBCE51-6C8F-4A72-8A6D-B54C2B4FC835}。用户可以使用GUIDGEN.exe工具产生一组新的GUID,且保证这个GUID号码不会与旧的GUID重复(是小概率意义上保证的)。GUIDGEN.exe是VC提供的一个附加工具,路径在:安装目录\Microsoft Visual Studio\2017\Enterprise\Common7\Tools下面

C++第三十八篇 -- 研究一下Windows驱动开发(二)--WDM式驱动的加载

通过硬件组件的ClassGUID在类子键里面找到类的信息。这些内容,可以对照INF的片段更改,且同时作用于设备管理器中所显示出来的驱动供应商,驱动版本日期,数字签名等信息。

3、服务子键

服务子键是为了兼容以前的NT式驱动程序,可以用同样的方法观察NT式驱动程序的服务子键。服务子键的位置在Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services目录下

C++第三十八篇 -- 研究一下Windows驱动开发(二)--WDM式驱动的加载

》ImagePath:记录驱动程序的执行文件路径。

》Type为1:指示该表描述一个内核模式的驱动。

》Start为3:指示系统应动态装入这个驱动程序。此值会与SERVICE_DEMOND_START常量对应

》ErrorContro为1:指出如果装入驱动程序失败,系统应弹出一个错误提示对话框