MmFlushVirtualMemory
NTSTATUS __stdcall MmFlushVirtualMemory(
_EPROCESS *Process,
VOID **BaseAddress,
UINT64 *RegionSize,
_IO_STATUS_BLOCK *IoStatus){
unsigned __int64 v4;
NTSTATUS v5;
UINT64 v7;
VOID *v8;
unsigned __int64 v9;
unsigned int v10;
__int64 v11;
UINT64 v12;
void *v13;
unsigned __int64 v14;
int v15;
_CONTROL_AREA *v16;
int v17;
_SUBSECTION *v18;
_ETHREAD *v19;
int v20;
_FILE_OBJECT *v21;
_IO_STATUS_BLOCK *v22;
int v23;
_SUBSECTION *LastSubsection;
_IO_STATUS_BLOCK *v26;
UINT64 Flags;
UINT8 v28;
int v29;
_MMPTE *v30;
INT64 v31;
_ETHREAD *CurrentThread;
_SUBSECTION *Subsection;
_IO_STATUS_BLOCK *v34;
UINT64 *v35;
_KAPC_STATE ApcState;
v4 = (unsigned __int64)*BaseAddress;
v5 = 0;
v34 = IoStatus;
ApcState.ApcListHead[0] = 0i64;
v35 = RegionSize;
v7 = *RegionSize + v4 - 1;
v8 = (VOID *)(v4 & 0xFFFFFFFFFFFFF000ui64);
Subsection = 0i64;
*BaseAddress = v8;
v9 = v7 | 0xFFF;
memset(&ApcState.ApcListHead[1], 0, 32);
v10 = 0;
LODWORD(v31) = 0;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( CurrentThread->Tcb.ApcState.Process != Process )
{
v10 = 2;
KiStackAttachProcess(Process, 0i64, &ApcState);
}
v29 = 0;
v28 = KeAreAllApcsDisabled();
LODWORD(v11) = MiObtainReferencedVadEx((UINT64)v8, 2, &v31);
v13 = (void *)v11;
if( !v11 )
{
v5 = v31;
if( (_DWORD)v31 == -1073741664 )
v5 = -1073741799;
goto LABEL_24;
}
v14 = *(unsigned int *)(v11 + 28) | ((unsigned __int64)*(unsigned __int8 *)(v11 + 33) << 32);
if( !*RegionSize )
{
v9 = (v14 << 12) | 0xFFF;
v10 |= 1u;
}
v15 = *(_DWORD *)(v11 + 48);
if( (v15 & 0x100000) != 0 || v9 >> 12 > v14 )
{
LABEL_30:
v5 = -1073741799;
goto LABEL_23;
}
v16 = **(_CONTROL_AREA ***)(v11 + 72);
v31 = (INT64)v16;
if( v16->FilePointer.Value && (v15 & 0x70) != 32 )
{
*v35 = v9 - (_QWORD)v8 + 1;
if( !v28 )
{
v17 = 0;
if( (v16->u.LongFlags & 0x20000) != 0 )
v17 = 4;
v29 = v17;
}
MiFlushDirtyBitsToPfn(v8, (VOID *)v9, CurrentThread, v12);
MiGetProtoPteAddress();
MiGetProtoPteAddress();
v18 = Subsection;
CurrentThread = v19;
if( Subsection )
{
if( (v10 & 1) != 0 )
{
LastSubsection = MiFindLastSubsection(v16, 0i64);
v30 = &LastSubsection->SubsectionBase[LastSubsection->PtesInSubsection
- (unsigned __int64)(LastSubsection->_bf_34 & 0x3FFFFFFF)
- 1];
MiFlushAcquire(v16, v18, LastSubsection);
if( v20 )
{
MiUnlockAndDereferenceVadShared(v13);
if( v10 >= 2 )
KiUnstackDetachProcess(&ApcState, 0i64);
v21 = MiReferenceControlAreaFile(v16);
v22 = v34;
while( 1 )
{
v23 = FsRtlAcquireFileForCcFlushEx(v21);
if( v23 < 0 )
break;
LODWORD(Flags) = v29;
v23 = MiFlushSectionInternal((_MMPTE *)CurrentThread, v30, v18, LastSubsection, 0i64, Flags, v22);
FsRtlReleaseFileForCcFlush(v21);
if( v23 != -1073741740 )
break;
KeDelayExecutionThread(0, 0, (_LARGE_INTEGER *)&Interval);
}
MiDereferenceControlAreaFile((_CONTROL_AREA *)v31, v21);
MiFlushRelease((_CONTROL_AREA *)v31, v18, LastSubsection);
return v23;
}
v5 = -1073741670;
goto LABEL_23;
}
}
else if( (v10 & 1) != 0 )
{
v26 = v34;
v34->Status = 0;
v26->Information = 0i64;
goto LABEL_23;
}
goto LABEL_30;
}
v5 = -1073741688;
LABEL_23:
MiUnlockAndDereferenceVadShared(v13);
LABEL_24:
if( v10 >= 2 )
KiUnstackDetachProcess(&ApcState, 0i64);
return v5;
}Referenced by:
CMFFlushHitsFile
NtFlushVirtualMemory