q065700
驱动牛犊
驱动牛犊
  • 注册日期2007-11-09
  • 最后登录2008-05-08
  • 粉丝0
  • 关注0
  • 积分530分
  • 威望54点
  • 贡献值0点
  • 好评度53点
  • 原创分0分
  • 专家分0分
阅读:2865回复:5

漏文件,不知道原因,请兄弟们帮忙看看

楼主#
更多 发布于:2008-02-19 15:26
用下面的代码不知道为什么会漏掉文件有的时候。

if (NT_SUCCESS(Status) && (STATUS_REPARSE != Status) && SfIsObjectFile(FileObject))
        {
            PFILE_CONTEXT FileCtxPtr2 = NULL;
            BOOLEAN NewElement = FALSE;
            
                      
            FileCtxPtr->FsContext = FileObject->FsContext;
            
            ExAcquireFastMutex(&DevExt->FsCtxTableMutex);
        
                        FileCtxPtr2 = RtlLookupElementGenericTable(&DevExt->FsCtxTable, FileCtxPtr);
            if (FileCtxPtr2)
            {
               ++FileCtxPtr2->RefCount;
                
                KdPrint(("SfCreate2: FileCtxPtr2->Name = %s\n", FileCtxPtr2->Name));
            }
            else
            {
                
                FileCtxPtr2 = RtlInsertElementGenericTable( &DevExt->FsCtxTable,
                                                            FileCtxPtr,
                                                            sizeof(FILE_CONTEXT),
                                                            &NewElement  //设置为False,返回以个空的指针
                                                            );
                
                FileCtxPtr2->RefCount = 1;
                
                ASSERT(FileName);
                
                strcpy(FileCtxPtr2->Name, fullPathName);
                KdPrint(("SfCreate: FileCtxPtr2->Name = %s\n", FileCtxPtr2->Name));

                KeInitializeEvent(&FileCtxPtr2->Event, SynchronizationEvent, TRUE);
            
            }
            
            FileCtxPtr2->DeleteOnClose = DeleteOnClose;
            
            ExReleaseFastMutex(&DevExt->FsCtxTableMutex);
            
            KeWaitForSingleObject(&FileCtxPtr2->Event, Executive, KernelMode, FALSE, NULL);
            
            KeSetEvent(&FileCtxPtr2->Event, IO_NO_INCREMENT, FALSE);
q065700
驱动牛犊
驱动牛犊
  • 注册日期2007-11-09
  • 最后登录2008-05-08
  • 粉丝0
  • 关注0
  • 积分530分
  • 威望54点
  • 贡献值0点
  • 好评度53点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-02-22 09:41
    //
    //  Log (if it is turned on) and pass the request on.
    //
    //
    // We only care about volume filter device object
    //

    if (!DevExt->DiskDeviceObject)
    {
        IoSkipCurrentIrpStackLocation(Irp);
        return IoCallDriver(DevExt->AttachedToDeviceObject, Irp);
    }
    
    if (((FileObject->Flags & FO_STREAM_FILE) == FO_STREAM_FILE) ||
        (FileObject->SectionObjectPointer &&
        (CcGetFileObjectFromSectionPtrs(FileObject->SectionObjectPointer) == FileObject)))
    {
    }
    else
    {
        FileCtxHdr.FsContext = FileObject->FsContext;
        
        ExAcquireFastMutex(&DevExt->FsCtxTableMutex);
        FileCtxPtr = RtlLookupElementGenericTable(&DevExt->FsCtxTable, &FileCtxHdr);
        if (FileCtxPtr)
        {
            //KdPrint(("SfClose: %s\n", FileCtxPtr->Name));

            if (FileCtxPtr->RefCount > 0)
                --FileCtxPtr->RefCount;
            
            if ((0 == FileCtxPtr->RefCount) &&
                (!FileObject->SectionObjectPointer ||
                (!FileObject->SectionObjectPointer->DataSectionObject &&
                !FileObject->SectionObjectPointer->ImageSectionObject)))
            {
                //KdPrint(("SfClose: %s\n", FileCtxPtr->Name));

                RtlDeleteElementGenericTable(&DevExt->FsCtxTable, &FileCtxHdr);
            }
        }
        ExReleaseFastMutex(&DevExt->FsCtxTableMutex);
    }
    
    IoSkipCurrentIrpStackLocation(Irp);
    return IoCallDriver(DevExt->AttachedToDeviceObject, Irp);
q065700
驱动牛犊
驱动牛犊
  • 注册日期2007-11-09
  • 最后登录2008-05-08
  • 粉丝0
  • 关注0
  • 积分530分
  • 威望54点
  • 贡献值0点
  • 好评度53点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-02-22 11:30
去试试,谢谢了先
游客

返回顶部