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