RtlpCopyAces
__int64 __fastcall RtlpCopyAces(
__int64 a1,
struct _GENERIC_MAPPING *a2,
int a3,
char a4,
char a5,
__int64 a6,
__int64 a7,
__int64 a8,
__int64 a9,
char a10,
char a11,
int a12,
unsigned int *a13,
__int64 a14){
char v14;
int v15;
_GENERIC_MAPPING *GenericMapping;
__int64 v17;
unsigned __int8 v18;
unsigned __int64 v19;
unsigned int v20;
unsigned __int8 *i;
__int64 v22;
unsigned int v23;
unsigned int v24;
int v25;
__int64 v26;
int v27;
struct _GENERIC_MAPPING *v28;
int v29;
unsigned int v30;
int v31;
int GenericAll;
int v34;
char v35;
UINT8 *v36;
bool v37;
bool v38;
char v39;
__int64 v40;
int v41;
UINT64 GuidCount;
char v43;
UINT8 NewAceLength[14];
UINT8 *dst;
struct _GENERIC_MAPPING *v47;
int v48;
VOID *ServerGroupSid;
VOID *ServerOwnerSid;
VOID *ClientGroupSid;
VOID *ClientOwnerSid;
unsigned int *v53;
int v54;
unsigned __int16 v55;
v14 = 0;
v15 = a3;
ClientOwnerSid = (VOID *)a6;
GenericMapping = a2;
v17 = a1;
ClientGroupSid = (VOID *)a7;
ServerOwnerSid = (VOID *)a8;
ServerGroupSid = (VOID *)a9;
v53 = a13;
v18 = *(_BYTE *)a14 - 2;
v48 = a3;
v47 = a2;
*(_QWORD *)&NewAceLength[6] = a1;
v43 = 0;
if( v18 > 2u )
return 3221225560i64;
v19 = a14 + 8;
v20 = 0;
for( i = 0i64; v20 < *(unsigned __int16 *)(a14 + 4); v19 += *(unsigned __int16 *)(v19 + 2) )
{
if( v19 >= a14 + (unsigned __int64)*(unsigned __int16 *)(a14 + 2) )
return 3221225597i64;
++v20;
}
if( v19 <= a14 + (unsigned __int64)*(unsigned __int16 *)(a14 + 2) )
i = (unsigned __int8 *)v19;
v22 = v17 + 8;
v23 = 0;
v24 = 0;
if( !*(_WORD *)(v17 + 4) )
{
LABEL_37:
*v53 = v23;
return v14 != 0 ? 0xC0000023 : 0;
}
v25 = a12;
while( *(_BYTE *)v22 != 17 )
{
if( v25 == 3 )
goto LABEL_34;
LABEL_9:
switch( v15 )
{
case 0:
if( (*(_BYTE *)(v22 + 1) & 0x10) == 0 )
break;
LABEL_12:
if( !a5 )
{
v26 = *(unsigned __int16 *)(v22 + 2);
if( !i || v26 > a14 + *(unsigned __int16 *)(a14 + 2) - (_QWORD)i )
{
v14 = 1;
v43 = 1;
i = (unsigned __int8 *)(a14 + *(unsigned __int16 *)(a14 + 2));
goto LABEL_33;
}
if( !v14 )
{
memmove(i, (UINT8 *)v22, *(unsigned __int16 *)(v22 + 2));
if( (*i < 0xBu || (unsigned __int8)(*i - 13) <= 1u) && (i[1] & 8) == 0 )
{
v27 = *((_DWORD *)i + 1);
v28 = v47;
if( v27 < 0 )
{
v27 |= v47->GenericRead;
*((_DWORD *)i + 1) = v27;
}
if( (v27 & 0x40000000) != 0 )
{
v27 |= v28->GenericWrite;
*((_DWORD *)i + 1) = v27;
}
if( (v27 & 0x20000000) != 0 )
{
v27 |= v28->GenericExecute;
*((_DWORD *)i + 1) = v27;
}
if( (v27 & 0x10000000) != 0 )
v27 |= v28->GenericAll;
v29 = v27 & 0xFFFFFFF;
*((_DWORD *)i + 1) = v29;
v30 = *i;
if( (unsigned __int8)v30 <= 0xAu && (v31 = 1651, _bittest(&v31, v30)) )
GenericAll = v28->GenericAll;
else
GenericAll = v28->GenericAll | 0x1000000;
*((_DWORD *)i + 1) = v29 & GenericAll;
}
i[1] &= ~a4;
goto LABEL_31;
}
LABEL_63:
i = (unsigned __int8 *)(a14 + *(unsigned __int16 *)(a14 + 2));
goto LABEL_33;
}
v34 = 0;
v35 = *(_BYTE *)(v22 + 1);
v36 = i;
*(_DWORD *)&NewAceLength[2] = 0;
LODWORD(v26) = 0;
NewAceLength[1] = 0;
dst = i;
v37 = a10 && (v35 & 3) != 0;
if( (v35 & 8) == 0 )
{
v38 = 0;
NewAceLength[0] = 0;
if( a11 )
v38 = (v35 & 0x10) != 0;
LODWORD(GuidCount) = 0;
if( !RtlpCopyEffectiveAce(
(_ACE_HEADER *)v22,
v38,
v37,
ClientOwnerSid,
ClientGroupSid,
ServerOwnerSid,
ServerGroupSid,
GenericMapping,
0i64,
GuidCount,
(VOID **)&dst,
(UINT64 *)&NewAceLength[2],
(_ACL *)a14,
0i64,
&NewAceLength[1],
NewAceLength) )
return 3221225597i64;
if( NewAceLength[0] )
{
v14 = 1;
v43 = 1;
}
else
{
v14 = v43;
}
v34 = *(_DWORD *)&NewAceLength[2];
LODWORD(v26) = *(_DWORD *)&NewAceLength[2];
if( !v14 && *(_DWORD *)&NewAceLength[2] )
{
v39 = a4;
i[1] &= ~a4;
v36 = dst;
v34 = *(_DWORD *)&NewAceLength[2];
if( !v37 )
goto LABEL_50;
LABEL_49:
v41 = *(_DWORD *)(v22 + 10);
v54 = 0;
v55 = 768;
if( !v41 )
v41 = *(unsigned __int16 *)(v22 + 14) - v55;
if( v34 && !NewAceLength[1] )
{
v17 = *(_QWORD *)&NewAceLength[6];
if( !v14 )
{
i[1] = ~v39 & (i[1] | *(_BYTE *)(v22 + 1) & 0x1F);
goto LABEL_32;
}
goto LABEL_63;
}
if( *(_BYTE *)v22 > 8u || *(_DWORD *)(v22 + 4) || !v41 )
{
LODWORD(v26) = *(unsigned __int16 *)(v22 + 2) + (_DWORD)v26;
if( (unsigned int)v26 > 0xFFFF )
return 3221225597i64;
if( *(unsigned __int16 *)(v22 + 2) > a14 + *(unsigned __int16 *)(a14 + 2) - (_QWORD)v36 )
{
v14 = 1;
v43 = 1;
}
else if( !v14 )
{
memmove(v36, (UINT8 *)v22, *(unsigned __int16 *)(v22 + 2));
v17 = *(_QWORD *)&NewAceLength[6];
dst[1] |= 8u;
dst[1] &= ~a4;
LABEL_31:
v14 = v43;
++*(_WORD *)(a14 + 4);
LABEL_32:
i += (unsigned int)v26;
LABEL_33:
v23 += v26;
v15 = v48;
break;
}
}
else
{
LABEL_50:
if( !v14 )
{
v17 = *(_QWORD *)&NewAceLength[6];
goto LABEL_32;
}
}
v17 = *(_QWORD *)&NewAceLength[6];
goto LABEL_63;
}
v36 = dst;
}
v39 = a4;
goto LABEL_49;
case 1:
if( (*(_BYTE *)(v22 + 1) & 0x10) != 0 )
break;
goto LABEL_12;
case 2:
goto LABEL_12;
}
LABEL_34:
GenericMapping = v47;
v22 += *(unsigned __int16 *)(v22 + 2);
++v24;
v25 = a12;
if( v24 >= *(unsigned __int16 *)(v17 + 4) )
goto LABEL_35;
}
if( v25 != 3 )
goto LABEL_34;
LODWORD(v40) = RtlFindAceByType((ACL *)a14, 0x11ui64, 0i64);
if( !v40 )
{
v14 = v43;
GenericMapping = v47;
goto LABEL_9;
}
LABEL_35:
if( v23 <= 0xFFFF )
{
v14 = v43;
goto LABEL_37;
}
return 3221225597i64;
}Referenced by:
RtlpComputeMergedAcl2
RtlpInheritAcl2