fancylf
驱动牛犊
驱动牛犊
  • 注册日期2007-07-29
  • 最后登录2016-06-21
  • 粉丝1
  • 关注0
  • 积分61分
  • 威望501点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:2992回复:1

缓存?!老问题中的新问题,

楼主#
更多 发布于:2009-03-02 11:32
我现在做的透明加解密中,用网上找到的一个段清空缓存的代码,
如果是针对记事本这里程序,能成功清空缓存
但是如果是word程序,保存为HTML格式或rtf格式,用记事本打开,发现前半部是加密的
后半部分没加密,但是等隔一段时候,再来打开,却又是全部加密的,甚至我把word保存的文件
全部发出到外部环境,也是加密的,
为什么出现这种奇怪的现象呢?达人请指点:
下面是清空缓存的代码:
我在create 和cleanup里面清空都遇到相同的问题。
    void PurgeFileSystemBuffers(PFILE_OBJECT FileObject)
{      
    PCC_FILE_SIZES ccSizes = NULL;

    KeEnterCriticalRegion();
    if(ExAcquireResourceExclusiveLite(((PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)->Resource, FALSE))
    {
        if(FileObject->SectionObjectPointer)
        {        
            IoSetTopLevelIrp( (PIRP)FSRTL_FSP_TOP_LEVEL_IRP );
            CcFlushCache( FileObject->SectionObjectPointer, NULL, 0, NULL );
    
            if(FileObject->SectionObjectPointer->ImageSectionObject)
            {            
                MmFlushImageSection(
                FileObject->SectionObjectPointer,
                MmFlushForWrite     //MmFlushForDelete//  这是枚举变量
                ) ;
            }
    
            if(FileObject->SectionObjectPointer->DataSectionObject)
            {                    
                CcPurgeCacheSection( FileObject->SectionObjectPointer,        
                    NULL,            
                    0,            
                    TRUE ); //为TRUE,会强迫所有的FileObject重新初始化Cache                                                                    
            }    

            if(FileObject->PrivateCacheMap)    
            {        
                ccSizes = ExAllocatePoolWithTag(NonPagedPool,sizeof(CC_FILE_SIZES),SFLT_POOL_TAG);            
                if (ccSizes)                
                {
                    ccSizes->AllocationSize.QuadPart = 0;
                    ccSizes->ValidDataLength.QuadPart = 0;                
                    ccSizes->FileSize.QuadPart = 0;                    
                    CcSetFileSizes(FileObject,ccSizes);
                    CcUninitializeCacheMap(FileObject, NULL, NULL);                            
                
                }    
                
                ExFreePoolWithTag(ccSizes,SFLT_POOL_TAG);
            }
            if(FileObject->SectionObjectPointer->DataSectionObject)
            {
                //Interval.QuadPart = DELAY_ONE_MILLISECOND * 500;//500ms
                //KeDelayExecutionThread(KernelMode, FALSE, &Interval);
                    MmForceSectionClosed(FileObject->SectionObjectPointer,        
                        TRUE//改为TRUE,彻底刷新缓存!!!            
                        );
            }                                          
            IoSetTopLevelIrp(NULL);                                    
        }
        ExReleaseResourceLite( ((PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)->Resource );                    
    }
    KeLeaveCriticalRegion();
}

最新喜欢:

chenynhzchenyn...
210llzty
驱动牛犊
驱动牛犊
  • 注册日期2008-09-08
  • 最后登录2009-08-04
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望141点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-03-13 15:41
((PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)->PagingIoResource
游客

返回顶部