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();
}
|
|