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

}