阅读:1908回复:6
sfilter中获得IRP-MJ-READ全路径的问题!急!
想获得读文件的全路径,已经郁闷几天了,希望哪位好心人能解答一下啊。
我是在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保存的问题,结构不知道是不是这样? 网上又找不到更多的资料,,, 有哪位大侠知道就告诉下偶吧~~才学驱动,郁闷了几天不行了。。。。 非常谢谢哦 |
|
沙发#
发布于:2007-06-22 21:55
不能把FileObject的值做为查询依据.不同进程的FileObject的值可能相同.
|
|
板凳#
发布于:2007-06-22 22:10
我也是这样想的,我开始是比较的fileobject的值,用rltcomparememory,比较两个fileobject的值,不对。。每个fileobject应该不同,
但我现在是用的fileobject的地址比较的啊~ irp-> fileobject是指向FILE_OBJECT的地址,如果fileobject没消亡,应该在creat和read里面是一样个位置的吧? 我看filemon里面还有别人一篇文章里面也是这样直接比较的, 就是指向FILE_OBJECT的指针是相等的。。。? 那如果不这样比较,那我怎么样查询我的链表呢?谢谢哦。。。 哎~第一次发贴呵呵~~ |
|
地板#
发布于:2007-06-23 08:36
怎么没人理哦~随便说一两句也好啊...
没头绪哎~ |
|
总版主
![]() |
地下室#
发布于:2007-06-23 17:21
引用第3楼xiemeng于2007-06-23 08:36发表的 : 重启,死机这样的错误,明显是编码错误导致的。你应该去查找你使用链表是否正确,是否导致了非法地址访问,是否重入,是否等待事件或者其他同步事件导致死锁,而不是问你上面问的那些问题。 |
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一起是一个结构... 其他的我都没动呢~~ 我在想是不是我比较函数有问题... 谢谢你的回复哦...:) |
|
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; } |
|