ExAllocatePool3

VOID *__fastcall ExAllocatePool3(INT64 a1, UINT64 a2, unsigned int a3, __int64 a4, unsigned int a5){
  char v5; 
  char v9; 
  _EX_POOL_PRIORITY v10; 
  int v11; 
  unsigned int i; 
  UINT64 v13; 
  INT64 arg20; 
  char v16[4]; 
  __int64 v17[4]; 
  char v18; 

  LODWORD(v17[0]) = 0;
  v5 = 0;
  v18 = 0;
  v16[0] = 0;
  v9 = a1;
  v10 = NormalPoolPriority;
  if( !a3 )
  {
LABEL_2:
    v11 = -1073741811;
LABEL_3:
    if( (v9 & 0x20) != 0 )
      RtlRaiseStatus(v11);
    return 0i64;
  }
  v11 = ExpPoolFlagsToPoolType(a1, 0i64, v17, &v18, v16);
  if( v11 < 0 )
    goto LABEL_3;
  for( i = 0; i < a5; a4 += 16i64 )
  {
    if( (unsigned __int8)*(_QWORD *)a4 == 1 && !v18 )
    {
      v10 = *(_DWORD *)(a4 + 8);
      if( (v10 & 0xFFFFFFCF) != 0 || v10 == (HighPoolPriority|NormalPoolPriority) )
        goto LABEL_2;
      v5 = 1;
    }
    else if( (*(_QWORD *)a4 & 0x100i64) == 0 )
    {
      goto LABEL_2;
    }
    ++i;
  }
  if( v18 )
    return ExAllocatePoolWithQuotaTag(v17[0], a2, a3);
  if( v5 )
    return ExAllocatePoolWithTagPriority(v17[0], a2, a3, v10);
  LODWORD(arg20) = v16[0] != 0;
  v13 = KeGetCurrentPrcb()->ParentNode->Affinity.Reserved[0];
  LODWORD(v13) = v13 | 0x80000000;
  return ExpAllocatePoolWithTagFromNode(LODWORD(v17[0]), a2, a3, v13, arg20);
}

Referenced by:

VerifierExAllocatePool3