1. WDK windows Driver Kit 下载并安装在本机上,安装路径要避免有空格,最新版本还会集成了WinDbg,很方便
2. 然后编写第一个工程
******驱动主程序myfirst.c
#include <ntddk.h>
//卸载函数
VOID DriverUnload(PDRIVER_OBJECT driver)
{
DbgPrint("first:Driver is unloading.../r/n");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
#if DBG
_asm int 3
#endif
//内核模块的入口
DbgPrint("first:Hello, Puztion!/r/n");
//设置一个卸载函数
driver->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}
***********************分割线*********************
******有一个makefile文件
!IF 0
Copyright (C) Microsoft Corporation, 1999 - 2002
Module Name:
makefile.
Notes:
DO NOT EDIT THIS FILE!!! Edit ./sources. if you want to add a new source
file to this component. This file merely indirects to the real make file
that is shared by all the components of Windows NT (DDK)
!ENDIF
!INCLUDE $(NTMAKEENV)/makefile.def
其实上这段英文的意思就是说,这个文件内容好无聊,你永远也不要修改他(ps:我大致翻译了一下,意思应该差不多)看了这个文件的结构,其实就是最后一行起作用的:
!INCLUDE $(NTMAKEENV)/makefile.def
***********************分割线*********************
******有一个SOURCES文件
TARGETNAME=first
TARGETTYPE=DRIVER
TARGETPATH=obj
SOURCES=myfirst.c
其中TARGETPATH这行指定生成驱动所在的路径/obj/first.sys
其他看英文就差不多知道意思了
3. 在wdk运行 在对应系统的x86 Checked Build Environment下进入上述文件目录
build 就可以生成了
还有,特别注意,那三个文件的对应目录不能出现空格
build -c 是清楚先前生成的文件,重新生成
4. 要用到的工具有如下
Dbgview //用于查看内核的输入和输出
SRVINSTW //用于创建服务来加载驱动
DriverMonitor //用于加载驱动
Kernel Detective //一款集成的工具,可以查看内核,查看驱动信息等等
5. Dbgview 要注意的是要把 Capture Kernel 勾选上,捕获内核输出信息
6. SRVINSTW 要注意的是
①在输入目标程序路径的时候是无法选中sys文件的,要手动输入路径
②选择设备驱动
③NT驱动目标不用,要设置为手动启动服务
④要记得服务名,在windows服务管理里是看不到这个服务的,要用SRVINSTW来卸载服务
⑤用 net start/stop 服务名 这命令就可以启动对应的服务
7. DriverMonitor暂时还不是很会用,就会加载便行
8. 用WinDbg双机调试驱动,在vmware 里添加一个 串口(Serial Port)然后使用管道 命名为 //./pipe/com_1 (这个一般是默认的), 选择 this other end is an application。
9. 在 虚拟机中的系统 的启动文件 添加多一个启动方式,就是复制原先的一个启动方式,后面加上 /fastdetect /debug /debugport=com1 /baudrate=115200
10. 创建一个批处理启动WinDbg
start windbg.exe -b -k com:port=//./pipe/com_1,baud=115200,pipe
11. 然后在WinDbg里 FILE->Symbol File Path中选择生成 sys驱动文件的目录 以去加载符号文件
12. 调试中
g: 运行
u: 反汇编
bp: 下断点
bl: 列出断点
be: 启动断点
bd: 停止断点
bc: 删除断点
一般上指令和一般的debug差不多