YJX_Driver_010_添加卸载驱动例程

1、

【00:35】本节课 使用VC6 来编写代码 但不用它来编译

  【01:13】Win32控制台的空工程 mini_ddk

  【01:45】把 第9课 的代码 copy进来...(3个文件 都要)

    【02:02】将 mini_ddk.c文件 添加到工程里面

【02:25】将 DriverEntry函数 放到INIT的节中(我们不这样做也是可以的,但是我们把它规范一下)

【03:15】官方推荐 DriverEntry函数 返回类型为NTSTATUS

  【03:40】此时,右击"NTSTATUS"--> "Go To Definition Of NTSTATUS" / "Go To Referance Of NTSTATUS" 都说找不到,可能需要重新编译一下 (ZC:以为然也)

  【04:03】其实 "NTSTATUS"是LONG的一个别名 --> TYPEDEF LONG NTSTATUS

【06:00】注册卸载例程

【07:33】宏 KdPrint(("")); 要加双括号 // 其实就是用来代替 DbgPrint("")

  【08:08】KdPrint(("")); 是一个宏,在Checked版中 会用DbgPrint代替,在Free版中 则不做任何操作,要用双括号。DbgPrint("") ==> Checked和Free版 都会显示

【09:33】这里还是使用 DDK 来编译

   编译生成的 .log文件 一样可以定位错误信息

【13:53】用 "Driver Monitor" 来加载(NT式)驱动(ZC:这里是 NT式驱动吗?NT式 和 WDM式 的明显区别是什么?)

   它提示 路径已经在注册表里面存在了,我们不管它

  【14:18】用 "DbgView" 来查看调试信息

【15:35】我们用 "Driver Monitor" 再重新加载 刚刚编译的驱动(ZC:干嘛要重新加载?是∵ 没看到加载时的打印出来的信息吗?)

【16:00】需要重启电脑,∵之前调试了驱动 但是没有从内存里面卸载

  或者 我们把它改一下名字,再编译一下,这样应该是可以加载的

  【16:30】需要在 Sources 中修改名字

    【16:37】直接改 .sys文件的名字

  【16:43】再用 "Driver Monitor" 重新加载

     此时 驱动就能够被成功加载了

【17:20】此时,该驱动能够被多次的加载和卸载了("Driver Monitor" 上面的"GO"和"STOP"按钮)。如果我们的驱动没有卸载例程的话,就只能被加载 不能从内存中被卸载掉

【17:30】以第9课的驱动为例,来看下

  【17:58】在第9课的mini_ddk.c中加入打印调试信息的代码

  【18:30】用DDK重新编译一下

  【18:50】将生成的.sys文件改一个名字

  【19:15】加载成功的信息打印出来了

  【19:17】卸载的话,"Driver Monitor"中 有error信息打印出来,再次运行的话 "Driver Monitor"中说"The driver is already running."(ZC: 那就是说,要像将它从内存中去掉的话,就要像上面想那样 只有重启电脑了?)

【19:50】有卸载例程的驱动就能够 反复的被加载/卸载

【20:20】DbgView 中 "Capture" --> "Capture Kernel" 和 "Capture Events"都要勾选(ZC:Why "Capture Events" ?)

 

ZC:本课的 mini_ddk.c 的内容:

 1 // _stdcall
 2 #include <ntddk.h>
 3 #define INITCODE code_seg("INIT") // 入口函数,一般需要放在INIT标识的内存中,INIT标识指明该函数只是在加载的时候需要载入内存,二挡驱动成功加载后,该函数可以从内存中卸载掉
 4 
 5 #pragma INITCODE // 这一条预编译指令,是指定它("#pragma INITCODE")下面的代码是放在 INIT标识的内存中
 6 VOID DDK_Unload(IN PDRIVER_OBJECT _pDrvierObject);
 7 NTSTATUS DriverEntry(PDRIVER_OBJECT _pDrvierObject, PUNICODE_STRING B)
 8 {
 9     KdPrint(("驱动成功被加载...OK+++++++++"));
10     _pDrvierObject->DriverUnload = DDK_Unload;
11     return 1;
12 }
13 
14 VOID DDK_Unload(IN PDRIVER_OBJECT _pDrvierObject)
15 {
16     KdPrint(("驱动成功被卸载...OK----------"));
17 }

 

 

2、

 

转载于:https://www.cnblogs.com/debugskill/p/5315075.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值