添加卸载驱动例程
- 0x0 驱动卸载
- 管理驱动
- 工具使用
- 代码问题
0x0 驱动卸载
管理驱动
卸载驱动其实用简单的命令行就可以做到,或者使用cmd脚本即可,当然工具的便利性毋庸置疑,工具的选择也可以有很多(如 drivermonitor)。这里的重点是把驱动启用,停止,删除的命令行做下记录:
驱动安装后
启动:sc start mydriver
停止:sc stop mydriver
删除:sc delete mydriver
工具使用
加载驱动时出现如下多个问题:
- 使用debugView时有如下提示:
在网上找到的说法时把文件夹中的dbgv.sys重命名重启软件即可。 - 驱动需要签名:试过网上的一些解决方式,但是似乎没有很好的效果,暂时未找到很好的方法,只能用F8进免驱动检查临时用一下,临时用的是一个64位签名工具,可临时签名。
- 驱动版本问题:在64位操作系统上安装32位驱动,使用monitor时会报”错误 1275.此驱动程序被阻止加载”,因此需要使用64位驱动,另外,monitor需要以管理员运行。
代码问题
在加载如下代码(不包括蓝色部分)编译的ddk驱动时,每次卸载驱动的时候都会蓝屏,搞得不明所以,没得法子只得用windbg联调去看到底问题出在什么地方了,由于有pdb,很快便定位到问题点,跟观察的结果一样,果然时在卸载驱动的时候蓝屏了,为什么呢?
#include <ntddk.h>
#define INITCODE code_seg("INIT")
#define PAGEDCODE code_seg("PAGE")
VOID DDK_Unload(IN PDRIVER_OBJECT pDriverObject);
#pragma INITCODE
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING b)
{
KdPrint(("驱动成功被加载---OK++++++++"));
pDriverObject->DriverUnload = DDK_Unload;
return 1;
}
VOID DDK_Unload(IN PDRIVER_OBJECT pDriverObject)
{
KdPrint(("驱动成功被卸载---OK--------"));
DbgPrint("驱动成功被卸载---OK--------"); //使用DbgPrint只需一个括号
}
此时,我想起《Windows驱动开发技术详解》,对比其中的代码我们看到书中在每个函数前面都标有CODE类型,在驱动卸载函数前,其代码清单中有#pragma INITCODE,#pragma PAGEDCODE等,因此,在卸载驱动函数前加上#pragma PAGEDCODE
驱动卸载再也不会蓝屏了,如下:
#include <ntddk.h>
#define INITCODE code_seg("INIT")
#define PAGEDCODE code_seg("PAGE")
VOID DDK_Unload(IN PDRIVER_OBJECT pDriverObject);
#pragma INITCODE
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING b)
{
KdPrint(("驱动成功被加载---OK++++++++"));
pDriverObject->DriverUnload = DDK_Unload;
return 1;
}
#pragma PAGEDCODE
VOID DDK_Unload(IN PDRIVER_OBJECT pDriverObject)
{
KdPrint(("驱动成功被卸载---OK--------"));
DbgPrint("驱动成功被卸载---OK--------"); //使用DbgPrint只需一个括号
}
TO be continue…