SepCreateImpersonationTokenDacl

INT64 __stdcall SepCreateImpersonationTokenDacl(_TOKEN *Token, PVOID PrimaryToken, _ACL **Acl){
  unsigned __int8 *Package; 
  unsigned __int8 *v5; 
  unsigned __int8 *v8; 
  UINT32 v9; 
  struct _ACL *PoolWithTag; 
  _ACL *v11; 
  VOID *Sid; 
  Package = 0i64;
  v5 = 0i64;
  Sid = (VOID *)**((_QWORD **)PrimaryToken + 19);
  if( (*((_DWORD *)PrimaryToken + 50) & 0x4000) != 0 )
    v5 = (unsigned __int8 *)*((_QWORD *)PrimaryToken + 98);
  v8 = (unsigned __int8 *)Token->UserAndGroups->Sid;
  if( (Token->TokenFlags & 0x4000) != 0 )
    Package = (unsigned __int8 *)Token->Package;
  v9 = 4
     * (*(unsigned __int8 *)(**((_QWORD **)PrimaryToken + 19) + 1i64)
      + v8[1]
      + *((unsigned __int8 *)SeLocalSystemSid + 1)
      + *((unsigned __int8 *)SeAliasAdminsSid + 1)
      + *(unsigned __int8 *)(*(_QWORD *)&SeRestrictedSid + 1i64))
     + 88;
  if( Package )
    v9 += 4 * Package[1] + 16;
  if( v5 )
  {
    if( Package && RtlEqualSid(v5, Package) )
      v5 = 0i64;
    else
      v9 += 4 * v5[1] + 16;
  }
  PoolWithTag = (struct _ACL *)ExAllocatePoolWithTag(PagedPool, v9, 0x20206553ui64);
  v11 = PoolWithTag;
  if( PoolWithTag )
  {
    RtlCreateAcl(PoolWithTag, v9, 2u);
    RtlpAddKnownAce(v11, 2ui64, 0i64, 0xF01FFui64, Sid, 0);
    RtlpAddKnownAce(v11, 2ui64, 0i64, 0xF01FFui64, v8, 0);
    RtlpAddKnownAce(v11, 2ui64, 0i64, 0xF01FFui64, SeAliasAdminsSid, 0);
    RtlpAddKnownAce(v11, 2ui64, 0i64, 0xF01FFui64, SeLocalSystemSid, 0);
    if( Package )
      RtlpAddKnownAce(v11, 2ui64, 0i64, 0xF01FFui64, Package, 0);
    if( v5 )
      RtlpAddKnownAce(v11, 2ui64, 0i64, 0xF01FFui64, v5, 0);
    if( *((_QWORD *)PrimaryToken + 20) || Token->RestrictedSids )
      RtlpAddKnownAce(v11, 2ui64, 0i64, 0xF01FFui64, *(VOID **)&SeRestrictedSid, 0);
    *Acl = v11;
    return 0i64;
  }
  else
  {
    *Acl = 0i64;
    return 3221225626i64;
  }
}

Referenced by:

NtOpenThreadTokenEx