驱动程序一般调试手段及方法

Windows驱动程序的难于调试是众所周知的,调试步骤繁琐,而且内核环境下固有的多线程环境和代码执行的顺序不确定性,更增加了调试的难度,我自己感觉最好的办法,就是利用DbgPrint(我自己则最常使用KdPrint)打印出足够多的信息,以便于我们分析。下面是一些打印出详细trace的一些手段:

  1. 利用__LINE__ __FILE__以及__FUNCTION__定位代码位置

这几个编译器指令分别指示当前代码所在的行号、文件名和函数名;你可以在你的代码中定义如下的宏:

#define DBG_TRACER "%s(%d)-%s"

#define DBG_ARGS __FILE__,__LINE__,__FUNCTION__

然后,你可以像这样使用这两个宏:

KdPrint((DBG_TRACER"你的字符串消息/n",DBG_ARGS));

      2.   利用Osr上的OsrNTStatusToString将你的NTSTATUS状态码值转换成对应的字符串值:当你要打印一个错误状态码时,直接打印出表意的字符可能会为你节省一些时间;

     3.   打印UNICODE_STRING:本来这是一个比较easy的事情,但是驱网上不时有人说到微软给的sfilter例子里面获取文件全路径名的函数无法获取中文路径,实际是不是不能获取,而是KdPrint打印的时候,没有把中文字符打印出来,我自己的办法是转换成ANSI_STRING,然后再打印出来,代码如下:

VOID DbgPrintUnicodeString(__in PUNICODE_STRING UniStr)
{
    ANSI_STRING AnsiStr;
    NTSTATUS status;

    status = RtlUnicodeStringToAnsiString(
&AnsiStr ,UniStr,TRUE);

    if (NT_SUCCESS(status))
    {
        KdPrint((AnsiStr.Buffer));
        RtlFreeAnsiString(
&AnsiStr );
    }
}

     4.   利用Filemon中的代码:Filemon本身是很有用的一个工具,当然,它的源代码也是一座金矿,你可以从中学到很多东西。利用FileMon中的若干代码,可以将对应的IRP转换成对应的字符打印出来(FileSpy或者MiniSpy中的PrintIrpCode可以做同样的事情);也可以将FileInformationClass对应的字符打印出来;最后,你可能用到的最多的,就是将FileMon中的打印当前进程名的代码捣鼓出来自己使用,稍加改变,你也可以用它来打印任意一个你获取了PEPROCESS进程指针的进程名(注意在一个较低的IRQL下使用它);

     5.   文章的最后,给出一些其他的代码,包括:打印IRP的Flags值、打印FILE_OBJECT的Flags值、打印Volume的DeviceType值以及打印FILE_OBJECT结构中的BOOLEAN值设置,代码中也包括了上文提到了从filemon中抽出的部分代码,都是些体力活,如果你自己不想写,直接下载我写的就好;最后需要说明的是,Osr_NtStatusToString是GLB大哥无私地传给我的,GLB大哥对我的很多其他的帮助我无法通过更多的方式来回报,借发布这个资源的机会表达我心中无限地感激和谢意!

Osr_NtStatusToString:http://download.csdn.net/source/429173

Filemon源代码:http://download.csdn.net/source/429179

我自己的一些调试信息打印代码:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值