C++第三十八篇 -- 研究一下Windows驱动开发(二)--WDM式驱动的加载
基于Windows驱动开发技术详解这本书
一、简单的INF文件剖析
INF文件是一个文本文件,由若干个节(Section)组成。每个节的名称用一个方括号指示,紧接着方括号后面的就是节内容。每一行就是一项内容,其形式都是类似SomeEntry=SomwValue。每个项的顺序是可以颠倒的,但系统分析INF文件的时候,是顺序解析的。INF中注释语句是用分号开头的。

二、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中描述的一致。

》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下面

通过硬件组件的ClassGUID在类子键里面找到类的信息。这些内容,可以对照INF的片段更改,且同时作用于设备管理器中所显示出来的驱动供应商,驱动版本日期,数字签名等信息。
3、服务子键
服务子键是为了兼容以前的NT式驱动程序,可以用同样的方法观察NT式驱动程序的服务子键。服务子键的位置在Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services目录下

》ImagePath:记录驱动程序的执行文件路径。
》Type为1:指示该表描述一个内核模式的驱动。
》Start为3:指示系统应动态装入这个驱动程序。此值会与SERVICE_DEMOND_START常量对应
》ErrorContro为1:指出如果装入驱动程序失败,系统应弹出一个错误提示对话框
C++第三十八篇 -- 研究一下Windows驱动开发(二)--WDM式驱动的加载的更多相关文章
- C++第三十九篇 -- 研究一下Windows驱动开发(二)-- 驱动程序中重要的数据结构
数据结构是计算机程序的核心,I/O管理器定义了一些数据结构,这些数据结构是编写驱动程序时所必须掌握的.驱动程序经常要创建和维护这些数据结构的实例. 一.驱动对象(DRIVER_OBJECT) 每个驱动 ...
- Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型
一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例 ...
- 第三十八篇、给UITabBar按钮的动画效果
在很多情况下,我们也时常有这样的需求,就是在UITabBar切换的时候,添加一些动画效果 1.在UITabBar触发点击方法的时候捕获当前点击的item 2.使用coreAnimation设置动画效果 ...
- 第三十八篇-logcat的使用
很多時候,程序有问题时都需要debug,一般会设置几个信息点,查看程序是否运行,之前学过Toast,可以广播,但是终归是不太方便,今天学习一下logcat的用法. logcat里面是一些日志,内容太多 ...
- 第三十八篇 入门机器学习——Numpy.array的基本操作——查看向量或矩阵
No.1. 初始化状态 No.2. 通过ndim来查看数组维数,向量是一维数组,矩阵是二维数组 No.3. 通过shape来查看向量中元素的个数或矩阵中的行列数 No.4. 通过size来查看数组中的 ...
- 第三十八篇:vue3路由
好家伙,水博客怎么说 1.0.安装:简简单单的淘宝镜像安装 装一下淘宝镜像(一般都有) npm install -g cnpm --registry=https://registry.npm.taob ...
- 第四十八篇:webpack的基本使用(二) --安装和配置webpack-dev-server插件
好家伙, 1.webpack中的默认约定 默认的打包入口文件为src -->index.js 默认的输出文件路径为dist -->main.js 既然有默认,那么就说明肯定能改 2.en ...
- 《手把手教你》系列技巧篇(三十八)-java+ selenium自动化测试-日历时间控件-下篇(详解教程)
1.简介 理想很丰满现实很骨感,在应用selenium实现web自动化时,经常会遇到处理日期控件点击问题,手工很简单,可以一个个点击日期控件选择需要的日期,但自动化执行过程中,完全复制手工这样的操作就 ...
- Python之路【第十八篇】:Web框架们
Python之路[第十八篇]:Web框架们 Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Pytho ...
随机推荐
- 从五大结构体,带你掌握鸿蒙轻内核动态内存Dynamic Memory
摘要:本文带领大家一起剖析了鸿蒙轻内核的动态内存模块的源代码,包含动态内存的结构体.动态内存池初始化.动态内存申请.释放等. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列九 动态内存Dyna ...
- Mysql优化(出自官方文档) - 第七篇
Mysql优化(出自官方文档) - 第七篇 目录 Mysql优化(出自官方文档) - 第七篇 Optimizing Data Change Statements 1 Optimizing INSERT ...
- String ,StringBuffer 与S tringBuilder的区别??
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) ------------------------------------- ...
- 深度解读MRS IoTDB时序数据库的整体架构设计与实现
[本期推荐]华为云社区6月刊来了,新鲜出炉的Top10技术干货.重磅技术专题分享:还有毕业季闯关大挑战,华为云专家带你做好职业规划. 摘要:本文将会系统地为大家介绍MRS IoTDB的来龙去脉和功能特 ...
- java变量及常量
变量 本质:就是代表一个"可操作的存储空间",空间位置是确定的,但是里面放置什么值不确定.我们可通过变量名来访问"对应的存储空间",从而操纵这个"存储 ...
- excel VBA构造正则函数(双参数)
Function zhengze(ze As String, Rng As Range) Set regx = CreateObject("vbscript.regexp") ...
- Web 前端开发规范手册
一.规范目的 Web 前端开发规范手册 1.1 概述 ......................................................................... ...
- 【Java集合】ArrayList源码分析
ArrayList是日常开发中经常使用到的集合,其底层采用数组实现,因此元素按序存放.其优点是可以使用下标来访问元素,时间复杂度是O(1).其缺点是删除和增加操作需要使用System.arraycop ...
- charles证书导入系统信任区(Android7.0以上)
打开charles,跟着下图来,下载好charles的证书 后缀是pem的格式,挺方便的了,burp的证书是der的,还需要再进一步转化成pem,这里就不再多说, 利用openssl来计算出文件名 加 ...
- php+redis+lua实现分布式锁(转载)
以下是我在工作中用到的类,redis加锁两种方式,解锁为了保证原子性所以只用lua+redis的方式 缺陷:虽然死锁问题解决了,但业务执行时间超过锁有效期还是存在多客户端加锁问题.不过,这个类已经满足 ...