MiChargeForLockedPage

_MI_RESAVAIL_CHARGE __stdcall MiChargeForLockedPage(_MMPFN *Pfn1, UINT64 ChargeFlags){
  UINT8 v2; 
  wchar_t *v3; 
  int v4; 
  UINT64 v5; 
  int v6; 
  __int64 v7; 
  unsigned int v8; 
  char v9; 
  char v10; 
  int v11; 
  __int64 v12; 
  _MI_PARTITION *v13; 
  _MI_RESAVAIL_CHARGE result; 
  struct _KPRCB *CurrentPrcb; 
  signed __int32 CachedResidentAvailable; 
  signed __int32 v17; 
  _MI_RESAVAIL_CHARGE v18; 

  v4 = ChargeFlags & 1;
  v5 = (unsigned int)-(v4 != 0);
  LOBYTE(v6) = MI_PFN_IS_PROTO((_UNICODE_STRING *)Pfn1, (_UNICODE_STRING *)(v4 ^ 1u), v2, v3);
  if( v6 && (*(_DWORD *)(v7 + 16) & 0x400i64) != 0 )
  {
    v9 = 1;
  }
  else
  {
    MiIsPfnCommitNotCharged((_MMPFN *)v7);
    v9 = v10;
    if( v11 )
      v9 = 1;
  }
  v12 = (*(_QWORD *)(v7 + 40) >> 39) & 0x3FFi64;
  v13 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * v12);
  if( !v9
    || (result = MiChargeCommit(*(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * v12), 1ui64, v8)) != MiChargeFailed )
  {
    if( v13 == &Irp )
    {
      CurrentPrcb = KeGetCurrentPrcb();
      CachedResidentAvailable = CurrentPrcb->CachedResidentAvailable;
      if( CachedResidentAvailable )
      {
        while( CachedResidentAvailable != -1 )
        {
          v17 = CachedResidentAvailable;
          CachedResidentAvailable = _InterlockedCompareExchange(
                                      (volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
                                      CachedResidentAvailable - 1,
                                      CachedResidentAvailable);
          if( v17 == CachedResidentAvailable )
            return 1;
          if( !CachedResidentAvailable )
            break;
        }
      }
    }
    v18 = MiChargePartitionResidentAvailable(v13, 1ui64, v5);
    if( v18 == MiChargeFailed )
    {
      if( v9 )
        MiReturnCommit(v13, 1ui64);
    }
    return v18;
  }
  return result;
}

Referenced by:

MiAddLockedPageCharge
MiCheckProtoPtePageState
MiLockProtoPoolPage
MiMigratePfn
MiWalkEntireImage