上一篇内容里已经讲到了如何搭建双机通信,这也是为内核态下的驱动程序调试做准备。众所周知,KMDF驱动程序主要分为两个部分的代码,一个是包含DriverEntry、DeviceAdd和一些对于触发事件的回调函数,下面我会统一称为驱动程序;另一部分则是从用户态上发出一些IO指令请求,需要驱动程序来做出应答,通常使用的是CreteFile或者IoDeviceControl这些函数,这部分我叫它应用程序。
无论是驱动程序还是应用程序都是一种代码,所以也可以像我们写C或者Python代码那样进行调试,这也是直接观察到程序运行正确与否的最佳手段。驱动程序的调试稍微要麻烦一点,下面就来仔细介绍一下。
(1) 首先驱动程序是运行在内核态下的,一般的打印语句print是显示不出来的,这里我使用的是KdPrintEx语句,将鼠标放到VS的KdPrintEx()上就会看到 #define KdPrintEx() DbgPrintEx,所以这个语句实际上也是DbgPrintEx的宏定义。
同时内核态下的打印语句也是需要优先级值的,为了保证打印出来,可以直接设置该语句为:KdPrintEx((DPFLTR_IHVAUDIO_ID, DPFLTR_ERROR_LEVEL, “打印字样”)) 。如果还是不能看到打印信息,需要在注册表里重新设一个值, HKEY_LOCAL_MACHINE\SYSTEM
CurrentControlSet\COntrol\Session Manager\Debug Print Filter
设置值为 “DEFALULT” = dword:0000000F
(2) 在Debugging 通信之前,先得确保驱动程序的代码没有错误,编译通过,可以在工具栏里选择“生成”,下拉框里选择 “生成‘项目名’”,如果下面输出框内没有报错&