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、