ExAllocatePool3

INT64 __fastcall ExAllocatePool3(INT64 a1, INT64 a2, INT64 a3, INT64 a4, UINT64 a5){
  char v5; 
  unsigned int v7; 
  char v9; 
  _EX_POOL_PRIORITY v10; 
  NTSTATUS v11; 
  unsigned int i; 
  UINT64 v13; 
  INT64 v15; 
  char v16[4]; 
  POOL_TYPE PoolType[9]; 
  BYTE v18; 
  PoolType[0] = NonPagedPool;
  v5 = 0;
  v18 = 0;
  v16[0] = 0;
  v7 = a3;
  v9 = a1;
  v10 = NormalPoolPriority;
  if( !(_DWORD)a3 )
  {
LABEL_2:
    v11 = -1073741811;
LABEL_3:
    if( (v9 & 0x20) != 0 )
      RtlRaiseStatus(v11);
    return 0i64;
  }
  v11 = ExpPoolFlagsToPoolType(a1, 0i64, (INT64 *)PoolType, &v18, (BYTE *)v16);
  if( v11 < 0 )
    goto LABEL_3;
  for( i = 0; i < (unsigned int)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(INT64)ExAllocatePoolWithQuotaTag(PoolType[0], a2, v7);
  if( v5 )
    return(INT64)ExAllocatePoolWithTagPriority(PoolType[0], a2, v7, v10);
  LODWORD(v15) = v16[0] != 0;
  v13 = *(unsigned __int16 *)(*((_QWORD *)KeGetCurrentPrcb() + 24) + 146i64);
  LODWORD(v13) = v13 | 0x80000000;
  return(INT64)ExpAllocatePoolWithTagFromNode((unsigned int)PoolType[0], a2, v7, v13, v15);
}

Referenced by:

VerifierExAllocatePool3