MiUnlockPageTableCharges

VOID __stdcall MiUnlockPageTableCharges(_MMPFN *Pfn1, UINT8 OldIrql, UINT64 RealPageTable){
  __int64 v3; 
  _MMPFN *v4; 
  int IsLowestPageTablePage; 
  int v6; 
  unsigned __int64 v7; 
  UINT64 v8; 
  __int64 v9; 
  __int64 v10; 
  __int64 v11; 
  unsigned __int64 v12; 
  struct _KPRCB *CurrentPrcb; 
  __int64 v14; 
  bool v15; 
  signed __int32 v16; 
  UINT64 SpinCount; 
  v3 = 0i64;
  v4 = Pfn1;
  if( OldIrql == 2 )
  {
    IsLowestPageTablePage = MiIsLowestPageTablePage(Pfn1);
    v6 = 3;
  }
  else
  {
    if( !OldIrql )
    {
      v6 = 4;
      goto LABEL_7;
    }
    IsLowestPageTablePage = 1;
    v6 = 1;
  }
  if( !IsLowestPageTablePage )
    goto LABEL_38;
LABEL_7:
  if( (*((_QWORD *)v4 + 3) & 0x3FFFFFFFFFFFFFFFui64) < 0x10000 )
LABEL_38:
    KeBugCheckEx(
      0x1Au,
      0x41791ui64,
      (ULONG_PTR)v4,
      *((_QWORD *)v4 + 1) | 0x8000000000000000ui64,
      *((_QWORD *)v4 + 3) & 0x3FFFFFFFFFFFFFFFi64);
  v7 = 0i64;
  v8 = 0i64;
  while( 1 )
  {
    v9 = *((_QWORD *)v4 + 5);
    LODWORD(SpinCount) = 0;
    v10 = v9 & 0xFFFFFFFFFi64;
    while( _interlockedbittestandset64((volatile signed __int32 *)v4 + 6, 0x3Fui64) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( *((__int64 *)v4 + 3) < 0 );
    }
    v11 = *((_QWORD *)v4 + 3) ^ ((*((_QWORD *)v4 + 3) - 0x10000i64) ^ *((_QWORD *)v4 + 3)) & 0x3FFFFFFFFFFFFFFFi64;
    *((_QWORD *)v4 + 3) = v11;
    v12 = v11 & 0x3FFFFFFFFFFFFFFFi64;
    if( v12 >= 0x10000 )
      break;
    if( !v3 )
      v3 = *(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v4 + 5) >> 39) & 0x3FFi64));
    ++v7;
    if( !v12 && (unsigned int)MiPfnShareCountIsZero((UINT64)v4, 0i64) != 3 )
      ++v8;
    _InterlockedAnd64((volatile signed __int64 *)v4 + 3, 0x7FFFFFFFFFFFFFFFui64);
    if( !--v6 )
      goto LABEL_21;
    v4 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * v10);
  }
  _InterlockedAnd64((volatile signed __int64 *)v4 + 3, 0x7FFFFFFFFFFFFFFFui64);
LABEL_21:
  if( v7 )
  {
    if( (ULONG_PTR *)v3 == &MiSystemPartition )
    {
      CurrentPrcb = KeGetCurrentPrcb();
      v14 = *((int *)CurrentPrcb + 8391);
      if( (_DWORD)v14 != -1 )
      {
        if( v7 + v14 <= 0x100 )
        {
          do
          {
            if( v7 >= 0x80000 )
              break;
            v16 = _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, v14 + v7, v14);
            v15 = (_DWORD)v14 == v16;
            LODWORD(v14) = v16;
            if( v15 )
              goto LABEL_35;
          }
          while( v16 != -1 && v7 + v16 <= 0x100 );
        }
        if( (int)v14 > 192
          && (_DWORD)v14 != -1
          && (_DWORD)v14 == _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, 192, v14) )
        {
          v7 += (int)v14 - 192;
        }
      }
    }
    if( v7 )
      _InterlockedExchangeAdd64((volatile signed __int64 *)(v3 + 7168), v7);
  }
LABEL_35:
  if( v8 )
    MiReturnCommit((_MI_PARTITION *)v3, v8);
}

Referenced by:

MiCopyOnWrite
MiDemoteCombinedPte
MiUnlockPageTableRange
MiUnlockWsle
MmUnlockPages
NtLockVirtualMemory