SddlAddAccessFilterAce
NTSTATUS __stdcall SddlAddAccessFilterAce(
PACL Acl,
INT64 a2,
INT64 a3,
INT64 a4,
INT64 a5,
INT64 a6,
VOID *Src,
INT16 a8){
int v8;
char v11;
NTSTATUS result;
unsigned __int8 AclRevision;
int v14;
int v15;
unsigned int v16;
unsigned int v17;
_WORD *v18;
unsigned int v19;
unsigned int v20;
char v21;
VOID *FirstFree;
int v23;
unsigned __int16 v24;
int v25;
unsigned __int16 v26;
FirstFree = 0i64;
v8 = a3;
v21 = a3;
v25 = 0;
v26 = 256;
v23 = 0;
v24 = 4864;
if( !Acl )
return -1073741705;
RtlValidAcl(Acl, (VOID *)a2, (VOID *)a3);
if( !v11 )
return -1073741705;
if( !Src || (unsigned __int16)(a8 - 6) > 0xFFF8u || *(_DWORD *)Src != 2020897377 )
return -1073741811;
if( !RtlValidSid((_BYTE *)a4) )
return -1073741704;
AclRevision = 2;
if( (v8 & 0x40) != 0 )
{
if( *(_BYTE *)(a4 + 1) != 2 )
return -1073741811;
v14 = *(_DWORD *)(a4 + 2) - v23;
if( !v14 )
v14 = *(unsigned __int16 *)(a4 + 6) - v24;
if( v14 || !*(_DWORD *)(a4 + 8) && *(_DWORD *)(a4 + 12) )
return -1073741811;
}
else
{
v15 = *(_DWORD *)(a4 + 2) - v25;
if( !v15 )
v15 = *(unsigned __int16 *)(a4 + 6) - v26;
if( v15 || *(_BYTE *)(a4 + 1) != 1 || *(_DWORD *)(a4 + 8) )
return -1073741811;
}
if( Acl->AclRevision > 4u )
return -1073741735;
if( Acl->AclRevision > 2u )
AclRevision = Acl->AclRevision;
if( (v8 & 0xFFFFFFA0) != 0 || (a6 & 0xFF000000) != 0 )
return -1073741811;
if( !RtlFirstFreeAce(Acl, &FirstFree) )
return -1073741705;
v16 = ((unsigned __int16)a8 + 3) & 0xFFFFFFFC;
v17 = RtlLengthSid(a4) + v16 + 8;
if( v17 < v16 )
return 534;
if( v17 > 0xFFFF )
return -1073741811;
v18 = FirstFree;
if( !FirstFree || (char *)FirstFree + v17 > (char *)Acl + Acl->AclSize )
return -1073741671;
*((_BYTE *)FirstFree + 1) = v21;
*(_BYTE *)v18 = 21;
v18[1] = v17;
*((_DWORD *)v18 + 1) = a6;
v19 = RtlLengthSid(a4);
RtlCopySid(v19, v18 + 4, (VOID *)a4);
v20 = RtlLengthSid(a4);
memmove((char *)v18 + v20 + 8, Src, (unsigned __int16)a8);
++Acl->AceCount;
result = 0;
Acl->AclRevision = AclRevision;
return result;
}Referenced by:
LocalGetAclForString