xiemeng
驱动牛犊
驱动牛犊
  • 注册日期2007-06-22
  • 最后登录2007-07-08
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
阅读:1909回复:6

sfilter中获得IRP-MJ-READ全路径的问题!急!

楼主#
更多 发布于:2007-06-22 21:46
想获得读文件的全路径,已经郁闷几天了,希望哪位好心人能解答一下啊。

我是在sfcreate里面得到了路径,按sfilter的方法用sfgetfilename,然后把irp->fileobject,和获得的路径保存在一个结构里面,叫为filenode,是用filenode->fileobject=irp->fileobject,插入链表.

在sfread读里面,先查找读文件的irp->fileobject于链表里面的哪个fileobject相同,我是这样直接比较的,if(irp->fileobject==filenode->fileobject)就打印我filenode里面的路径。。。

但这样做好象不对,驱动安装后用net start就重起要不就死机了,有时能迅速在dgview看到几条信息都是在读里没有找到于链表一样的fileobject。
我想一了下有可能是在sfcreate的irp结束后,fileobject也消亡了,但应该不会的,,还是觉得是fileobject保存的问题,结构不知道是不是这样?

网上又找不到更多的资料,,,

有哪位大侠知道就告诉下偶吧~~才学驱动,郁闷了几天不行了。。。。
非常谢谢哦
liyunch
驱动小牛
驱动小牛
  • 注册日期2001-06-28
  • 最后登录2014-09-05
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望134点
  • 贡献值0点
  • 好评度94点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-06-22 21:55
不能把FileObject的值做为查询依据.不同进程的FileObject的值可能相同.
xiemeng
驱动牛犊
驱动牛犊
  • 注册日期2007-06-22
  • 最后登录2007-07-08
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-06-22 22:10
我也是这样想的,我开始是比较的fileobject的值,用rltcomparememory,比较两个fileobject的值,不对。。每个fileobject应该不同,
但我现在是用的fileobject的地址比较的啊~

irp-> fileobject是指向FILE_OBJECT的地址,如果fileobject没消亡,应该在creat和read里面是一样个位置的吧?

我看filemon里面还有别人一篇文章里面也是这样直接比较的,
就是指向FILE_OBJECT的指针是相等的。。。?

那如果不这样比较,那我怎么样查询我的链表呢?谢谢哦。。。

哎~第一次发贴呵呵~~
xiemeng
驱动牛犊
驱动牛犊
  • 注册日期2007-06-22
  • 最后登录2007-07-08
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-06-23 08:36
怎么没人理哦~随便说一两句也好啊...

没头绪哎~
XiangXiangRen
总版主
总版主
  • 注册日期2003-02-22
  • 最后登录2015-09-01
  • 粉丝13
  • 关注0
  • 积分1042分
  • 威望472点
  • 贡献值1点
  • 好评度145点
  • 原创分13分
  • 专家分1分
地下室#
发布于:2007-06-23 17:21
引用第3楼xiemeng于2007-06-23 08:36发表的  :
怎么没人理哦~随便说一两句也好啊...

没头绪哎~


重启,死机这样的错误,明显是编码错误导致的。你应该去查找你使用链表是否正确,是否导致了非法地址访问,是否重入,是否等待事件或者其他同步事件导致死锁,而不是问你上面问的那些问题。
xiemeng
驱动牛犊
驱动牛犊
  • 注册日期2007-06-22
  • 最后登录2007-07-08
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-06-24 13:14
我检查了很多遍我的代码了,代码很简单啊,只加了一点
在sfcreate里面,用的是sfilter带的可以返回路径的sfgetfilename,我用dgview看是对的,
我就把这个和irpsp->fileobject一起保存起来了.

然后就在sfread里比较,
我的sfread函数是这样的.,

    PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation( Irp );

   PFILEOBJECT_NAME readfilename = NULL ;
   ANSI_STRING dbgString;
   PSFILTER_DEVICE_EXTENSION devExt=DeviceObject->DeviceExtension;

   PAGED_CODE();

   if(IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject))
   {
    Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
    Irp->IoStatus.Information = 0;
    IoCompleteRequest(Irp, IO_NO_INCREMENT);
    return STATUS_INVALID_DEVICE_REQUEST ;
   }

   ASSERT(IS_MY_DEVICE_OBJECT( DeviceObject ));

   if (NULL == devExt->DiskDeviceObject)
   {
       IoSkipCurrentIrpStackLocation( Irp );

       return IoCallDriver( ((PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp );
   }

   readfilename = sfFindFile(irpSp->FileObject);
   if(readfilename)
   {
           dbgString.MaximumLength = 256;
           dbgString.Buffer = ExAllocatePool(NonPagedPool, , 256);
          if(dbgString.Buffer)
        {
              RtlUnicodeStringToAnsiString(&dbgString,readfilename->name,TRUE);
              DbgPrint("读:Size:%dByte,The file is:%s",dbgString.Length ,dbgString.Buffer);
              ExFreePool(dbgString.Buffer);
         }
   }
   DbgPrint("未读");
  
   IoSkipCurrentIrpStackLocation( Irp );

   return IoCallDriver( ((PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp );



查找函数sfFindFile是这样的:

PFILEOBJECT_NAME
sfFindFile(
    IN PFILE_OBJECT FileObject
    )
{  
   PFILEOBJECT_NAME p = head;
   while(p->fileobject)
   {            
         if(p->fileobject==FileObject)
       {
           return p;
       }    
       else p=p->next;
   }
   return NULL;
}


同样我在sfcleanupclose里也清除了的..


结果就是,要不启动后就重起,要不运行一会就死机,死机前都看到的是未读,就是比较没成功.!!!!!

链表保存的时候很简单,就是自己重新分配了一个name ,保存路径,(在清除时收回),再加上irpsp->fileobject一起是一个结构...


其他的我都没动呢~~

我在想是不是我比较函数有问题...

谢谢你的回复哦...:)
qiangguo64
驱动牛犊
驱动牛犊
  • 注册日期2005-01-12
  • 最后登录2009-08-28
  • 粉丝0
  • 关注0
  • 积分144分
  • 威望15点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-06-28 14:22
PFILEOBJECT_NAME
sfFindFile(
    IN PFILE_OBJECT FileObject
    )
{  
  PFILEOBJECT_NAME p = head;
  while(p->fileobject)  <<<<----------------------这个条件有问题吧,到最后一个节点时,p为空,
  {                                                   //取p->fileobject肯定就飞了,不重启都会飞
        if(p->fileobject==FileObject)
       {
          return p;
       }    
       else p=p->next;
  }
  return NULL;
}
游客

返回顶部