note:看了一下《Windows内核安全与驱动开发》自己做一下简单笔记。代码基本都是来自这本书。
开发环境: vs2012+wdk8.0
运行环境:win7 32
驱动 helloWord
// 引用驱动头文件
#include <ntddk.h>
// 提供一个unload函数只是为了让这个程序能够动态的卸载
VOID DriverUnload(PDRIVER_OBJECT driver)
{
// 但是实际上我们什么都没做 只打印一句话
DbgPrint("first: Our driver is unloadding...\r\n");
}
// DriverEntry 入口函数相当于 main函数
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
// 这里为了方便调试我们手动加入断点
#if DBG
_asm int 3 ;
#endif
// 这是内核模块的入口,可以在这里是我们想写的东西
DbgPrint("first:Hello, my salary!");
UNICODE_STRING str = RTL_CONSTANT_STRING(L"first:hello mysalary");
<span style="white-space:pre"> </span>// 这里打印结构体 所以必须传入结构体存放地址
DbgPrint("%wZ",&str);
// 设置一个卸载函数,便于这个函数退出
driver->DriverUnload = DriverUnload ;
return STATUS_SUCCESS ;
}
编译后 放入虚拟机中。打开DebugView ,设置一下 内核捕捉。
然后用驱动加载工具 加载并运行。是不是发现虚拟机卡住了?因为我们在DriverEntry里面写了这句话:
#if DBG
_asm int 3 ;
#endif
调试模式下,调用系统中断3 。开启windbg(符号链接 设置等省略),进行双机调试。 按下g 键继续运行,这个时候 Debug View 有输出:
停止驱动,并卸载
显示以上信息,表明我们第一个驱动写完并成功了。
总结:
1. 驱动运行与系统内核空间,EXE运行于系统之上的用户空间
2. DriverEntry 是驱动入口,两个参数(PDRIVER_OBJECT 驱动对象,可以理解为驱动本身; PUNICODE_STRING 驱动在注册表中路径 )
3. DriverUnload 是驱动动态卸载函数,功能:驱动卸载之前释放一些系统资源,比如:对象资源、内存、句柄释放、内存属性等
4. win32驱动不需要考虑驱动签名问题。