http://blog.csdn.net/syf442/article/details/4562976
看了这篇文章,按照其讲述和代码,自己也再vs2010上编写了一个内核读写文件操作的小驱动。在这个过程中学习到其中用到的几个内核函数的用法,也发现了这个小教程中的一点小错误。花了2个晚上的时间调试,虽然很费时间,windows的函数都很复杂,调试起来又很费劲。所以记录一下,以后遇到类似问题也可以参考一下。
这个小驱动大概的流程是:
建立一个线程(用到PsCreateSystemThread函数) =》线程中定义了一个此线程首先调用的函数,自己写好这个函数,作为建立文件、写文件的入口函数
=》在此函数中创建新文件或者打开文件(参数FILE_OVERWRITE_IF)(都是用ZwCreateFile函数,每个参数很重要,需要时要仔细参考MSDN,好好分析。它关系到后面可以对这个文件所进行操作的权限)
KdPrint(("status:%08x\n",status));
在调试中可以加上这句,打印ZwCreateFile函数的返回值。返回值是用16进制表示的,其对应的含义(宏)可以参照
http://wenku.baidu.com/view/06a8444be45c3b3567ec8bcc.html通过英文含义可以了解错误所在。
=》建立或者打开了文件,要调用ZwWriteFile函数,这个函数相比上一个函数比较简单
=》最后掉用ZwClose函数关闭文件句柄
=》之后回到EntryDriver函数可以按照正常情况写个unload函数
这就是简单的文件操作流程
最后说一下上面那个帖子的错误:
第一个是它换行符写错了。。比较低级“\n”写成了“/n”。应该是回车上面的那个反斜线
第二个也是这个反斜线的问题,这个问题会使驱动不能正常运行,到不至于蓝屏。就是顶一文件路径的时候
UNICODE_STRING ufile_name = RTL_CONSTANT_STRING(L"\\??\\C:\\test.txt");
这是正确的,注意斜线别写反了方向,参考的blog中就写反了。导致我调试了好久都不行,总是报错:STATUS_ACCESS_DENIED出现这个错误信息。
一直都没注意到这个斜线的问题,以后这个问题应该是记住了,自己写的时候肯定不会再出这种错误了。
再加点用到的windbg命令,这次调试主要用到了以下几种命令和视图:
1. r @esi (r @寄存器名字) 返回结果是这个寄存器目前保存的值
2.lm命令,一个比较基础的命令。可以返回现在运行的符号链接库,包括现在正在调试的驱动的符号链接,pdb。
3.watch视图,以前用eclipse的watch视图一样,可以看变量的类型和值,还有local视图等等