MiUnlockPageTableCharges

VOID __stdcall MiUnlockPageTableCharges(ULONG_PTR Pfn1, UINT8 OldIrql, UINT64 RealPageTable){
  _MI_PARTITION *v3; 
  _MMPFN *v4; 
  NTSTATUS IsLowestPageTablePage; 
  int v6; 
  unsigned __int64 v7; 
  UINT64 v8; 
  __int64 bf_0; 
  __int64 v10; 
  __int64 v11; 
  unsigned __int64 v12; 
  struct _KPRCB *CurrentPrcb; 
  __int64 CachedResidentAvailable; 
  bool v15; 
  signed __int32 v16; 
  UINT64 SpinCount; 

  v3 = 0i64;
  v4 = *(_MMPFN **)&Pfn1;
  if( OldIrql == 2 )
  {
    IsLowestPageTablePage = MiIsLowestPageTablePage(*(_MMPFN **)&Pfn1);
    v6 = 3;
  }
  else
  {
    if( !OldIrql )
    {
      v6 = 4;
      goto LABEL_7;
    }
    IsLowestPageTablePage = 1;
    v6 = 1;
  }
  if( !IsLowestPageTablePage )
    goto LABEL_38;
LABEL_7:
  if( (v4->u2._bf_0 & 0x3FFFFFFFFFFFFFFFui64) < 0x10000 )
LABEL_38:
    KeBugCheckEx(
      0x1Au,
      (PVOID)0x41791,
      v4,
      (PVOID)(v4->PteLong | 0x8000000000000000ui64),
      (PVOID)(v4->u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64));
  v7 = 0i64;
  v8 = 0i64;
  while( 1 )
  {
    bf_0 = v4->u4._bf_0;
    LODWORD(SpinCount) = 0;
    v10 = bf_0 & 0xFFFFFFFFFi64;
    while( _interlockedbittestandset64((volatile signed __int32 *)&v4->u2, 0x3Fui64) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( v4->u2._bf_0 < 0 );
    }
    v11 = v4->u2._bf_0 ^ ((v4->u2._bf_0 - 0x10000) ^ v4->u2._bf_0) & 0x3FFFFFFFFFFFFFFFi64;
    v4->u2._bf_0 = v11;
    v12 = v11 & 0x3FFFFFFFFFFFFFFFi64;
    if( v12 >= 0x10000 )
      break;
    if( !v3 )
      v3 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v4->u4._bf_0 >> 39) & 0x3FF));
    ++v7;
    if( !v12 && MiPfnShareCountIsZero(v4, 0i64) != PageStillReferenced )
      ++v8;
    _InterlockedAnd64(&v4->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
    if( !--v6 )
      goto LABEL_21;
    v4 = &MmGetPfnDb()[v10];
  }
  _InterlockedAnd64(&v4->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
LABEL_21:
  if( v7 )
  {
    if( v3 == &Irp )
    {
      CurrentPrcb = KeGetCurrentPrcb();
      CachedResidentAvailable = (int)CurrentPrcb->CachedResidentAvailable;
      if( (_DWORD)CachedResidentAvailable != -1 )
      {
        if( v7 + CachedResidentAvailable <= 0x100 )
        {
          do
          {
            if( v7 >= 0x80000 )
              break;
            v16 = _InterlockedCompareExchange(
                    (volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
                    CachedResidentAvailable + v7,
                    CachedResidentAvailable);
            v15 = (_DWORD)CachedResidentAvailable == v16;
            LODWORD(CachedResidentAvailable) = v16;
            if( v15 )
              goto LABEL_35;
          }
          while( v16 != -1 && v7 + v16 <= 0x100 );
        }
        if( (int)CachedResidentAvailable > 192
          && (_DWORD)CachedResidentAvailable != -1
          && (_DWORD)CachedResidentAvailable == _InterlockedCompareExchange(
                                                  (volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
                                                  192,
                                                  CachedResidentAvailable) )
        {
          v7 += (int)CachedResidentAvailable - 192;
        }
      }
    }
    if( v7 )
      _InterlockedExchangeAdd64((volatile signed __int64 *)&v3->Vp.ResidentAvailablePages, v7);
  }
LABEL_35:
  if( v8 )
    MiReturnCommit(v3, v8);
}

Referenced by:

MiCopyOnWrite
MiDemoteCombinedPte
MiUnlockPageTableRange
MiUnlockWsle
MmUnlockPages
NtLockVirtualMemory