SeCaptureObjectTypeList
INT64 __fastcall SeCaptureObjectTypeList(UINT64 a1, UINT64 a2, CHAR a3, CHAR **a4){
unsigned int v5;
int v7;
char *PoolWithTag;
__int64 v9;
char *v10;
__int64 v11;
__int64 v12;
__int64 v13;
__int64 v14;
char *v15;
_OWORD *v16;
unsigned int v17;
__int64 v18;
int v20;
char *v21;
__int64 v22[4];
v5 = a2;
v22[0] = (__int64)a4;
v7 = 0;
PoolWithTag = 0i64;
*(_QWORD *)v22[0] = 0i64;
if( a3 != 1 )
return 3221225474i64;
if( (_DWORD)a2 )
{
if( a1 )
{
v9 = 16i64 * (unsigned int)a2;
if( v9 )
{
if( (a1 & 3) != 0 )
ExRaiseDatatypeMisalignment();
if( v9 + a1 > 0x7FFFFFFF0000i64 || v9 + a1 < a1 )
MEMORY[0x7FFFFFFF0000] = 0;
}
PoolWithTag = (char *)ExAllocatePoolWithTag(PagedPool, 48i64 * (unsigned int)a2, 0x744F6553ui64);
v21 = PoolWithTag;
v10 = PoolWithTag;
if( PoolWithTag )
{
v11 = 0i64;
v20 = 0;
while( (unsigned int)v11 < v5 )
{
v12 = (unsigned int)v11;
v13 = 2 * v11;
v14 = *(unsigned __int16 *)(a1 + 8 * v13);
if( (unsigned int)v14 > 4 )
goto LABEL_27;
v15 = &PoolWithTag[48 * v12];
*(_DWORD *)v15 = (unsigned __int16)v14;
v16 = *(_OWORD **)(a1 + 8 * v13 + 8);
if( ((unsigned __int8)v16 & 3) != 0 )
ExRaiseDatatypeMisalignment();
*(_OWORD *)(v15 + 4) = *v16;
*((_QWORD *)v15 + 3) = 0i64;
*((_DWORD *)v15 + 8) = 0;
*((_QWORD *)v15 + 5) = 0i64;
if( v20 )
{
v17 = v14;
PoolWithTag = v21;
if( (unsigned int)v14 > (unsigned int)*(unsigned __int16 *)&v21[48 * (v20 - 1)] + 1 || !(_WORD)v14 )
goto LABEL_27;
}
else
{
if( (_WORD)v14 )
{
v7 = -1073741811;
PoolWithTag = v21;
break;
}
v17 = 0;
PoolWithTag = v21;
}
v18 = 6 * v12;
if( (_WORD)v14 )
*(_DWORD *)&v10[8 * v18 + 20] = *((_DWORD *)v22 + v17 + 1);
else
*(_DWORD *)&v10[8 * v18 + 20] = -1;
*((_DWORD *)&v22[1] + v14) = v20;
v11 = (unsigned int)++v20;
v7 = 0;
}
}
else
{
v7 = -1073741670;
}
}
else
{
LABEL_27:
v7 = -1073741811;
}
}
if( v7 < 0 )
{
if( PoolWithTag )
ExFreePoolWithTag(PoolWithTag, 0);
}
else
{
*a4 = PoolWithTag;
}
return(unsigned int)v7;
}Referenced by:
SeAccessCheckByTypeWithAdminlessChecks
SepAccessCheckAndAuditAlarmWithAdminlessChecks