MmFlushSection
VOID __fastcall MmFlushSection(
_SECTION_OBJECT_POINTERS *SectionObjectPointer,
_LARGE_INTEGER *Offset,
UINT64 RegionSize,
_KEVENT *CallersEvent,
_IO_STATUS_BLOCK *IoStatus,
UINT64 Flags){
UINT64 v6;
_LARGE_INTEGER v7;
_IO_STATUS_BLOCK *v8;
int v9;
_ETHREAD *CurrentThread;
int v11;
NTSTATUS v12;
unsigned int v13;
_FILE_OBJECT *v14;
int v15;
UINT64 v16;
_ETHREAD *v17;
_LARGE_INTEGER Offseta;
Offseta.QuadPart = 0i64;
v6 = RegionSize;
if( Offset )
{
v7 = *Offset;
Offset = &Offseta;
Offseta = v7;
}
v8 = IoStatus;
IoStatus->Status = 0;
v8->Information = RegionSize;
MiComputeFlushRange(SectionObjectPointer, Offset, RegionSize, 0i64);
if( v9 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v17 = CurrentThread;
LOBYTE(Offseta.anonymous_0.LowPart) = CurrentThread->CacheManagerActive;
v11 = Flags;
CurrentThread->CacheManagerActive = 1;
if( (v11 & 1) != 0 )
{
v13 = 0;
v14 = MiReferenceControlAreaFile(0i64);
v15 = Flags;
do
{
v12 = FsRtlAcquireFileForCcFlushEx(v14);
if( v12 < 0 )
break;
LODWORD(v16) = v15;
v12 = MiFlushSectionInternal(0i64, 0i64, 0i64, 0i64, 0i64, v16, v8);
FsRtlReleaseFileForCcFlush(v14);
if( v12 != -1073741740 )
break;
++v13;
KeDelayExecutionThread(0, 0, (_LARGE_INTEGER *)&Interval);
}
while( v13 < 5 );
MiDereferenceControlAreaFile(0i64, v14);
CurrentThread = v17;
v6 = RegionSize;
}
else
{
LODWORD(v16) = v11;
v12 = MiFlushSectionInternal(0i64, 0i64, 0i64, 0i64, 0i64, v16, v8);
}
if( v12 < 0 || v8->Information )
v8->Information = v8->Information;
else
v8->Information = v6;
CurrentThread->CacheManagerActive = Offseta.anonymous_0.LowPart;
MiFlushRelease(0i64, 0i64, 0i64);
}
}Referenced by:
CcFlushCachePriv
CcMdlWriteComplete2
CcPurgeAndClearCacheSection
CcSetFileSizesEx
CcUnpinRepinnedBcb
MiFlushDataSection