MiDecommitLargePte
BOOL __stdcall MiDecommitLargePte(INT64 a1, UINT64 a2, INT64 a3, INT64 a4, INT64 TbFlushList){
unsigned __int64 v5;
__int64 v7;
__int64 v8;
unsigned int v10;
unsigned int v11;
INT64 v12;
unsigned __int64 v13;
unsigned __int64 v14;
unsigned __int64 *v15;
unsigned __int64 i;
unsigned __int64 v17;
int v18;
__int64 v19;
__int64 v20;
bool v21;
VOID *v22;
__int64 v23;
INT64 v24;
_MMPFN *v25;
unsigned __int64 v26;
char v27;
char v28;
unsigned __int64 v30;
INT64 v31;
__int64 v32;
__int64 v33;
UINT64 NumberOfEntries;
UINT64 SpinCount;
INT64 v36;
v36 = a4;
v5 = *(unsigned int *)(a1 + 48);
v7 = 16i64;
v8 = (v5 >> 18) & 3;
NumberOfEntries = MiVadPageSizes[v8];
if( NumberOfEntries != 16 )
v7 = 1i64;
v10 = 0;
v30 = v7;
v11 = MiVadPageIndices[v8];
if( v11 <= 1 )
v10 = 2 - v11;
LODWORD(v12) = MI_READ_PTE_LOCK_FREE(a2);
v31 = v12;
v13 = v12;
v33 = v12 & 1;
if( (v12 & 1) != 0 )
{
LODWORD(v14) = MI_READ_PTE_LOCK_FREE((INT64)&v31);
v13 = v14;
}
else if( *(&stru_140C4DB30 + 42) )
{
if( (v12 & 0x10) != 0 )
v13 = v12 & 0xFFFFFFFFFFFFFFEFui64;
else
v13 = ~*(&stru_140C4DB30 + 42) & v12;
}
v15 = (unsigned __int64 *)a2;
v32 = (v13 >> 12) & 0xFFFFFFFFFi64;
for( i = 0i64; i < v30; ++i )
{
v17 = a3;
LOBYTE(v18) = MiPteInShadowRange((UINT64)v15);
if( v18 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (a3 & 1) != 0 )
v17 = a3 | 0x8000000000000000ui64;
*v15++ = v17;
}
v19 = v32;
v20 = v33;
v21 = !a3 && v10 != 3 && MiReducePteUseCount(a2, v30);
if( v20 )
{
if( v10 )
{
MiInsertLargeTbFlushEntry((_MI_TB_FLUSH_LIST *)TbFlushList, v10, a2);
}
else
{
LODWORD(v22) = MiGetLeafVa(a2);
MiInsertTbFlushEntry((_MI_TB_FLUSH_LIST *)TbFlushList, v22, NumberOfEntries, 0i64);
}
}
v23 = v19;
v24 = v36;
v25 = &MmGetPfnDb()[v23];
LODWORD(SpinCount) = 0;
v26 = *(_QWORD *)(v36 + 40);
while( _interlockedbittestandset64((volatile signed __int32 *)&v25->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v25->u2._bf_0 < 0 );
}
*((_BYTE *)&v25->u3 + 2) = *(_BYTE *)(&v25->u3 + 1) & 0xF8 | 5;
MiSetLeafPfnBuddy(v25, v26);
v28 = (*((_BYTE *)&v25->u3 + 2) ^ v27) & 7;
*(_QWORD *)(v24 + 40) = v25;
*((_BYTE *)&v25->u3 + 2) ^= v28;
_InterlockedAnd64(&v25->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
return v21;
}Referenced by:
MiDecommitPages