MiAddSystemPageTableToList

_MI_PAGE_DELETE_RESULT __fastcall MiAddSystemPageTableToList(_QWORD *a1, __int64 a2){
  _MMPFN *v4; 
  _MI_PAGE_DELETE_RESULT result; 
  UINT64 SpinCount; 
  UINT64 v7; 

  while( 1 )
  {
    LODWORD(SpinCount) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)(a2 + 24), 0x3Fui64) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( *(__int64 *)(a2 + 24) < 0 );
    }
    if( (*(_QWORD *)(a2 + 24) & 0x3FFFFFFFFFFFFFFFi64) == 1 )
      break;
    _InterlockedAnd64((volatile signed __int64 *)(a2 + 24), 0x7FFFFFFFFFFFFFFFui64);
  }
  *(_QWORD *)(a2 + 24) |= 0x4000000000000000ui64;
  *(_QWORD *)a2 = *a1;
  *a1 = a2;
  *(_BYTE *)(a2 + 34) = *(_BYTE *)(a2 + 34) & 0xF8 | 5;
  _InterlockedAnd64((volatile signed __int64 *)(a2 + 24), 0x7FFFFFFFFFFFFFFFui64);
  v4 = &MmGetPfnDb()[*(_QWORD *)(a2 + 40) & 0xFFFFFFFFFi64];
  LODWORD(v7) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)&v4->u2, 0x3Fui64) )
  {
    do
      KeYieldProcessorEx(&v7);
    while( v4->u2._bf_0 < 0 );
  }
  result = MiDecrementShareCount(v4);
  _InterlockedAnd64(&v4->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  return result;
}

Referenced by:

MiDeleteSystemPageTable