阅读:3352回复:18
FileObject->FsContext问题,lsxredrain, devia等高手请指一下路
我用的lsxredrain兄的filespy模型,正在解决FileObject的查询问题,在SpyCreate中对需要加密文件(c :\test.txt)的FileObjec->FsContextt的指针进行保存,然后再sfread和sfwrite中进行比较(没有使用Hash和Generictable保存,而是暂时只用一个全局变量保存FsContext),为什么我打开指定的加密文件(c :\test.txt),在SpyCreate中保存的fscontext在sfwrite和sfread中无法找到和其相等的,我以为是用notepad导致的缓存问题,但是文件换成c:\test.bmp文件依然无法定位(c:\test.bmp已经被画图板成功打开,即SfRead是处理完毕了的)
还请各位兄台指点一下迷津......,期待中 |
|
沙发#
发布于:2007-08-22 16:13
在SpyCreate需要同步一下
|
|
板凳#
发布于:2007-08-23 10:54
lsxredrain兄,我在spycreate中保存FsContext同步了的,下面是代码,请帮忙看看是哪儿的问题
NTSTATUS SpyCreate( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { 。。。。。 //-- tmpFileName = "C:\\test.bmp" if (RtlEqualUnicodeString(&tmpFileName, nameToUse, TRUE)) { status = SfForwardIrpSyncronously(DevExt->NLExtHeader.AttachedToDeviceObject, Irp) if (g_MyFileCtxPtr) { g_MyFileCtxPtr->FsContext = FileObject->FsContext; g_MyFileCtxPtr->RefCount++; ............. } } 在NTSTATUS SfWrite( IN PDEVICE_OBJECT DeviceObject IN PIRP Irp ) { ................. if (g_MyFileCtxPtr->FsContext == FileObject->FsContext) { KdPrint(("++++++ Encrypt 确定文件++++ C:\\test.bmp")); ..................... } else { IoSkipCurrentIrpStackLocation(Irp); return IoCallDriver(DevExt->NLExtHeader.AttachedToDeviceObject, Irp); } ...................... } 在SfWrite中比较始终无法比较成功 |
|
地板#
发布于:2007-08-23 13:46
FileObject->FsContext
g_MyFileCtxPtr->FsContext 这两个值都打印出来, 另外 g_MyFileCtxPtr->FsContext 是全局变量,你怎么同步? |
|
地下室#
发布于:2007-08-23 16:01
兄台,我定义了一个全局的Fast_Mutex,在为全局变量复值时候用ExAcquireFastMutex和ExReleaseFastMutex来同步,在SfRead和SfWrite中比较FsContext时也用这个全局的FAST_MUTEX来同步,但只有SfRead读可以,但SfWrite写就出错,我同步的位置和toolflat的SFilter中的地方相同。不知为何??
请问lsxredrain兄是如何同步的,能否给几行提示性的代码,万分感谢 |
|
5楼#
发布于:2007-08-23 16:32
使用 KeAcquireSpinLock( &gHashLockTable[hashIndex], &oldIrql );
KeReleaseSpinLock( &gHashLockTable[hashIndex], oldIrql ); SfForwardIrpSyncronously,SfUpdateFileByFileObject 来同步文件上下文表, SfWrite中为什么要写呢? 只有在spycreate 修改,其他地方只是读 |
|
6楼#
发布于:2007-08-24 12:20
不好意思,我表达出错,我是说在SfRead函数中可以比较成功,
在SfWrite写函数中就无法比较成功,我把FileObject->FsContext g_MyFileCtxPtr->FsContext 都打印出来了的但是就是没有相同的 难道是同步的方法不对造成的??我先试试SpinLock的方式 lsxredrain兄 ,还有一个问题,SfUpdateFileByFileObject在什么地方使用啊? 我只用到了SfForwardIrpSyncronously 最后,感谢你的回答,坛子中现在你这类的人已经不多了,珍惜阿.... |
|
7楼#
发布于:2007-08-24 13:33
如果不需要自己发Irp包去读文件头或者文件尾之类的就不需要使用SfUpdateFileByFileObject
|
|
8楼#
发布于:2007-08-31 08:53
顶一下,这种思路,可以吗?
在Create中记录 FsContext 在 Read中对比, 为什么我做的时候,在Create记当的FsContext 到Read中一个都没出现(我都print出来了) |
|
|
9楼#
发布于:2007-09-03 12:30
Re:FileObject->FsContext问题,lsxredrain, devia等
文件可能会被多次Create,你保存的到底是成功的还是不成功的? |
|
|
10楼#
发布于:2007-09-03 13:20
引用第1楼lsxredrain于2007-08-22 16:13发表的 : |
|
11楼#
发布于:2007-09-06 05:52
你的FsContext是在什么时候存的,如果是在 IoCallDriver() 下发给 FSD 之前的话,那它就是
0x00000000,和 IRP_MJ_READ 中的就不一样。FSD 处理完 IRP_MJ_CREATE 后的 FileObject->FsContext 才和 IRP_MJ_READ 中的对应。 上面是简单的情况,还有种情况我也遇到了,但不只为什么? 就是本来是 IRP_MJ_READ 中的 FileObject 和 IRP_MJ_CREATE 中的对应,但我在 CreateDispatch() 中清除缓冲区后,那个 IRP_MJ_READ 的 FileObject 就在之前的 IRP_MJ_CREATE 处理时不出现了。 |
|
12楼#
发布于:2007-09-06 09:11
FileObject->FsContext不是00000000, 发下代码.
if ( strncmp(fullPathName, "C:\\t2.doc", strlen("C:\\t2.doc")) == 0 ) { status = SfForwardIrpSyncronously(hookExt->FileSystem, Irp); if ( !NT_SUCCESS(status) ){break; } g_FileCtx.FsContext = FileObject->FsContext; KeAcquireSpinLock(&hookExt->SpinLock, &hookExt->OldIrql); DbgPrint("[%d]\n", FileObject->FsContext ); KeReleaseSpinLock(&hookExt->SpinLock, hookExt->OldIrql); 这样把FileObject->FsContext保存下来 |
|
|
13楼#
发布于:2007-09-06 09:15
IRP_MJ_READ中
KeAcquireSpinLock(&hookExt->SpinLock, &hookExt->OldIrql);DbgPrint("%d\n", FileObject->FsContext; KeReleaseSpinLock(&hookExt->SpinLock, hookExt->OldIrql); 这样比较, 可以看到的值与Create的值,都不相等. 难道同步不对吗? SfForwardIrpSyncronously 我换成完成例程了,不知对不对? |
|
|
14楼#
发布于:2007-09-06 09:17
SfForwardIrpSyncronously
NTSTATUS CreateCompleted( PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Context ) { PKEVENT Event = Context; if (Irp->PendingReturned) { IoMarkIrpPending(Irp); } KeSetEvent(Event, IO_NO_INCREMENT, FALSE); DbgPrint("%s", "CreateCompution"); return Irp->IoStatus.Status; } |
|
|
15楼#
发布于:2007-09-06 09:20
设置CreateCompletion
if ( strncmp(fullPathName, "C:\\t2.doc", strlen("C:\\t2.doc")) == 0 ) { KEVENT Event; DbgPrint("Set CreateCompletion"); KeInitializeEvent(&Event, NotificationEvent, FALSE); *nextIrpStack = *currentIrpStack; IoSetCompletionRoutine(Irp , CreateCompleted, &Event ,TRUE ,TRUE ,TRUE ); status = IoCallDriver(hookExt->FileSystem, Irp); if (STATUS_PENDING == status) { KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); status = Irp->IoStatus.Status; } g_FileCtx.FsContext = FileObject->FsContext; KeAcquireSpinLock(&hookExt->SpinLock, &hookExt->OldIrql); KeReleaseSpinLock(&hookExt->SpinLock, hookExt->OldIrql); 这里保存FileObject->FsContext对吗? |
|
|
16楼#
发布于:2007-09-06 09:22
MJ_CREATE中 与 MJ_READ 中FsContext完全不同,
请大牛指点一下, 裸体跪求.... |
|
|
禁止发言
|
17楼#
发布于:2007-09-07 00:22
用户被禁言,该主题自动屏蔽! |
18楼#
发布于:2007-11-27 11:21
create是并发的
|
|