SepAppendAceToTokenDefaultDacl

INT64 __fastcall SepAppendAceToTokenDefaultDacl(INT64 a1, UINT8 *a2){
  ACL *v2; 
  _ACL *v3; 
  __int64 v6; 
  int AclSize; 
  int Acl; 
  unsigned int v9; 
  struct _ACL *PoolWithTag; 
  UINT32 v11; 
  UINT64 AceListLength; 
  UINT32 Information; 
  PVOID Ace; 
  __int64 AclInformation; 
  int v17; 
  v2 = *(ACL **)(a1 + 184);
  Information = 0;
  v3 = 0i64;
  Ace = 0i64;
  AclInformation = 0i64;
  v17 = 0;
  if( !v2 )
  {
    Acl = 0;
LABEL_12:
    if( v3 )
      ExFreePoolWithTag(v3, 0);
    return(unsigned int)Acl;
  }
  LODWORD(v6) = RtlFindAceBySid(v2, a2, 0i64);
  if( v6 )
    return 0;
  AclSize = v2->AclSize;
  Acl = RtlQueryInformationAcl(v2, &Information, 4ui64, AclRevisionInformation);
  if( Acl >= 0 )
  {
    Acl = RtlQueryInformationAcl(v2, &AclInformation, 0xCui64, AclSizeInformation);
    if( Acl >= 0 )
    {
      v9 = (AclSize + 4 * a2[1] + 19) & 0xFFFFFFFC;
      PoolWithTag = (struct _ACL *)ExAllocatePoolWithTag(PagedPool, v9, 0x63416553ui64);
      v3 = PoolWithTag;
      if( !PoolWithTag )
        return(unsigned int)-1073741670;
      v11 = Information;
      Acl = RtlCreateAcl(PoolWithTag, v9, Information);
      if( Acl >= 0 )
      {
        Acl = RtlGetAce(v2, 0i64, &Ace);
        if( Acl >= 0 )
        {
          LODWORD(AceListLength) = HIDWORD(AclInformation) - 8;
          Acl = RtlAddAce(v3, v11, 0i64, Ace, AceListLength);
          if( Acl >= 0 )
          {
            Acl = RtlAddAccessAllowedAce(v3, v11, 0x10000000u, a2);
            if( Acl >= 0 )
            {
              Acl = SepExpandDynamic(
                      (_TOKEN *)a1,
                      (v9 + 4 * *(unsigned __int8 *)(*(_QWORD *)(a1 + 168) + 1i64) + 11) & 0xFFFFFFFC);
              if( Acl >= 0 )
              {
                SepFreeDefaultDacl(a1);
                SepAppendDefaultDacl((_TOKEN *)a1, v3);
              }
            }
          }
        }
      }
      goto LABEL_12;
    }
  }
  return(unsigned int)Acl;
}

Referenced by:

NtCreateLowBoxToken