阅读:3188回复:1
缓存?!老问题中的新问题,
我现在做的透明加解密中,用网上找到的一个段清空缓存的代码,
如果是针对记事本这里程序,能成功清空缓存 但是如果是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(); } |
|
最新喜欢:![]() |
沙发#
发布于:2009-03-13 15:41
((PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)->PagingIoResource
|
|