SepFlattenAcl
INT64 __fastcall SepFlattenAcl(INT64 a1, CHAR **a2, UINT64 *a3, _WORD *a4){
unsigned int v4;
unsigned __int8 *v5;
unsigned int v6;
__int16 v8;
INT64 v9;
unsigned int v10;
__int64 v11;
char v12;
CHAR *PoolWithTag;
CHAR *v14;
CHAR *v16;
char v17;
int v18;
int v19;
v4 = *(unsigned __int16 *)(a1 + 4);
v5 = (unsigned __int8 *)(a1 + 8);
v6 = 0;
*a2 = 0i64;
v8 = 0;
*(_DWORD *)a3 = 0;
v9 = a1 + 8;
v10 = 0;
if( !(_WORD)v4 )
return 3221226021i64;
v11 = v4;
do
{
v12 = *(_BYTE *)v9;
v10 += 12;
if( *(_BYTE *)v9 <= 3u || v12 == 17 || v12 == 20 || v12 == 21 )
{
v10 += 4 * *(unsigned __int8 *)(v9 + 9) + 8;
++v8;
}
v9 += *(unsigned __int16 *)(v9 + 2);
--v11;
}
while( v11 );
if( !v8 )
return 3221226021i64;
PoolWithTag = (CHAR *)ExAllocatePoolWithTag(PagedPool, v10, 0x614C6553ui64);
v14 = PoolWithTag;
if( !PoolWithTag )
return 3221225495i64;
v16 = PoolWithTag;
if( *(_WORD *)(a1 + 4) )
{
do
{
v17 = *v5;
if( *v5 <= 3u || v17 == 17 || v17 == 20 || v17 == 21 )
{
v18 = *((_DWORD *)v5 + 1);
*((_DWORD *)v16 + 1) = v5[1];
v19 = *v5;
*((_DWORD *)v16 + 2) = v18;
*(_DWORD *)v16 = v19;
memmove((UINT8 *)v16 + 12, v5 + 8, 4i64 * v5[9] + 8);
v16 += 4 * v5[9] + 20;
}
++v6;
v5 += *((unsigned __int16 *)v5 + 1);
}
while( v6 < *(unsigned __int16 *)(a1 + 4) );
}
*a2 = v14;
*(_DWORD *)a3 = v10;
*a4 = v8;
return 0i64;
}Referenced by:
SeLogAccessFailure