abc13271552
驱动小牛
驱动小牛
  • 注册日期2007-08-13
  • 最后登录2023-12-05
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望552点
  • 贡献值0点
  • 好评度160点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1156回复:0

ClearFastCache存在的问题

楼主#
更多 发布于:2008-03-23 18:00

下面附上的代码,是驱网的大牛的作品,好像。
这个代码好像解决不了,mem-map文件的cache flush.
有没有大牛能完善一下,或给我们菜鸟点提示。

VOID ClearFastCache(
                    PFILE_OBJECT FileObject
                    )
{
    KeEnterCriticalRegion();
    //请求MainResource
    if( ExAcquireResourceExclusiveLite(
        ((PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)->Resource, FALSE)){
        //请求PagingIoResource
        if( ExAcquireResourceExclusiveLite(
            ((PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)->PagingIoResource, FALSE)){
        
            //如果Cache不为空,准备清除工作
            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,
                        FALSE ); //为TRUE,会强迫所有的FileObject重新初始化Cache                                                      
                }
                
                if( FileObject->PrivateCacheMap ){
                   CcUninitializeCacheMap(FileObject, NULL, NULL);;  
                }
                
                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)->PagingIoResource );
        }
        ExReleaseResourceLite( ((PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)->Resource );    
    }

    KeLeaveCriticalRegion();
}
驱网无线,快乐无限
游客

返回顶部