PspChargeQuota

NTSTATUS __stdcall PspChargeQuota(
        _EPROCESS_QUOTA_BLOCK *QuotaBlock,
        _EPROCESS *Process,
        PS_RESOURCE_TYPE ResourceType,
        UINT64 Amount){
  __int64 v4; 
  UINT64 *CacheAlign; 
  char v8; 
  UINT64 v9; 
  UINT64 v10; 
  unsigned __int64 v11; 
  bool v12; 
  signed __int64 v13; 
  unsigned __int64 v14; 
  unsigned __int64 v16; 
  char *v17; 
  unsigned __int64 v18; 
  unsigned __int64 v19; 
  unsigned __int64 v20; 
  unsigned __int64 v21; 
  int v22[8]; 
  UINT64 pLimit; 

  v4 = ResourceType;
  CacheAlign = (UINT64 *)QuotaBlock->QuotaEntry[(__int64)(int)ResourceType].CacheAlign;
  v8 = PspResourceFlags[8 * ResourceType];
  _m_prefetchw(CacheAlign);
  v9 = *CacheAlign;
  _InterlockedOr(v22, 0);
  while( 2 )
  {
    v10 = CacheAlign[8];
LABEL_3:
    for( pLimit = v10; ; v10 = pLimit )
    {
      v11 = v9 + Amount;
      if( v9 + Amount < v9 )
        return *(_DWORD *)&PspResourceFlags[8 * v4 + 4];
      if( v11 <= v10 )
        break;
      if( (v8 & 1) == 0 || !CacheAlign[10] )
        return *(_DWORD *)&PspResourceFlags[8 * v4 + 4];
      v21 = _InterlockedExchange64((volatile __int64 *)CacheAlign + 9, 0i64);
      if( v21 )
      {
        v10 = v21 + _InterlockedExchangeAdd64((volatile signed __int64 *)CacheAlign + 8, v21);
        goto LABEL_3;
      }
      if( !PspExpandQuota((_PS_RESOURCE_TYPE)v4, (_PSP_QUOTA_ENTRY *)CacheAlign, v9, Amount, &pLimit) )
        return *(_DWORD *)&PspResourceFlags[8 * v4 + 4];
    }
    v13 = _InterlockedCompareExchange64((volatile signed __int64 *)CacheAlign, v11, v9);
    v12 = v9 == v13;
    v9 = v13;
    if( !v12 )
      continue;
    break;
  }
  _m_prefetchw(CacheAlign + 1);
  v14 = CacheAlign[1];
  if( v11 > v14 )
  {
    do
    {
      v20 = v14;
      v14 = _InterlockedCompareExchange64((volatile signed __int64 *)CacheAlign + 1, v11, v14);
    }
    while( v14 != v20 && v11 > v14 );
  }
  if( Process )
  {
    if( (v8 & 4) != 0 )
    {
      v16 = Amount + _InterlockedExchangeAdd64((volatile signed __int64 *)&Process->ProcessQuotaUsage[v4], Amount);
      v17 = &Process->Pcb.gap0[8 * v4];
      _m_prefetchw(v17 + 1152);
      v18 = *((_QWORD *)v17 + 144);
      if( v16 > v18 )
      {
        do
        {
          v19 = v18;
          v18 = _InterlockedCompareExchange64((volatile signed __int64 *)v17 + 144, v16, v18);
        }
        while( v18 != v19 && v16 > v18 );
      }
    }
  }
  return 0;
}

Referenced by:

MiChargeFullProcessCommitment
MiInsertVadCharges
ObpIncrementHandleCountEx
PsChargeProcessNonPagedPoolQuota
PsChargeProcessPagedPoolQuota
PsChargeProcessPoolQuota
PsChargeProcessQuota
PsChargeSharedPoolQuota