2024年3月31日发(作者:)
参考1:
void PurgeFileSystemBuffers(PFILE_OBJECT FileObject)
{
KeEnterCriticalRegion();
if(ExAcquireResourceExclusiveLite( ((PFSRTL_COMMON_FCB_HEADER)FileO
bject->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)
{
//rt = DELAY_ONE_MILLISECOND * 500;//500ms
//KeDelayExecutionThread(KernelMode, FALSE, &Interval);
MmForceSectionClosed( FileObject->SectionObjectPointer,
TRUE//改为TRUE,彻底刷新缓存!!!
);
}
IoSetTopLevelIrp(NULL);
}
ExReleaseResourceLite( ((PFSRTL_COMMON_FCB_HEADER)FileObject->F
sContext)->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;
}
rt = -1 * (LONGLONG)50;
//KeEnterCriticalRegion();
bLockedPagingIoResource =
ExIsResourceAcquiredExclusiveLite(pFcb->PagingIoResource);
bLockedResource=ExIsResourceAcquiredExclusiveLite(pFcb->Resou
rce);
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->PagingIoResour
ce, 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();
}


发布评论