YJX_Driver_026_手动加载NT式驱动(非工具)
1、
手动加载NT式驱动(非工具)
A、观察注册表
B、手动运行驱动
C、手动停止驱动
【100】regedit
【145】文件--> 导出(F)... 可以看到 子键的路径为:“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services”
【170】这个是 关于 驱动服务的加载项 在注册表里面的位置
【195】以一个实例来说明
【225】打开 DriverMonitor 【245】加载驱动,就以第18课的驱动(DDK_HelloWorld.sys)为例
【275】看一下,在未用DriverMonitor加载之前,注册表里面的情况
【325】【335】注意看这一段范围,【355】DriverMonitor载入驱动(ZC: 此时还未点击"GO")
【380】注册表 刷新一下【515】没有看到变化... 可能他做测试的时候,已经有了相关信息...
【540】将 DDK_HelloWorld.sys 改名为 DDKHelloWorld.sys,再用DriverMonitor打开(ZC: 还未点击按钮"GO")
【554】注册表 刷新一下,【565】这时,多了一个 项“DDKHelloWorld”,里面有"DiaplayName"、"ErrorControl"、"ImagePath"、"Start"、"Type"
【630】"ImagePath" 的值 “\??\G:\驱动教程\018_读出SSDT表当前函数地址\mini_ddk\sys\i386\DDKHelloWorld.sys” 是以 "\??"作为开头,包含驱动的绝对路径
【785】注册表 导出 子项"ddkhello"
分析导出的信息
【855】导出的信息中 "ImagePath"是以十六进程的形式显示的
“
ImagePath
\??\G:\驱动教程\018_读出SSDT表当前函数地址\mini_ddk\sys\i386\DDKHelloWorld.sys
"DisplayName"="DDKHelloWorld"
"Type"=dword:00000001 // 1:表示载入的是驱动
"Start"=dword:00000003 // 3:表示按需要启动,2:表示(系统启动的时候就)自动启用驱动,
"ErrorControl"=dword:00000001// 1
”
【1080】"Start" : 好像还有一个值,1:表示以手动来启动驱动。具体记得不太清除
【1110】"ErrorControl"一般都是为1,默认为1,
【1130】"DisplayName" 显示名,可以随意改变。这个名字会显示在 服务项 或 设备管理器 里面的时候,它要显示的一个名字
【1200】注册表“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DDKHelloWorld” 中的 项"DDKHelloWorld" 就是 我们所要启动的驱动的名字
【1230】cmd命令测试一下:"net start ddkhelloworld"(ZC: 貌似这里的"ddkhelloworld"大小写不敏感)
【1280】"net stop ddkhelloworld"
【1365】此时刷新一下注册表,它另外通过系统创建了一些项,一些计数。这些并不是很重要,这些由系统自动创建的
【1480】又"net start ddkhelloworld"、"net stop ddkhelloworld" 了一下,貌似计数没有变...
【1540】在虚拟机里面做一下测试,∵ 主机启动不是很方便,不方便我们录像
【1590】首先 准备一个驱动
【1640】以 第21课的驱动,放在D盘根目录下
【1745】注册表,【1800】来到"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services"(在"状态栏"中显示有 当前注册表的路径)
【1825】新建一个 项,取名为"mydriver"
【1970】在 项 的里面,新建(N)-->字符串值(S): 名称==>ImagePath,数值数据==>"\??\D:\yjxyjx.sys"
【2115】新建(N)-->字符串值(S): 名称==>DisplayName,数值数据==>"mydriver"
【2155】一般来说,自动创建的时候,它的值 和 项的名称是相同的,或者是 与驱动的名字是相同的
【2197】新建(N)-->DWORD值(D): 名称==>Type,数值数据==>"1"
【2225】新建(N)-->DWORD值(D): 名称==>Start,数值数据==>"2"
它就是自动启动的
【2280】新建(N)-->DWORD值(D): 名称==>ErrorControl,数值数据==>"1"
【2285】这样,yjxyjx.sys就能自动启动了
【2355】本方式 与 代码调用API函数来实现控制驱动 有一些区别
【2375】如果 不重启OS的话,需要命令行的方式,好像通过命令行的方式也是不能启动的,可以试一下
【2430】【2495】cmd --> "net start mydriver",提示“服务名无效”
【2515】重启OS (ZC: 个人感觉,貌似重启OS之后,即使是 非自动启动的驱动,也能通过命令行来控制yjxyjx.sys,∵OS已经知道&关注了注册表的相关改变了(驱动的相关注册表配置信息),待测试)
【2530】在 重启OS 之前,通过工具看一下相关区别的信息
【2545】此时yjxyjx.sys 是并未在内存中载入的,KernelDetective的 标签"驱动程序" 中 没有 yjxyjx.sys
【2690】重启OS
【2790】重启OS 完毕,再次进入OS
【2840】KernelDetective的 标签"驱动程序" 中 找到了 yjxyjx.sys
【2910】通过命令行 对yjxyjx.sys 进行控制,此时已经加载了"net stop mydriver",成功
【2980】一般来说,通过工具(DriverMonitor)来载入yjxyjx.sys的话,它会自动以 驱动的名字去掉后缀名 作为服务项的名字
【3045】把“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\mydriver”的内容导出来看一下 mydriver.reg:
“
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\mydriver]
"ImagePath"="\\??\\D:\\yjxyjx.sys"
"DisplayName"="mydriver"
"Type"=dword:00000001
"Start"=dword:00000002
"ErrorControl"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\mydriver\Enum]
"0"="Root\\LEGACY_MYDRIVER\\0000"
"Count"=dword:00000001
"NextInstance"=dword:00000001
”
【3150】此时yjxyjx.sys是停止状态,再刷新一下 KernelDetective的 标签"驱动程序"中的内容,里面找不到yjxyjx.sys。但是注册表里面的信息 还是在的
【3230】注册表中 "Start"改为"3"(ZC: 表示按需要启动。到底,按需要启动 是什么时候启动?)
【3300】将 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 的 项"mydriver" 改名为"yjxcom"
【3330】删掉 项"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\yjxcom\Enum"
【3385】这样,我们下次启动OS的时候,就不会启动 驱动yjxyjx.sys(项"yjxcom"),它需要我们以命令的方式 手动来启动
【3425】现在 项"mydriver" 改名为 项"yjxcom" 了,此时再"net start mydriver" 报错:
“
发生系统错误 2。
系统找不到指定的文件。
”
ZC: 此时"net start yjxcom"会怎么样?能正常启动吗?
【3515】给大家布置一个作业
本节课的手动设置注册表的相关信息 和 代码调用API加载驱动引起的注册表改变 进行一个比较,更深入的研究
ZC: 代码调用API加载驱动引起的注册表改变,就需要监视注册表的变化了,貌似 以前听说过有能工具监视注册表变化,但是不知道是什么工具...
2、