SddlAddAccessFilterAce
INT64 __fastcall SddlAddAccessFilterAce(
ACL *Acl,
INT64 a2,
INT64 a3,
INT64 a4,
INT64 a5,
INT64 a6,
UINT8 *Src,
INT16 a8){
int v8;
INT64 result;
unsigned __int8 AclRevision;
int v13;
int v14;
unsigned int v15;
unsigned int v16;
PACE v17;
ULONG v18;
unsigned int v19;
BYTE v20;
PACE Ace;
int v22;
unsigned __int16 v23;
int v24;
unsigned __int16 v25;
Ace = 0i64;
v8 = a3;
v20 = a3;
v24 = 0;
v25 = 256;
v22 = 0;
v23 = 4864;
if( !Acl || !RtlValidAcl(Acl) )
return 3221225591i64;
if( !Src || (unsigned __int16)(a8 - 6) > 0xFFF8u || *(_DWORD *)Src != 2020897377 )
return 3221225485i64;
if( !RtlValidSid((PVOID)a4) )
return 3221225592i64;
AclRevision = 2;
if( (v8 & 0x40) != 0 )
{
if( *(_BYTE *)(a4 + 1) != 2 )
return 3221225485i64;
v13 = *(_DWORD *)(a4 + 2) - v22;
if( !v13 )
v13 = *(unsigned __int16 *)(a4 + 6) - v23;
if( v13 || !*(_DWORD *)(a4 + 8) && *(_DWORD *)(a4 + 12) )
return 3221225485i64;
}
else
{
v14 = *(_DWORD *)(a4 + 2) - v24;
if( !v14 )
v14 = *(unsigned __int16 *)(a4 + 6) - v25;
if( v14 || *(_BYTE *)(a4 + 1) != 1 || *(_DWORD *)(a4 + 8) )
return 3221225485i64;
}
if( Acl->AclRevision > 4u )
return 3221225561i64;
if( Acl->AclRevision > 2u )
AclRevision = Acl->AclRevision;
if( (v8 & 0xFFFFFFA0) != 0 || (a6 & 0xFF000000) != 0 )
return 3221225485i64;
if( !RtlFirstFreeAce(Acl, (VOID **)&Ace) )
return 3221225591i64;
v15 = ((unsigned __int16)a8 + 3) & 0xFFFFFFFC;
v16 = RtlLengthSid((PVOID)a4) + v15 + 8;
if( v16 < v15 )
return 534i64;
if( v16 > 0xFFFF )
return 3221225485i64;
v17 = Ace;
if( !Ace || (char *)Ace + v16 > (char *)Acl + Acl->AclSize )
return 3221225625i64;
Ace->Header.AceFlags = v20;
v17->Header.AceType = 21;
v17->Header.AceSize = v16;
v17->AccessMask = a6;
v18 = RtlLengthSid((PVOID)a4);
RtlCopySid(v18, &v17[1], (PSID)a4);
v19 = RtlLengthSid((PVOID)a4);
memmove((UINT8 *)&v17[1] + v19, Src, (unsigned __int16)a8);
++Acl->AceCount;
result = 0i64;
Acl->AclRevision = AclRevision;
return result;
}Referenced by:
LocalGetAclForString