1、WDK下载地址:windows driver kit
https://connect.microsoft.com/default.aspx
2、第一个列子:first.c
#include <ntddk.h> //卸载函数 VOID DriverUnload(PDRIVER_OBJECT driver) { DbgPrint("first: Our driver is unloading...\r\n"); } //DriverEntry是入口函数 NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path) { #if DBG _asm int 3 #endif DbgPrint("first: Hello World!\r\n"); //设置卸载函数 driver->DriverUnload = DriverUnload; return STATUS_SUCCESS; }
不只需要first.c这样的源码文件,还需要makefile和sources两个文件。
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
TARGETNAME=first //生成模块的名称,此文件为first.sys TARGETTYPE=DRIVER //生成的文件类型,比如DRIVER生成.sys,DYNLINK生成.dll TARGETPATH=obj //生成bin文件的目录 SOURCES= first.c //文件列表,多个用空格分隔,推荐用\换行,此处不写头文件,只有.c
在打开的控制台中,进入代码所在的目录,输入build命令。如果有错误会提示,如果没有问题,就编译完成。
文件下会生成\objchk_wxp_x86\i386\first.sys的文件。
4、安装驱动:(卸载也用此软件)
建议,不要在本机进行安装调试,应该放置到虚拟机上。
下载并安装srvinstw.exe,
在srvinstw.exe中,安装驱动步骤:
选择“安装服务”选项->本地计算机->输入服务名称(随意起,可以不与sys相同,但不能与现有服务冲突)->选择SYS文件->选择“设备驱动”选项->选择“手工”选项。
5、启动/停止驱动:
控制台中命令
启动服务:net start 服务名
停止服务:net stop 服务名
6、查看驱动输出信息:
程序中可以使用DbgPrint来打印信息,不可以采用对话框的方式,因为系统底层是无法弹出的。
使用软件DebugView来查看内核程序的输出情况,软件一定要勾选 Capture Kernal 才能看见内核的输出。
7、调试内核模块
下载并安装WinDbg,支持双机调试,即将驱动安装到另一个机器上,在本机进行调试。
主要推荐在虚拟机中运行内核程序,在本机进行调试,这样可以避免本机的蓝屏等问题。
8、设置被调试的机器
XP:
在boot.ini中添加最后一行,内容如下:
[boot loader] timeout=30 default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS [operating systems] multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect /debug /debugport=com_1 /baudrate=115200
其中debugport是关键,一定要和虚拟机上的串口名称设置一致。
重启XP时,就会有debug模式的XP,进入被调试的环境。
vista、win7:
控制台中,
bcdedit /enum OSLOADER bcdedit /copy {current} /d "Windows 7 Copy" bcdedit /debug on bcdedit /bootdebug on bcdedit /timeout 7
新建一个命名串口:Serial Port->Output to named pipe
注意,名称要与boot.ini中的一致。
启动虚拟机,启动程序即可。
10、启动WinDbg
启动时要设置参数:
windbg.exe -b -k com:port=\\.\pipe\com_1,baud=115200,pipe
注意参数值和上面设置的一致。
11、设置WinDbg
启动windbg时,会使虚拟机中断,在符号"kd>"后输入“g”继续。
在WinDbg中设置内核符号表来翻译函数名:
在 菜单 symbol File Path 中 设置 :
srv*d:\symbols*http://msdl.microsoft.com/download/symbols;如果有原文件,可以在后面添加源文件路径,这样在调试时,就可以看见源文件了。
D:\MyProc\WDK\firstTest\objchk_wxp_x86\i386
由于驱动加载时,设置断点不方便,所以可以在程序中设置INT 3断点,来帮助产生中断,这样在调试的时候,就会自动中断了。
但是INT中断如果不是在调试状态下,会直接导致蓝屏,所以通常加载宏条件。
#if DBG _asm int 3 #endif
由于此部分书中仅仅简单的介绍,所以这个部分在后期会填补链接。