PspDereferenceQuotaBlock

VOID __fastcall PspDereferenceQuotaBlock(volatile INT32 *P){
  int v2; 
  char *v3; 
  volatile INT32 *v4; 
  __int64 v5; 
  INT64 v6; 
  __int64 v7; 
  if( _InterlockedExchangeAdd(P + 128, 0xFFFFFFFF) == 1 )
  {
    v2 = 0;
    v3 = PspResourceFlags;
    v4 = P + 18;
    do
    {
      if( (*v3 & 3) == 1 )
      {
        v5 = *((_QWORD *)v4 + 1);
        v6 = *((_QWORD *)v4 - 1);
        if( v6 + *(_QWORD *)v4 )
        {
          if( v5 )
          {
            v7 = _InterlockedExchange64((volatile __int64 *)v4, 0i64);
            v6 = _InterlockedExchange64((volatile __int64 *)v4 - 1, 0i64) + v7;
          }
        }
        else
        {
          v6 = 0i64;
        }
        if( v6 || v5 )
          PspReturnResourceQuota((unsigned int)v2, (INT64)(v4 - 18), v6, v5 != 0);
      }
      ++v2;
      v4 += 32;
      v3 += 8;
    }
    while( v2 < 4 );
    PspRemoveQuotaBlock((__int64)P);
    ExFreePoolWithTag((PVOID)P, 0);
  }
}

Referenced by:

ObpFreeObject
PsReturnSharedPoolQuota
PspAssignProcessQuotaBlock