彻底刷新文件系统的缓存
来源:互联网 发布:淘宝返利机器人原理 编辑:程序博客网 时间:2024/06/06 02:41
void PurgeFileSystemBuffers(PFILE_OBJECT FileObject)
{
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)
{
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)->Resource);
}
KeLeaveCriticalRegion();
}
参考2:
void ManageFileCache(PFILE_OBJECT pFileObject)
{
PFSRTL_COMMON_FCB_HEADER pFcb;
LARGE_INTEGER liInterval;
//BOOLEAN bNeedReleaseResource = FALSE;
//BOOLEAN bNeedReleasePagingIoResource = FALSE;
KIRQL irql;
BOOLEAN bLockedResource=FALSE;
BOOLEAN bLockedPagingIoResource=FALSE;
BOOLEAN bReleaseResource=FALSE;
BOOLEAN bReleasePagingIoResource=FALSE;
pFcb =(PFSRTL_COMMON_FCB_HEADER)pFileObject->FsContext;
if(pFcb==NULL)
{
return;
}
irql = KeGetCurrentIrql();
if(irql>= DISPATCH_LEVEL)
{
return;
}
liInterval.QuadPart =-1 *(LONGLONG)50;
//KeEnterCriticalRegion();
bLockedPagingIoResource = ExIsResourceAcquiredExclusiveLite(pFcb->PagingIoResource);
bLockedResource=ExIsResourceAcquiredExclusiveLite(pFcb->Resource);
if(!bLockedPagingIoResource)
bReleasePagingIoResource=TRUE;
if(!bLockedResource)
bReleaseResource=TRUE;
while(!bLockedPagingIoResource||!bLockedResource)
{
if(!bLockedResource)
{
if(ExAcquireResourceExclusiveLite(pFcb->Resource,FALSE)==TRUE)
bLockedResource=TRUE;
else
goto clear;
}
if(!bLockedPagingIoResource)
{
if(ExAcquireResourceExclusiveLite(pFcb->PagingIoResource,FALSE)==TRUE)
bLockedPagingIoResource=TRUE;
else
goto clear;
}
if(bLockedPagingIoResource&& bLockedResource)
break;
clear:
if(bLockedPagingIoResource)
{
ExReleaseResourceLite(pFcb->PagingIoResource);
bLockedPagingIoResource =FALSE;
}
if(bLockedResource)
{
ExReleaseResourceLite(pFcb->Resource);
bLockedResource=FALSE;
}
KeLeaveCriticalRegion();
if(irql== PASSIVE_LEVEL)
{
KeDelayExecutionThread(KernelMode,FALSE,&liInterval);
}
else
{
KEVENT waitEvent;
KeInitializeEvent(&waitEvent, NotificationEvent,FALSE);
KeWaitForSingleObject(&waitEvent, Executive, KernelMode,FALSE,&liInterval);
}
KeEnterCriticalRegion();
}
//加锁完毕
if(pFileObject->SectionObjectPointer!=NULL)
{
IO_STATUS_BLOCK ioStatus;
CcFlushCache(pFileObject->SectionObjectPointer,NULL, 0,&ioStatus);
if(pFileObject->SectionObjectPointer->ImageSectionObject!=NULL)
MmFlushImageSection(pFileObject->SectionObjectPointer, MmFlushForWrite);//MmFlushForDelete
if(pFileObject->SectionObjectPointer->DataSectionObject!=NULL)
CcPurgeCacheSection(pFileObject->SectionObjectPointer,NULL, 0,FALSE);
}
if(bReleasePagingIoResource)
{
ExReleaseResourceLite(pFcb->PagingIoResource);
bLockedPagingIoResource =FALSE;
}
if(bReleaseResource)
{
ExReleaseResourceLite(pFcb->Resource);
bLockedResource=FALSE;
}
KeLeaveCriticalRegion();
}
- 彻底刷新文件系统的缓存
- Linux文件系统的缓存机制
- f2fs文件系统的页缓存
- 彻底删除项目缓存的方法
- CPU缓存刷新的误解
- CPU缓存刷新的误解
- 浏览器的“刷新”&“缓存机制”
- 浏览器的“刷新”&“缓存机制”
- CPU缓存刷新的误解
- CPU缓存刷新的误解
- 刷新电脑的DNS缓存
- CPU缓存刷新的误解
- CPU缓存刷新的误解
- 文件系统、缓存管理器、内存管理器的关系
- 文件系统、缓存管理器、内存管理器的关系
- 分布式文件系统下的本地缓存
- 分布式文件系统下的本地缓存
- 分布式文件系统下的本地缓存
- 基于VB的串口使用
- HTTP相关
- 中国程序员技术偏低的七大原因
- 加载配置文件时的路径问题
- csdn博文和转载机制
- 彻底刷新文件系统的缓存
- JQUERY_contextMenu_学习
- 文本框不能输入中文判断
- 估计是全世界人民最向往的一件事
- 揭开:apue2中fwrite二进制文件乱码
- C++经典书籍推荐 .
- 戴尔 Streak 10 Pro 购买使用散记
- KMP算法
- samba 服务器的搭建