MiPreparePfnDatabasePageForFree

INT64 __fastcall MiPreparePfnDatabasePageForFree(INT64 a1, INT64 a2, INT64 a3){
  int v3; 
  int v4; 
  _MMPFN *PfnDb; 
  char *v6; 
  char *v7; 
  INT64 result; 
  __int64 v9[7]; 
  UINT64 SpinCount; 
  UINT64 v11; 
  v3 = a3;
  v4 = a2;
  v9[0] = MI_READ_PTE_LOCK_FREE(a1);
  PfnDb = MmGetPfnDb();
  v6 = (char *)PfnDb + 48 * (((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)v9) >> 12) & 0xFFFFFFFFFi64);
  if( !v4 && v3 == 3 )
  {
    LODWORD(SpinCount) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)v6 + 6, 0x3Fui64) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( *((__int64 *)v6 + 3) < 0 );
    }
    --*((_WORD *)v6 + 16);
    _InterlockedAnd64((volatile signed __int64 *)v6 + 3, 0x7FFFFFFFFFFFFFFFui64);
  }
  v7 = (char *)PfnDb + 48 * (*((_QWORD *)v6 + 5) & 0xFFFFFFFFFi64);
  LODWORD(v11) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)v7 + 6, 0x3Fui64) )
  {
    do
      KeYieldProcessorEx(&v11);
    while( *((__int64 *)v7 + 3) < 0 );
  }
  result = *((_QWORD *)v7 + 3);
  *((_QWORD *)v7 + 3) = result ^ (result ^ (result - 1)) & 0x3FFFFFFFFFFFFFFFi64;
  _InterlockedAnd64((volatile signed __int64 *)v7 + 3, 0x7FFFFFFFFFFFFFFFui64);
  if( !v4 )
  {
    result = ZeroPte;
    *((_QWORD *)v6 + 2) = ZeroPte;
  }
  return result;
}

Referenced by:

MiPfnRangeIsZero