PspInitializeQuotaBlock

NTSTATUS __stdcall PspInitializeQuotaBlock(
        _QUOTA_LIMITS_EX *QuotaLimits,
        PS_QUOTA_LIMIT *LimitList,
        _EPROCESS_QUOTA_BLOCK *NewQuotaBlock){
  UINT64 v6; 
  int v7; 
  unsigned int *p_Limit; 
  __int64 v9; 
  PS_QUOTA_LIMIT *i; 
  char v11; 
  UINT64 v12; 
  UINT64 NewLimit; 

  NewLimit = 0i64;
  memset(NewQuotaBlock, 0i64, sizeof(_EPROCESS_QUOTA_BLOCK));
  NewQuotaBlock->ProcessCount = 1;
  NewQuotaBlock->ReferenceCount = 1;
  if( QuotaLimits && (QuotaLimits[1].TimeLimit.anonymous_0.LowPart & 0x10) != 0 )
  {
    if( *(_QWORD *)&QuotaLimits->PagedPoolLimit
      || *(_QWORD *)&QuotaLimits->WorkingSetLimit
      || *(_QWORD *)&QuotaLimits->MinimumWorkingSetSize
      || *(_QWORD *)&QuotaLimits->Flags )
    {
      return -1073741811;
    }
    QuotaLimits = 0i64;
    LimitList = PspDefaultResourceLimits;
  }
  v7 = 0;
  p_Limit = &NewQuotaBlock->QuotaEntry[0].Limit;
  v9 = 0i64;
  for( i = LimitList; ; ++i )
  {
    v11 = PspResourceFlags[v9 * 2];
    if( (v11 & 2) != 0 )
      goto LABEL_9;
    v12 = LimitList ? *i : *(_QWORD *)((char *)&QuotaLimits->PagedPoolLimit + *(_QWORD *)&PspQuotaLimitOffsets[v9]);
    *(_QWORD *)p_Limit = v12;
    if( (v11 & 1) == 0 )
      goto LABEL_9;
    if( v12 != -1i64 )
      break;
    *(_QWORD *)p_Limit = 0i64;
    PspInsertExpansionEntry(&PspQuotaExpansionDescriptors[14 * v7]);
LABEL_9:
    ++v7;
    p_Limit += 32;
    v9 += 4i64;
    if( v7 >= 4 )
      return 0;
  }
  if( !v12 )
    goto LABEL_9;
  NewLimit = 0i64;
  if( (unsigned __int8)PspExpandLimit((PS_RESOURCE_TYPE)v7, v6, v12, &NewLimit) )
  {
    if( !v7 )
      IoEnableIrpCredits();
    goto LABEL_9;
  }
  return -1073741670;
}

Referenced by:

PspAssignProcessQuotaBlock