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