MiSynchronizeSystemVa
NTSTATUS __stdcall MiSynchronizeSystemVa(INT64 a1, UINT64 a2, INT64 a3, INT64 a4, INT64 a5){
int v5;
INT64 v8;
char v9;
unsigned __int8 v10;
volatile __int32 *v11;
UINT8 v12;
int v13;
unsigned __int8 CurrentIrql;
UINT64 v15;
INT64 *v16;
NTSTATUS v17;
VOID *v18;
UINT64 v19;
_MMPTE *PteBase;
INT64 *v21;
__int64 v23;
__int64 v24;
__int64 v25;
unsigned __int64 v26;
_MMSUPPORT_INSTANCE *AnyMultiplexedVm;
_MMPTE *v28;
_MMSUPPORT_SHARED *SharedVm;
char v30;
INT64 *v31;
UINT64 v32[2];
__int128 v33;
INT64 v34;
v5 = 0;
LODWORD(v34) = 0;
*(_OWORD *)v32 = 0i64;
v33 = 0i64;
if( !(_DWORD)a3 )
return 0;
v8 = a5;
*(_DWORD *)(a5 + 16) = 0;
v9 = *(_BYTE *)(v8 + 37);
*(_QWORD *)(v8 + 24) = a1;
if( (_DWORD)a4 )
{
*(_BYTE *)(v8 + 37) = v9 | 1;
SharedVm = MiGetSharedVm((_MMSUPPORT_INSTANCE *)a1);
v30 = ExAcquireSpinLockExclusive((INT64 *)&SharedVm->WorkingSetLock);
SharedVm->GoodCitizenWaiting = 0;
*(_BYTE *)(v8 + 36) = v30;
MiFillPteHierarchy(a2, v32);
if( MiPageTableStillExists((INT64)v32, &v34) )
{
if( (_DWORD)v34 )
{
if( (*(_DWORD *)(v8 + 4) & 4) == 0 )
goto LABEL_37;
*(_DWORD *)(v8 + 16) = v34;
}
LABEL_16:
if( (*(_BYTE *)(a1 + 184) & 7) != 2 )
return 1;
if( *(_DWORD *)(v8 + 48) == 3 )
{
AnyMultiplexedVm = MiGetAnyMultiplexedVm(MiWorkingSetTypeSystemCache, v18);
LABEL_25:
*(_QWORD *)(v8 + 24) = AnyMultiplexedVm;
return 1;
}
LODWORD(v23) = MiGetSystemCacheReverseMap(a2);
if( v23 && *(_QWORD *)(v23 + 16) )
{
LODWORD(v24) = MiGetSystemCacheReverseMap(a2);
v25 = *(_QWORD *)(v24 + 24);
v26 = v25 & 0xFFFFFFFFFFFFFFFEui64;
if( (v25 & 1) == 0 )
v26 = *(_QWORD *)(v24 + 24);
AnyMultiplexedVm = (_MMSUPPORT_INSTANCE *)(*(_QWORD *)(*(&stru_140C4DB30 + 267)
+ 8i64 * (*(_WORD *)(*(_QWORD *)v26 + 60i64) & 0x3FF))
+ 7232i64);
goto LABEL_25;
}
}
}
else
{
*(_BYTE *)(v8 + 37) = v9 & 0xFE;
v10 = *(_BYTE *)(a1 + 184) & 7;
if( v10 >= 6u )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
}
else
{
if( v10 == 2 )
v11 = (volatile __int32 *)((char *)&stru_140C4DB30 + 6544);
else
v11 = (volatile __int32 *)(a1 + 192);
v12 = KeGetCurrentIrql();
__writecr8(2ui64);
_m_prefetchw((const void *)v11);
v13 = *v11 & 0x7FFFFFFF;
if( v13 != _InterlockedCompareExchange(v11, v13 + 1, v13) )
ExpWaitForSpinLockSharedAndAcquire((INT64 *)v11, v12);
if( *((_DWORD *)v11 + 1) )
_InterlockedExchange(v11 + 1, 0);
CurrentIrql = v12;
}
*(_BYTE *)(v8 + 36) = CurrentIrql;
v31 = 0i64;
v15 = 0i64;
v16 = 0i64;
v17 = MiFastLockLeafPageTable(a1, a2);
v18 = (VOID *)v17;
v19 = a2 >> 9;
PteBase = MmGetPteBase();
if( v17 )
{
v32[0] = (UINT64)PteBase + (v19 & 0x7FFFFFFFF8i64);
v32[1] = (UINT64)PteBase + ((v32[0] >> 9) & 0x7FFFFFFFF8i64);
*(_QWORD *)&v33 = (char *)PteBase + ((v32[1] >> 9) & 0x7FFFFFFFF8i64);
*((_QWORD *)&v33 + 1) = (char *)PteBase + (((unsigned __int64)v33 >> 9) & 0x7FFFFFFFF8i64);
v15 = v32[v17];
v16 = (INT64 *)v32[v17 - 1];
v31 = v16;
}
v21 = (INT64 *)((char *)PteBase + (v19 & 0x7FFFFFFFF8i64));
if( !v15 )
{
v28 = MiLockLowestValidPageTable(a1, v21, &v31);
v16 = v31;
v15 = (UINT64)v28;
}
*(_QWORD *)(v8 + 40) = v15;
if( v16 == v21 )
goto LABEL_16;
if( (*(_DWORD *)(v8 + 4) & 4) != 0 && (MI_READ_PTE_LOCK_FREE((INT64)v16) & 0x81) == 0x81 )
{
do
{
v21 = (INT64 *)((char *)PteBase + (((unsigned __int64)v21 >> 9) & 0x7FFFFFFFF8i64));
++v5;
}
while( v21 != v16 );
*(_DWORD *)(v8 + 16) = v5;
return 1;
}
}
LABEL_37:
MiUnlockSystemVa(v8);
return 0;
}Referenced by:
MiLockStealSystemVm
MiSystemFault
MiTranslatePageForCopy
MiTrimSharedPageFromViews