oyclkelly
驱动牛犊
驱动牛犊
  • 注册日期2006-06-07
  • 最后登录2009-07-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望29点
  • 贡献值0点
  • 好评度28点
  • 原创分0分
  • 专家分0分
阅读:3352回复:18

FileObject->FsContext问题,lsxredrain, devia等高手请指一下路

楼主#
更多 发布于:2007-08-22 15:58
我用的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是处理完毕了的)


还请各位兄台指点一下迷津......,期待中
lsxredrain
驱动中牛
驱动中牛
  • 注册日期2006-08-31
  • 最后登录2008-10-18
  • 粉丝1
  • 关注0
  • 积分540分
  • 威望421点
  • 贡献值1点
  • 好评度420点
  • 原创分4分
  • 专家分0分
沙发#
发布于:2007-08-22 16:13
在SpyCreate需要同步一下
oyclkelly
驱动牛犊
驱动牛犊
  • 注册日期2006-06-07
  • 最后登录2009-07-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望29点
  • 贡献值0点
  • 好评度28点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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中比较始终无法比较成功
lsxredrain
驱动中牛
驱动中牛
  • 注册日期2006-08-31
  • 最后登录2008-10-18
  • 粉丝1
  • 关注0
  • 积分540分
  • 威望421点
  • 贡献值1点
  • 好评度420点
  • 原创分4分
  • 专家分0分
地板#
发布于:2007-08-23 13:46
FileObject->FsContext
g_MyFileCtxPtr->FsContext
这两个值都打印出来,
另外 g_MyFileCtxPtr->FsContext  是全局变量,你怎么同步?
oyclkelly
驱动牛犊
驱动牛犊
  • 注册日期2006-06-07
  • 最后登录2009-07-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望29点
  • 贡献值0点
  • 好评度28点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-08-23 16:01
兄台,我定义了一个全局的Fast_Mutex,在为全局变量复值时候用ExAcquireFastMutex和ExReleaseFastMutex来同步,在SfRead和SfWrite中比较FsContext时也用这个全局的FAST_MUTEX来同步,但只有SfRead读可以,但SfWrite写就出错,我同步的位置和toolflat的SFilter中的地方相同。不知为何??

请问lsxredrain兄是如何同步的,能否给几行提示性的代码,万分感谢
lsxredrain
驱动中牛
驱动中牛
  • 注册日期2006-08-31
  • 最后登录2008-10-18
  • 粉丝1
  • 关注0
  • 积分540分
  • 威望421点
  • 贡献值1点
  • 好评度420点
  • 原创分4分
  • 专家分0分
5楼#
发布于:2007-08-23 16:32
使用 KeAcquireSpinLock( &gHashLockTable[hashIndex], &oldIrql );
KeReleaseSpinLock( &gHashLockTable[hashIndex], oldIrql );
SfForwardIrpSyncronously,SfUpdateFileByFileObject
来同步文件上下文表,
SfWrite中为什么要写呢?

只有在spycreate 修改,其他地方只是读
oyclkelly
驱动牛犊
驱动牛犊
  • 注册日期2006-06-07
  • 最后登录2009-07-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望29点
  • 贡献值0点
  • 好评度28点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-08-24 12:20
不好意思,我表达出错,我是说在SfRead函数中可以比较成功,
在SfWrite写函数中就无法比较成功,我把FileObject->FsContext
g_MyFileCtxPtr->FsContext 都打印出来了的但是就是没有相同的
难道是同步的方法不对造成的??我先试试SpinLock的方式

lsxredrain兄 ,还有一个问题,SfUpdateFileByFileObject在什么地方使用啊?
我只用到了SfForwardIrpSyncronously

最后,感谢你的回答,坛子中现在你这类的人已经不多了,珍惜阿....
lsxredrain
驱动中牛
驱动中牛
  • 注册日期2006-08-31
  • 最后登录2008-10-18
  • 粉丝1
  • 关注0
  • 积分540分
  • 威望421点
  • 贡献值1点
  • 好评度420点
  • 原创分4分
  • 专家分0分
7楼#
发布于:2007-08-24 13:33
如果不需要自己发Irp包去读文件头或者文件尾之类的就不需要使用SfUpdateFileByFileObject
abc13271552
驱动小牛
驱动小牛
  • 注册日期2007-08-13
  • 最后登录2023-12-05
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望552点
  • 贡献值0点
  • 好评度160点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2007-08-31 08:53
顶一下,这种思路,可以吗?
在Create中记录 FsContext 在 Read中对比,
为什么我做的时候,在Create记当的FsContext 到Read中一个都没出现(我都print出来了)
驱网无线,快乐无限
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
9楼#
发布于:2007-09-03 12:30
Re:FileObject->FsContext问题,lsxredrain, devia等
文件可能会被多次Create,你保存的到底是成功的还是不成功的?
人总在矛盾中徘徊。。。
lsxredrain
驱动中牛
驱动中牛
  • 注册日期2006-08-31
  • 最后登录2008-10-18
  • 粉丝1
  • 关注0
  • 积分540分
  • 威望421点
  • 贡献值1点
  • 好评度420点
  • 原创分4分
  • 专家分0分
10楼#
发布于:2007-09-03 13:20
引用第1楼lsxredrain于2007-08-22 16:13发表的  :
在SpyCreate需要同步一下
silon212
驱动牛犊
驱动牛犊
  • 注册日期2007-03-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望8点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
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 处理时不出现了。
abc13271552
驱动小牛
驱动小牛
  • 注册日期2007-08-13
  • 最后登录2023-12-05
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望552点
  • 贡献值0点
  • 好评度160点
  • 原创分0分
  • 专家分0分
  • 社区居民
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保存下来
驱网无线,快乐无限
abc13271552
驱动小牛
驱动小牛
  • 注册日期2007-08-13
  • 最后登录2023-12-05
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望552点
  • 贡献值0点
  • 好评度160点
  • 原创分0分
  • 专家分0分
  • 社区居民
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 我换成完成例程了,不知对不对? 
驱网无线,快乐无限
abc13271552
驱动小牛
驱动小牛
  • 注册日期2007-08-13
  • 最后登录2023-12-05
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望552点
  • 贡献值0点
  • 好评度160点
  • 原创分0分
  • 专家分0分
  • 社区居民
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;

}
驱网无线,快乐无限
abc13271552
驱动小牛
驱动小牛
  • 注册日期2007-08-13
  • 最后登录2023-12-05
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望552点
  • 贡献值0点
  • 好评度160点
  • 原创分0分
  • 专家分0分
  • 社区居民
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对吗?
驱网无线,快乐无限
abc13271552
驱动小牛
驱动小牛
  • 注册日期2007-08-13
  • 最后登录2023-12-05
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望552点
  • 贡献值0点
  • 好评度160点
  • 原创分0分
  • 专家分0分
  • 社区居民
16楼#
发布于:2007-09-06 09:22
MJ_CREATE中 与 MJ_READ 中FsContext完全不同,
请大牛指点一下, 裸体跪求....
驱网无线,快乐无限
wanghui219
禁止发言
禁止发言
  • 注册日期2007-08-28
  • 最后登录2019-07-29
  • 粉丝4
  • 关注3
  • 积分101166分
  • 威望505351点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分4分
  • 社区居民
17楼#
发布于:2007-09-07 00:22
用户被禁言,该主题自动屏蔽!
zoneup
驱动牛犊
驱动牛犊
  • 注册日期2003-08-26
  • 最后登录2011-06-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2007-11-27 11:21
create是并发的
游客

返回顶部