调试第一个KMDF驱动程序

菜鸟WDF驱动开发系列(2):调试第一个KMDF驱动程序
2012-07-22 00:15:03
标签: WDF开发  windbg  驱动调试
原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 http://joeyliu.blog.51cto.com/3647812/937826

根据系列上一篇的内容,已经基本作好了驱动调试环境的配置,现在着手开始试一下怎么用WinDBG调试。每一位新手在开始学习驱动开发的时候相信总会看大量的资料,如我第一篇提到的几本书的确是不错的,但名著总有一个问题就是,开篇一开始总是会铺陈太多的基本理论,这会让我们觉得手足无措,更不知如何下手。个人的经验是,直接从例程入手,理论要逐步了解——我说这话的主要原因是:我对驱动开发的理论一点也不清楚。反正,先从调试第一个驱动程序开始吧,这其中涉及驱动的安装、windbg的使用相关知识,慢慢来吧。

(1)驱动程序的安装

先不管什么HelloWorld吧,反正个人觉得做那种例程也就是Ctrl+C、Ctrl+V,意义不大。大家先从http://down.51cto.com/data/457277这里下载本篇涉及到的驱动程序,其中CharSample文件里是要用到的驱动程序,里面包含源文件与编译好的sys驱动文件,这是个KMDF驱动,那个UMDFSample的文件夹里的是UMDF驱动的源文件,暂时不用到,因为相关所以一并放在一起,至于KMDF与UMDF的概念大家尽量度娘吧。CharSample驱动是从武安河老师的书里拷出来的,其主要用途是将输入0~9的CHAR字符转成零~玖的CHAR[2]中文字符,本来武老师一并有应用程序来调用驱动的,但由于鄙人对控制台程序极度不感冒,而且用起来有问题,于是自己修改出了一个对话框应用程序用于测试,就是那个CharSampleWin.exe,编译环境是VS2010(都什么年代了,还是放弃VC6吧)。

先将CharSample文件夹拷到虚拟机的XP系统下,打开控制面板,选择“添加硬件”——选“我已经连接此硬件”——选“添加新的硬件设备”——手动安装,最后定位到CharSample\sys\objchk_wxp_x86\i386目录,选指定的inf文件,然后就可以安装成功了,你可以进入设备管理器,里面会添加一项CharSample的驱动,表明安装驱动成功。(注:如果提示缺少WdfCoInstaller01007.dll,请诸位自行Google加到目录下,在Win7下好像要用WdfCoInstaller01009.dll的)

(2)测试驱动是否正常工作

将CharSampleWin.exe拷到虚拟机中,双击打开,先点击“开启驱动KMDf”,提示驱动开启OK后,再点“随机转换KMDF”,如果如下图将数字成功转成中文,那表示驱动工作状态很好,如下图。这里的随机数我用的是伪随机数,测试而已就不需要太纠结了。

图1 

图1

(3)WinDBG的相关设置

打开上一篇已经配置好的WinDBG的快捷方式,如果成功与虚拟机连接成功,会在Waiting to reconnect...的文字后面列出一大串的东西,如下图所示,我是已经配置好的,所以可能与大家呈现出来的东西不一样。在File的标题栏中,设置Symbol Serch Path的内容为“E:\CharSample\sys\objchk_wxp_x86\i386;”,设置Source Serch Path的内容为“E:\CharSample\sys;”,注意路径与要大家自己放的目录一致。Symbol File是所谓的符号文件,具体作用我还真一知半解,大概是驱动与源代码之间的一个桥梁关系,否则,Soure File自然是用来断点调试的啦。(此处的路径是指本机的,并非目标虚拟机里的)

 图2

(4)进行断点

好了,当WinDBG与虚拟机连接成功之后,估计虚拟机就死在那里不动了,在命令窗口的命令行中敲入“g”,按回车,命令窗口底下提示Debuggee is running...,目标系统正常运作了,你再在WinDBG的标题栏选Debug--Break,系统又挂了,这大概是进入了调试模式,这两个操作蛮有趣的,也最常用。

在Break后,在命令行敲入:.reload,加载内核的符号,提示如下:

 

图3

键入:lm l,显示系统的驱动符号文件列表(大概这样表述吧),如下图所示,其中有一行显示的是驱动CharSample的符号是本地,这已经是成功的一大半了。

 

图4

键入:ld charsample,将CharSample驱动进程附加到WinDBG中,表示我们可针对其作我们自己想作的调试,如下图所示:

 

图5

在File--Open Source File,打开E:\CharSample\sys下的queue.c文件,这是驱动的主要工作代码,数字的转换就在这里进行操作的。将光标移至源代码的可断点的某处,键入:bp,则该处红色高亮显示,表示在此处设置好断点。

这时回到目标系统,点击“随机转换KMDF”,则目标系统死机,WinDBG代码断点处紫色高亮显示,就是驱动程序运行到此处停止了,断点成功,如下图显示。剩下怎么看变量的状态,要么看下一篇,要么自行寻找WinDBG的相关教程呗。

 

图6

 

本文出自 “几缕萧雨锁清秋” 博客,请务必保留此出处http://joeyliu.blog.51cto.com/3647812/937826

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KMDF 驱动中,可以使用 Windows 内核提供的文件系统相关的 API 来写入数据到磁盘的任意位置。以下是一个简单的示例: 1. 首先使用 `ZwCreateFile` 函数打开目标文件,可以指定 `FILE_WRITE_DATA` 访问权限和 `FILE_RANDOM_ACCESS` 标志位,以便进行随机访问。 2. 使用 `ZwWriteFile` 函数将数据写入到文件中。需要指定写入的字节数、写入的偏移量以及要写入的数据缓冲区等参数。 3. 最后使用 `ZwClose` 函数关闭文件句柄。 下面是一个简单的示例代码: ```C NTSTATUS WriteDataToFile(LPCWSTR FilePath, ULONG Offset, PVOID Buffer, ULONG Length) { HANDLE FileHandle; IO_STATUS_BLOCK IoStatusBlock; UNICODE_STRING FileName; OBJECT_ATTRIBUTES ObjectAttributes; LARGE_INTEGER FileOffset; // Convert file path to UNICODE_STRING RtlInitUnicodeString(&FileName, FilePath); // Initialize object attributes InitializeObjectAttributes(&ObjectAttributes, &FileName, OBJ_CASE_INSENSITIVE, NULL, NULL); // Open the file for writing NTSTATUS status = ZwCreateFile(&FileHandle, GENERIC_WRITE, &ObjectAttributes, &IoStatusBlock, NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_OPEN, FILE_RANDOM_ACCESS, NULL, 0); if (NT_SUCCESS(status)) { // Set the file offset FileOffset.QuadPart = Offset; // Write the data to the file status = ZwWriteFile(FileHandle, NULL, NULL, NULL, &IoStatusBlock, Buffer, Length, &FileOffset, NULL); // Close the file handle ZwClose(FileHandle); } return status; } ``` 在调用 `WriteDataToFile` 函数时,需要指定要写入的文件路径、写入数据的起始偏移量、要写入的数据缓冲区以及要写入的数据长度等参数。例如: ```C WriteDataToFile(L"C:\\test.bin", 0x1000, pData, 0x100); ``` 这将从文件 `C:\test.bin` 的偏移量 `0x1000` 处开始写入长度为 `0x100` 字节的数据缓冲区 `pData`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值