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