macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1350回复:7

还是关于filemon的问题?

楼主#
更多 发布于:2002-04-03 14:03
用户被禁言,该主题自动屏蔽!

最新喜欢:

simonlausimonl...
macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-04-03 14:05
用户被禁言,该主题自动屏蔽!
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-04-03 15:13
主要的例程:
FilemonFastIoRead
FilemonFastIoWrite
FilemonFastIoDeviceIoControl
IRP_MJ_READ
IRP_MJ_WRITE
IRP_FILE_SYSTEM_CONTROL
IRP_MJ_DIRECTORY_CONTROL
Tom_lyd
macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-04-03 17:33
用户被禁言,该主题自动屏蔽!
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-04-04 09:15
这个问题很好解决。
    要判断是不是你的目标,也就是你感兴趣的行为发生了,或者说你设置的目录、文件正在被操作。你首先可能需要在应用程序端设置这些参数。比如说加密目录名、文件名,将这些参数传递到驱动程序中作为全局变量保存起来(以后在驱动程序中访问它们一定需要同步)。然后在驱动程序的分发例程中,每次响应一个请求(IRP或者FastI/O),都先根据传入的参数FileObject得到文件完整路径名。(FileObject在IoGetCurrentIrpStackLocation->FileObject,在Fast I/O 例程中则直接在传入的参数中)。得到完整路径名后,再和用户端设置的路径相比,如果相同,则执行加解密操作,否则,直接调用低层驱动程序。
    相关流程:
    在Dispatch例程里(Normal I/O && Fast I/O)
     if(Normal I/O)
     PFILE_OBJECT pFileObject=IoGetCurrentIrpStackLocation(pIrp);
     GetFullPathOfThisFilbObject(pFileObject);//这个功能怎么实现,请参阅Filemonitor中的相关源码。
     if(FULLPATH(pFileObject)==*pRequiredProcess)//pRequiredProcess为全局指针,保存着用户设置的加密目录名。
{
     if(pIrp->MajorFunction==IRP_MJ_READ or related read)
     IoSetCompletionRoutine(pIrp,ReadCompleted,1,1,1);
     set the next layer stack location;
     IoCallDriver(pLowerDevice,pIrp);
     return  STATUS_MORE_PROCESSING_REQUIRED;
}

ReadCompleted(...)
{
    此时文件已经读出,根据你对缓冲区使用方法的设置,文件内容存在于不同的位置,并且根据文件大小的不同,可能需要串行I/O的访问;
    PCHAR pContext=pIrp->AssociatedIrp->SystemBuffer;
    PCHAR pDecode= 解蜜(pContext); //这里需要你自己的算法
//需要注意的是,I/O 完成例程的IRQL一般为DISPATCH_LEVEL,不允许有分页内存,你可以选择使用一个DPC例程,这是更好的办法。我只是作一个示例,另外,还有几个相关的IRP,处理方法类似。
  return;
}

Best regards !
Tom_lyd
macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2002-04-04 09:51
用户被禁言,该主题自动屏蔽!
macy
禁止发言
禁止发言
  • 注册日期2001-12-19
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分6383分
  • 威望48270点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2002-04-04 16:37
用户被禁言,该主题自动屏蔽!
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-04-04 20:19
    You should can see the content of the specified file in the completion routine,but any completion routine run in the lower device\'s context,DISPATCH_LEVEL normally,so you should be careful enough to use memory.
Tom_lyd
游客

返回顶部