KeyGhost
驱动牛犊
驱动牛犊
  • 注册日期2002-03-08
  • 最后登录2002-10-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1459回复:9

对文件过滤驱动感兴趣的朋友请进~

楼主#
更多 发布于:2002-06-20 01:03
我现在正在做一个文件过滤驱动,目前能对文件的读写操作进行控制,但我想实现一个交互功能,当受保护文件被读写时,请求被挂起,交给用户进行选择处理,然后根据用户的选择再返回驱动层继续对该请求进行相应的处理。怎样才能实现请求的挂起呢?请高手赐教,谢谢!

最新喜欢:

znsoftznsoft
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-06-21 08:55
[quote]不用的啊!你拦截每一个盘的创建请求,就是IRP_mj_create然后得到请求文件名,判断,之后就是修改FILE_object的标志就可以了


guardee兄,怎么修改标志啊?能详细说说吗? [/quote]
在file_OBJECT里面有一些标志的啊!在结构里面主要观察这些成员,试试修改,特别是在IRP堆栈里面的一个成员关于是那个成员,自己试试看吧!反正是和_rp_mj_create有关的
    PVOID PrivateCacheMap;
    NTSTATUS FinalStatus;
    struct _FILE_OBJECT *RelatedFileObject;
    BOOLEAN LockOperation;
    BOOLEAN DeletePending;
    BOOLEAN ReadAccess;
    BOOLEAN WriteAccess;
    BOOLEAN DeleteAccess;
    BOOLEAN SharedRead;
    BOOLEAN SharedWrite;
    BOOLEAN SharedDelete;
    ULONG Flags;
KeyGhost
驱动牛犊
驱动牛犊
  • 注册日期2002-03-08
  • 最后登录2002-10-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-06-21 00:47
我建议你这样做:
1.在应用程序层创建EVENT
CreateEvent()
2.通过DeviceIoControl将事件句柄传给驱动程序
3.驱动程序在Dispatch例程中通过ObReferenceObjectByHandle将事件句柄转化为驱动程序可用的指针
4.在IRP_MJ_CLOSE中,调用ObDereferenceObject释放对事件对象的应用。
  


谢谢版主热情的帮助我,我有一点还不明白,驱动层怎样通知应用层进行处理?它是怎样将共享Event传到应用层的呢?能贴一些相关的代码吗?
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-06-20 16:54
不用的啊!你拦截每一个盘的创建请求,就是IRP_mj_create然后得到请求文件名,判断,之后就是修改FILE_object的标志就可以了


guardee兄,怎么修改标志啊?能详细说说吗?
Tom_lyd
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-06-20 16:44
1、怎样在驱动层和应用层共享事件呢?是不是在驱动层KeInitializeEvent之后,这个Event能在应用层直接使用呢?反之也一样呢?


我建议你这样做:
1.在应用程序层创建EVENT
CreateEvent()
2.通过DeviceIoControl将事件句柄传给驱动程序
3.驱动程序在Dispatch例程中通过ObReferenceObjectByHandle将事件句柄转化为驱动程序可用的指针
4.在IRP_MJ_CLOSE中,调用ObDereferenceObject释放对事件对象的应用。



 
Tom_lyd
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-06-20 14:45
不用的啊!你拦截每一个盘的创建请求,就是IRP_mj_create然后得到请求文件名,判断,之后就是修改FILE_object的标志就可以了
KeyGhost
驱动牛犊
驱动牛犊
  • 注册日期2002-03-08
  • 最后登录2002-10-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-06-20 13:37
循环等待即可。
1.建立共享内存以交换数据
2.建立两个共享事件,一个用来通知应用程序被保护文件被触发,应用程序需要给出应答,把答案放在共享内存中。并置另一个共享事件,以通知应用程序已经作出应答,答案在共享内存中。
3.驱动程序然后到共享内存中去寻找答案,如果是肯定,则驱动程序执行此操作,否则失败此操作。
相关源代码如下:
LARGE_INTEGER timeout;
NTSTATUS   status;
timeout.QuadPart = -5*10000000; //设5 秒超时。
if( Protect File )
{
    写访问信息到共享内存,以使应用程序知道哪个文件触发了什么操作;
    KeSetEvent( Event1, 0, FALSE );//通知应用程序
    status = KeWaitSingleObject( Event2,Executive, KernelMode, FALSE, &timeout)
    switch( status )
    {
     case    STATUS_SUCCESS: //应用程序作出了回答
          查看共享内存获得应用程序的答案信息,作出反应;
          break;
     default:
          应用程序没有应答或超时,按否定处理;
          break;
    }
    
}


谢谢,我还有一个问题:
1、怎样在驱动层和应用层共享事件呢?是不是在驱动层KeInitializeEvent之后,这个Event能在应用层直接使用呢?反之也一样呢?
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-06-20 09:35
循环等待即可。
1.建立共享内存以交换数据
2.建立两个共享事件,一个用来通知应用程序被保护文件被触发,应用程序需要给出应答,把答案放在共享内存中。并置另一个共享事件,以通知应用程序已经作出应答,答案在共享内存中。
3.驱动程序然后到共享内存中去寻找答案,如果是肯定,则驱动程序执行此操作,否则失败此操作。
相关源代码如下:
LARGE_INTEGER timeout;
NTSTATUS   status;
timeout.QuadPart = -5*10000000; //设5 秒超时。
if( Protect File )
{
    写访问信息到共享内存,以使应用程序知道哪个文件触发了什么操作;
    KeSetEvent( Event1, 0, FALSE );//通知应用程序
    status = KeWaitSingleObject( Event2,Executive, KernelMode, FALSE, &timeout)
    switch( status )
    {
     case    STATUS_SUCCESS: //应用程序作出了回答
          查看共享内存获得应用程序的答案信息,作出反应;
          break;
     default:
          应用程序没有应答或超时,按否定处理;
          break;
    }
    
}
Tom_lyd
zhangyl
驱动牛犊
驱动牛犊
  • 注册日期2001-07-18
  • 最后登录2009-03-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-06-20 09:27
如果是9x,这是一个不可能的任务,别浪费时间了。。。
如果是2000,是可以的
签名是什么?
magicx
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2014-08-18
  • 粉丝1
  • 关注0
  • 积分-14分
  • 威望13点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-06-20 02:39
我现在正在做一个文件过滤驱动,目前能对文件的读写操作进行控制,但我想实现一个交互功能,当受保护文件被读写时,请求被挂起,交给用户进行选择处理,然后根据用户的选择再返回驱动层继续对该请求进行相应的处理。怎样才能实现请求的挂起呢?请高手赐教,谢谢!


\"怎样才能实现请求的挂起呢?\"

返回pending。。。。。。。。。。。。

 :)
[color=red]大头鬼! :P[/color]
游客

返回顶部