添加卸载驱动例程

  • 0x0 驱动卸载
  • 管理驱动
  • 工具使用
  • 代码问题


0x0 驱动卸载

管理驱动

卸载驱动其实用简单的命令行就可以做到,或者使用cmd脚本即可,当然工具的便利性毋庸置疑,工具的选择也可以有很多(如 drivermonitor)。这里的重点是把驱动启用,停止,删除的命令行做下记录:
驱动安装后
启动:sc start mydriver 停止:sc stop mydriver 删除:sc delete mydriver

工具使用

加载驱动时出现如下多个问题:

  1. 使用debugView时有如下提示:

    在网上找到的说法时把文件夹中的dbgv.sys重命名重启软件即可。
  2. 驱动需要签名:试过网上的一些解决方式,但是似乎没有很好的效果,暂时未找到很好的方法,只能用F8进免驱动检查临时用一下,临时用的是一个64位签名工具,可临时签名。
  3. 驱动版本问题:在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…