MiPreparePfnDatabasePageForFree

NTSTATUS __stdcall MiPreparePfnDatabasePageForFree(INT64 a1, INT64 a2, INT64 a3){
  int v3; 
  int v4; 
  __int64 v5; 
  unsigned __int64 v6; 
  _MMPFN *PfnDb; 
  _MMPFN *v8; 
  _MMPFN *v9; 
  __int64 bf_0; 
  __int64 v12[7]; 
  UINT64 SpinCount; 
  UINT64 v14; 

  v3 = a3;
  v4 = a2;
  LODWORD(v5) = MI_READ_PTE_LOCK_FREE(a1);
  v12[0] = v5;
  LODWORD(v6) = MI_READ_PTE_LOCK_FREE((INT64)v12);
  PfnDb = MmGetPfnDb();
  v8 = &PfnDb[(v6 >> 12) & 0xFFFFFFFFFi64];
  if( !v4 && v3 == 3 )
  {
    LODWORD(SpinCount) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)&v8->u2, 0x3Fui64) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( v8->u2._bf_0 < 0 );
    }
    --v8->u3.ReferenceCount;
    _InterlockedAnd64(&v8->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  }
  v9 = &PfnDb[v8->u4._bf_0 & 0xFFFFFFFFFi64];
  LODWORD(v14) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)&v9->u2, 0x3Fui64) )
  {
    do
      KeYieldProcessorEx(&v14);
    while( v9->u2._bf_0 < 0 );
  }
  bf_0 = v9->u2._bf_0;
  v9->u2._bf_0 = bf_0 ^ (bf_0 ^ (bf_0 - 1)) & 0x3FFFFFFFFFFFFFFFi64;
  _InterlockedAnd64(&v9->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  if( !v4 )
  {
    LODWORD(bf_0) = ZeroPte.u.Long;
    v8->OriginalPte = ZeroPte;
  }
  return bf_0;
}

Referenced by:

MiPfnRangeIsZero