文件过滤驱动之一

终于到了礼拜天,抓紧时间写了段文档。
由于不是一次两次就能说的清楚,所以我分块来说明,这篇希望能讲解出一个驱动的框架,以后的讲解就在这个框架的基础上深入展

开。
对于文件过滤驱动的整体描述,我认为下面这个帖子里codewarrior(会思考的草) 说的很不错,在次感谢
http://community.csdn.net/Expert/topic/4849/4849948.xml?temp=.1946985

这里先对ddk里面几个基础的东东大概说明下:

入口函数:
和win32编程一样,驱动也有一个入口函数DriverEntry(相当于main WinMain),这里注意他们之间的运行方式是不同的,win32入口

函数后是进入消息循环,驱动DriverEntry的主要功能是注册一些IRP的相当于回调处理方式的函数,也就是我们所说的派遣函数。。
IRP:
IRP(I/O 请求包),驱动编程里十分重要的概念,说白了它就是一个数据结构,里面有对应操作需要的数据,比如我们应用层调用了

CreateFile函数,在驱动层可能就构建一个IRP(IRP_MJ_CREATE),通过这个IRP的处理完成对应操作,如果我们对用户打开,创建文件

等操作有兴趣(比只允许指定程序打开对应文件),就可以通过挂接的方式让系统将这个IRP发送到我们指定的函数(就是

DriverEntry里面指定的),然后...
CDO:
CDO(ontrol Device Object),控制设备对象,这个对象代表这个驱动,它是供我们应用层的程序使用的,在DriverEntry里面创建

它,注意它没有设备扩展。这里有必要说一下一般见到说的DO(device object),DO是用来绑定到文件系统驱动的FDO上的,和CDO

不同。他们都使用IoCreateDevice函数创建,注意区别。
Device Extension:
Device Extension(设备扩展),使用IoCreateDevice创建DO等时通过第2个参数来指定,其实它就是一块保存有用数据的内存,这

里一般就是一个结构体。请注意它会随DO一起传递,这就是它的关键好处所在。
就讲这几个了,还有很多,用到的时候再说,下面先从DriverEntry说起。
DriverEntry一般都下面这样的形式,2个参数的类型都带了P,相信大家一看就知道是指针形式,加下注释
NTSTATUS
DriverEntry (
    IN PDRIVER_OBJECT DriverObject,//指向系统创建的我们的驱动对象
    IN PUNICODE_STRING RegistryPath//驱动注册key的路径
    )
首先需要做的是申明一个全局的PDRIVER_OBJECT变量,保存我们的DriverObject,因为我们在其他地方可能会用到它,然后就是取得

一些需要使用函数的地址,存放在全局变量中,这里不说这个。接着就可以创建我们的控制设备对象了,就是前面说的CDO,创建它

使用函数IoCreateDevice,如下:

DEVICE_OBJECT   * ourCDO = NULL;//注意这个变量是全局,为了看的清楚我才放在这里!!!!!!!!
                //我们的CDO控制设备对象,前面有说到它
    
NTSTATUS                    status = STATUS_SUCCESS;//返回值我让它默认为成功
UNICODE_STRING     Name_2k;//请注意我这里加了个2k,是为了引起大家的注意,因为XP系统里下面那个串会不   

                     //一样
RtlInitUnicodeString(&Name_2k,L"//FileSystem//OurFilter_Cdo");//就是这个串,xp下是                                  

                                   

//L"//FileSystem//Filters//OurFilter_Cdo"
status  =  IoCreateDevice(DriverObject,//我们的驱动程序对象
  0,//扩展设备的大小,就是前面说的Device Extension,还记得前面说的CDO没有设备扩展吗      

                 //?,所以置0
  &Name_2k,//设备名称
  FILE_DEVICE_DISK_FILE_SYSTEM,//设备的类型
  FILE_DEVICE_SECURE_OPEN,//指出设备所允许的操作
  FALSE,//TRUE表示只能有一个线程使用该设备,FALSE则没有1个使用的限制
  &ourCDO //返回的控制设备对象CDO
  );
if(!NT_SUCCESS(status))//如果创建控制设备对象失败,退出
 return status;

接下来我们可以创建一个Win32可见的符号连接
UNICODE_STRING     Link_2k;
RtlInitUnicodeString(&Link_2k,L"//DosDevices//OurFilter");
status = IoCreateSymbolicLink(&Link_2k ,&Name_2k);
if(!NT_SUCCESS(status))
 return status;

到这里后我们就可以设置我们的派遣函数了,前面说过了,就是能处理到IRP的函数,具体怎么设置,我先以一个简单的为了动态御

载而设置的DriverUnload函数为例子来说明,该函数会在御载的时候调用,设置这个函数的代码大致如下:

先声明函数,为了使DriverEntry可见,所以一般是在对应的头文件里面声明
void DriverUnload(IN PDRIVER_OBJECT DriverObject);
接着在DriverEntry里添加
//设置Unload
DriverObject->DriverUnload = DriverUnload;
至于DriverUnload函数都需要做些什么,主要就是一些DO ,CDO等的删除,资源的释放,取消挂接等等,这里由于我们上面的操作比

较简单,所以需要释放的东东也就不多
void DriverUnload(IN PDRIVER_OBJECT pDriverObject)
{
                UNICODE_STRING uniNameString;
               
                RtlInitUnicodeString(&uniNameString, L"//FileSystem//OurFilter_Cdo");
                IoDeleteSymbolicLink(&uniNameString);        //删除win32可见
                IoDeleteDevice(pDriverObject->DeviceObject);        //删除设备
               
                return ;
}

到这里,一个最基本的驱动框架也就出来了,加入DbgPrint()调试信息,编译得到XX.sys后装载调试完全可以看到输出的调试信息
,由于DriverUnload的设置使其能支持动态御载,如何编译调试等这里就不说了。以后的资料就在这个框架的基础上扩展。

再次说明一下,由于是在网吧匆忙写的,加上水平很菜,没说清楚或有错误请大家指出,有时间我会把后面的都写出来,希望对大家

有帮助

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值