RtlpSetSecurityObject

NTSTATUS __stdcall RtlpSetSecurityObject(
        VOID *Object,
        UINT64 SecurityInformation,
        VOID *ModificationDescriptor,
        VOID **ObjectsSecurityDescriptor,
        UINT64 AutoInheritFlags,
        UINT64 PoolType,
        _GENERIC_MAPPING *GenericMapping,
        VOID *Token){
  __int64 v8; 
  VOID **v9; 
  unsigned int v10; 
  unsigned int *v11; 
  unsigned __int16 *v12; 
  _SECURITY_SUBJECT_CONTEXT *p_SubjectContext; 
  __int16 v14; 
  char *v15; 
  unsigned int *v16; 
  __int16 v17; 
  __int64 v18; 
  _ACL *v19; 
  __int16 v20; 
  int v21; 
  bool v22; 
  __int64 v23; 
  unsigned __int8 *v24; 
  bool v25; 
  _QWORD *v26; 
  __int64 v27; 
  _BYTE *v28; 
  _ACL *v29; 
  __int16 v30; 
  _ACL *v31; 
  __int16 v32; 
  size_t v33; 
  int v34; 
  unsigned int v35; 
  unsigned int v36; 
  VOID **PoolWithTag; 
  VOID **v38; 
  _ACL *v39; 
  __int16 v40; 
  __int64 v41; 
  __int16 v42; 
  _GENERIC_MAPPING *v43; 
  __int64 v44; 
  VOID **v45; 
  _GENERIC_MAPPING *v46; 
  __int64 AclSize; 
  char *v48; 
  int valid; 
  _ACL *v50; 
  void *v51; 
  void *v52; 
  char *AceByType; 
  char *v55; 
  VOID *v56; 
  VOID *TokenTrustLevel; 
  int v58; 
  unsigned __int16 *v59; 
  _ACL *v60; 
  _ACL *v61; 
  __int16 v62; 
  _ACL *pTrustAcl; 
  _ACL **ppNewAcl; 
  unsigned __int16 v65; 
  __int16 v66; 
  __int64 v67; 
  __int64 v68; 
  unsigned int *v69; 
  __int16 v70; 
  __int64 v71; 
  __int16 v72; 
  __int64 v73; 
  _ACL *v74; 
  _BYTE *AceBySid; 
  UINT8 v76; 
  unsigned int v77; 
  unsigned int v78; 
  int v79; 
  __int64 v80; 
  _DWORD *v81; 
  UINT8 v82; 
  unsigned int v83; 
  __int64 v84; 
  int v85; 
  unsigned int v86; 
  unsigned int v87; 
  unsigned int v88; 
  _ACL *v89; 
  __int64 v90; 
  _QWORD *v91; 
  __int16 v92; 
  _BYTE *v93; 
  __int64 v94; 
  char v95; 
  __int16 v96; 
  UINT64 pIndex; 
  UINT8 v98; 
  bool v99; 
  bool v100; 
  char v101; 
  char v102; 
  char v103; 
  char v104; 
  char v105; 
  char v106; 
  char v107; 
  char v108; 
  char v109; 
  UINT8 ServerAclAllocated[8]; 
  VOID *Src; 
  PVOID v112; 
  PVOID v113; 
  _ACL *pScopeAcl; 
  _SID_IDENTIFIER_AUTHORITY v115; 
  _ACL *pAttributeAcl; 
  PVOID v117; 
  VOID **v118; 
  unsigned __int16 *v119; 
  _GENERIC_MAPPING *v120; 
  UINT64 pSaclSecurityInformation; 
  size_t Size[2]; 
  _BOOL4 v123; 
  int v124; 
  VOID *v125; 
  _SECURITY_SUBJECT_CONTEXT *v126; 
  _ACL *NewAcl; 
  _ACL *v128; 
  _ACL *v129; 
  _ACL *v130; 
  _ACL *Dacl; 
  VOID *Label; 
  INT64 ReturnStatus; 
  PVOID P; 
  _ACL *ServerAcl; 
  _SECURITY_SUBJECT_CONTEXT SubjectContext; 
  char Sid[8]; 
  int v138; 
  __int64 v139; 

  v9 = ObjectsSecurityDescriptor;
  v10 = SecurityInformation;
  v139 = v8;
  LOBYTE(v8) = 0;
  *(_DWORD *)v115.Value = PoolType;
  v11 = (unsigned int *)ModificationDescriptor;
  v12 = 0i64;
  p_SubjectContext = (_SECURITY_SUBJECT_CONTEXT *)Token;
  v120 = GenericMapping;
  v14 = *((_WORD *)ModificationDescriptor + 1);
  v118 = ObjectsSecurityDescriptor;
  v119 = (unsigned __int16 *)ModificationDescriptor;
  v126 = (_SECURITY_SUBJECT_CONTEXT *)Token;
  v102 = 0;
  v101 = 0;
  ServerAclAllocated[0] = 0;
  v103 = 0;
  v109 = 0;
  v104 = 0;
  v105 = 0;
  v106 = 0;
  v107 = 0;
  v108 = 0;
  LODWORD(ReturnStatus) = 0;
  P = 0i64;
  pSaclSecurityInformation = 0i64;
  v113 = 0i64;
  NewAcl = 0i64;
  pScopeAcl = 0i64;
  v129 = 0i64;
  pAttributeAcl = 0i64;
  v128 = 0i64;
  v112 = 0i64;
  v130 = 0i64;
  v117 = 0i64;
  Dacl = 0i64;
  Label = 0i64;
  v98 = 0;
  LOBYTE(v124) = 0;
  v123 = v8;
  HIDWORD(pIndex) = 0;
  v96 = 0x8000;
  ServerAcl = 0i64;
  memset(&SubjectContext, 0, sizeof(SubjectContext));
  if( (v14 & 0x10) != 0 )
  {
    if( v14 >= 0 )
    {
      v15 = (char *)*((_QWORD *)ModificationDescriptor + 3);
    }
    else
    {
      v67 = *((unsigned int *)ModificationDescriptor + 3);
      if( (_DWORD)v67 )
        v15 = (char *)ModificationDescriptor + v67;
      else
        v15 = 0i64;
    }
  }
  else
  {
    v15 = 0i64;
  }
  v16 = (unsigned int *)*ObjectsSecurityDescriptor;
  Src = v15;
  v17 = *((_WORD *)v16 + 1);
  if( (v17 & 0x10) != 0 )
  {
    if( v17 >= 0 )
    {
      v19 = (_ACL *)*((_QWORD *)v16 + 3);
    }
    else
    {
      v18 = v16[3];
      if( (_DWORD)v18 )
        v19 = (_ACL *)((char *)v16 + v18);
      else
        v19 = 0i64;
    }
  }
  else
  {
    v19 = 0i64;
  }
  if( !Token )
  {
    SeCaptureSubjectContext((INT64)&SubjectContext);
    v16 = (unsigned int *)*v9;
    p_SubjectContext = &SubjectContext;
    v126 = &SubjectContext;
  }
  if( *((__int16 *)v16 + 1) >= 0 )
  {
    valid = -1073741593;
    goto LABEL_76;
  }
  v20 = *((_WORD *)v11 + 1);
  v99 = (v20 & 0x80u) != 0;
  v100 = (v20 & 0x40) != 0;
  v21 = v10 & 0x80;
  v22 = (v10 & 0x100) != 0;
  if( (v10 & 0x10000) != 0 )
  {
    v85 = v10 | 0x1FF;
    v86 = v85 & 0xFFFFFF7F;
    if( v21 )
      v86 = v85;
    v10 = v86 & 0xFFFFFEFF;
    if( v22 )
      v10 = v86;
    if( !v19 && !v15 )
    {
      v10 &= 0xFFFFFE07;
      if( (v20 & 0x10) != 0 )
        v10 |= 8u;
      else
        v123 = (v20 & 0x800) != 0;
    }
  }
  if( (v10 & 1) == 0 )
  {
    if( *((__int16 *)v16 + 1) >= 0 )
    {
      v24 = (unsigned __int8 *)*((_QWORD *)v16 + 1);
    }
    else
    {
      v23 = v16[1];
      if( !(_DWORD)v23 )
        goto LABEL_247;
      v24 = (unsigned __int8 *)v16 + v23;
    }
    v125 = v24;
    v25 = v24 == 0i64;
LABEL_16:
    if( !v25 )
      goto LABEL_17;
LABEL_247:
    valid = -1073741734;
    goto LABEL_76;
  }
  v79 = v10 >> 2;
  LOBYTE(v79) = (v10 & 4) == 0;
  v124 = v79;
  if( v20 >= 0 )
  {
    v24 = (unsigned __int8 *)*((_QWORD *)v11 + 1);
  }
  else
  {
    v80 = v11[1];
    if( (_DWORD)v80 )
      v24 = (unsigned __int8 *)v11 + v80;
    else
      v24 = 0i64;
  }
  v125 = v24;
  v101 = 1;
  if( (AutoInheritFlags & 8) == 0 )
  {
    v25 = SepValidOwnerSubjectContext(p_SubjectContext, v24, (v20 & 0x80u) != 0) == 0;
    goto LABEL_16;
  }
LABEL_17:
  if( !RtlValidSid(v24) )
    goto LABEL_247;
  if( (v10 & 2) != 0 )
  {
    if( *((__int16 *)v11 + 1) >= 0 )
    {
      v28 = (_BYTE *)*((_QWORD *)v11 + 2);
    }
    else
    {
      v84 = v11[2];
      if( (_DWORD)v84 )
        v28 = (char *)v11 + v84;
      else
        v28 = 0i64;
    }
    v102 = 1;
  }
  else
  {
    v26 = *v9;
    if( *((__int16 *)*v9 + 1) >= 0 )
    {
      v28 = (_BYTE *)v26[2];
    }
    else
    {
      v27 = *((unsigned int *)v26 + 2);
      if( !(_DWORD)v27 )
      {
LABEL_191:
        valid = -1073741733;
        goto LABEL_76;
      }
      v28 = (char *)v26 + v27;
    }
  }
  if( !v28 || !RtlValidSid(v28) )
    goto LABEL_191;
  if( (v10 & 0x1F8) == 0 )
  {
    v12 = (unsigned __int16 *)v19;
    Src = v19;
    v29 = pAttributeAcl;
    goto LABEL_26;
  }
  Size[0] = v10 & 0x10;
  if( (v10 & 0x10) != 0 )
  {
    LODWORD(pIndex) = 0;
    do
    {
      AceByType = (char *)RtlFindAceByType((_ACL *)Src, 0x11ui64, &pIndex);
      v55 = AceByType;
      if( AceByType )
      {
        v76 = AceByType[1];
        v56 = AceByType + 8;
        v25 = (*((_DWORD *)v55 + 1) & 0xFFFFFFF8) == 0;
        Label = v56;
        v98 = v76;
        if( !v25 )
        {
LABEL_192:
          valid = -1073740730;
          goto LABEL_76;
        }
      }
      else
      {
        v56 = Label;
      }
      if( !SepValidLabelSubjectContext(v126, v56, v98) )
        goto LABEL_192;
      LODWORD(pIndex) = pIndex + 1;
    }
    while( v55 );
  }
  TokenTrustLevel = SepLocateTokenTrustLevel(v126);
  LODWORD(Label) = v10 & 0x80;
  if( (v10 & 0x80) == 0 )
  {
LABEL_86:
    v58 = v10 & 0x100;
    LODWORD(pIndex) = v58;
    if( (v10 & 0x100) != 0 )
    {
      valid = RtlpValidFilterAclSubjectContext((_ACL *)Src, TokenTrustLevel);
      if( valid < 0 )
        goto LABEL_76;
      if( (AutoInheritFlags & 2) == 0 )
      {
        valid = RtlpValidFilterAclSubjectContext(v19, TokenTrustLevel);
        if( valid < 0 )
          goto LABEL_76;
      }
      v58 = pIndex;
      v9 = v118;
    }
    v59 = v119;
    if( (v10 & 8) != 0 )
    {
      v78 = v119[1];
      if( (AutoInheritFlags & 2) == 0 )
      {
        v61 = (_ACL *)Src;
        v113 = Src;
        v96 = v78 & 0x2000 | 0x8010;
        v60 = (_ACL *)Src;
        if( (v78 & 0xA00) == 2560 )
          v96 = v78 & 0x2000 | 0x8810;
LABEL_90:
        if( (v10 & 0x20) != 0 )
        {
          v77 = v59[1];
          if( (AutoInheritFlags & 2) != 0 )
          {
            valid = RtlpComputeMergedAcl(
                      v19,
                      (*((_WORD *)*v9 + 1) & 0x800 | (*((unsigned __int16 *)*v9 + 1) >> 1) & 0x18u) >> 1,
                      v61,
                      (v77 & 0x800 | (v77 >> 1) & 0x18) >> 1,
                      v24,
                      v28,
                      v120,
                      SepAclTypeSacl,
                      &v128,
                      (UINT64 *)((char *)&pIndex + 4));
            if( valid < 0 )
            {
              v29 = v128;
              goto LABEL_63;
            }
            v9 = v118;
            v59 = v119;
            v61 = (_ACL *)Src;
            v60 = (_ACL *)v113;
            v62 = (2 * (WORD2(pIndex) & 0x1400 | (2 * (BYTE4(pIndex) & 8 | 4)))) | v96;
            v105 = 1;
            v58 = pIndex;
            v96 = v62;
            pAttributeAcl = v128;
          }
          else
          {
            pAttributeAcl = v61;
            v62 = v77 & 0x2000 | 0x10 | v96;
            v96 = v62;
            if( (v77 & 0xA00) == 2560 )
            {
              v62 |= 0x800u;
              v96 = v62;
            }
          }
        }
        else
        {
          v62 = v96;
          pAttributeAcl = v19;
        }
        if( (v10 & 0x40) != 0 )
        {
          v87 = v59[1];
          if( (AutoInheritFlags & 2) != 0 )
          {
            valid = RtlpComputeMergedAcl(
                      v19,
                      (*((_WORD *)*v9 + 1) & 0x800 | (*((unsigned __int16 *)*v9 + 1) >> 1) & 0x18u) >> 1,
                      v61,
                      (v87 & 0x800 | (v87 >> 1) & 0x18) >> 1,
                      v24,
                      v28,
                      v120,
                      SepAclTypeSacl,
                      &v129,
                      (UINT64 *)((char *)&pIndex + 4));
            if( valid < 0 )
            {
              v50 = v129;
              v29 = pAttributeAcl;
              goto LABEL_64;
            }
            v9 = v118;
            v59 = v119;
            v61 = (_ACL *)Src;
            v60 = (_ACL *)v113;
            v62 = (2 * (WORD2(pIndex) & 0x1400 | (2 * (BYTE4(pIndex) & 8 | 4)))) | v96;
            v106 = 1;
            v58 = pIndex;
            v96 = v62;
            pScopeAcl = v129;
          }
          else
          {
            pScopeAcl = v61;
            v62 |= v87 & 0x2000 | 0x10;
            v96 = v62;
            if( (v87 & 0xA00) == 2560 )
            {
              v62 |= 0x800u;
              v96 = v62;
            }
          }
        }
        else
        {
          pScopeAcl = v19;
        }
        if( (_DWORD)Label )
        {
          v83 = v59[1];
          if( (AutoInheritFlags & 2) == 0 )
          {
            v112 = v61;
            v62 |= v83 & 0x2000 | 0x10;
            v96 = v62;
            v25 = (v83 & 0xA00) == 2560;
            pTrustAcl = v61;
            if( v25 )
            {
              v62 |= 0x800u;
              v96 = v62;
            }
            goto LABEL_97;
          }
          valid = RtlpComputeMergedAcl(
                    v19,
                    (*((_WORD *)*v9 + 1) & 0x800 | (*((unsigned __int16 *)*v9 + 1) >> 1) & 0x18u) >> 1,
                    v61,
                    (v83 & 0x800 | (v83 >> 1) & 0x18) >> 1,
                    v24,
                    v28,
                    v120,
                    SepAclTypeSacl,
                    &v130,
                    (UINT64 *)((char *)&pIndex + 4));
          if( valid < 0 )
          {
            v51 = v130;
            v29 = pAttributeAcl;
            v50 = pScopeAcl;
            goto LABEL_65;
          }
          pTrustAcl = v130;
          v9 = v118;
          v59 = v119;
          v61 = (_ACL *)Src;
          v60 = (_ACL *)v113;
          v62 = (2 * (WORD2(pIndex) & 0x1400 | (2 * (BYTE4(pIndex) & 8 | 4)))) | v96;
          v107 = 1;
          v58 = pIndex;
          v96 = v62;
        }
        else
        {
          pTrustAcl = v19;
        }
        v112 = pTrustAcl;
LABEL_97:
        if( v58 )
        {
          v88 = v59[1];
          ppNewAcl = (_ACL **)v61;
          if( (AutoInheritFlags & 2) != 0 )
          {
            valid = RtlpComputeMergedAcl(
                      v19,
                      (*((_WORD *)*v9 + 1) & 0x800 | (*((unsigned __int16 *)*v9 + 1) >> 1) & 0x18u) >> 1,
                      v61,
                      (v88 & 0x800 | (v88 >> 1) & 0x18) >> 1,
                      v24,
                      v28,
                      v120,
                      SepAclTypeSacl,
                      &Dacl,
                      (UINT64 *)((char *)&pIndex + 4));
            if( valid < 0 )
            {
              v52 = Dacl;
              v51 = v112;
              v29 = pAttributeAcl;
              v50 = pScopeAcl;
LABEL_66:
              if( v113 && v104 )
                ExFreePoolWithTag(v113, 0);
              if( v29 && v105 )
                ExFreePoolWithTag(v29, 0);
              if( v50 && v106 )
                ExFreePoolWithTag(v50, 0);
              if( v51 && v107 )
                ExFreePoolWithTag(v51, 0);
              if( v52 && v108 )
                ExFreePoolWithTag(v52, 0);
              if( v12 && v109 )
                ExFreePoolWithTag(v12, 0);
              if( ServerAclAllocated[0] )
                ExFreePoolWithTag(ServerAcl, 0);
              goto LABEL_76;
            }
            ppNewAcl = (_ACL **)Dacl;
            v61 = (_ACL *)Src;
            v60 = (_ACL *)v113;
            v108 = 1;
            v117 = Dacl;
            v62 = (2 * (WORD2(pIndex) & 0x1400 | (2 * (BYTE4(pIndex) & 8 | 4)))) | v96;
            v96 = v62;
          }
          else
          {
            v117 = v61;
            v62 |= v88 & 0x2000 | 0x10;
            v96 = v62;
            if( (v88 & 0xA00) == 2560 )
            {
              v62 |= 0x800u;
              v96 = v62;
            }
          }
          pTrustAcl = (_ACL *)v112;
        }
        else
        {
          ppNewAcl = (_ACL **)v19;
          v117 = v19;
        }
        v11 = (unsigned int *)v119;
        if( Size[0] )
        {
          v65 = v119[1];
          v66 = v65 & 0x2000 | 0x10 | v62;
          v96 = v66;
          if( (v65 & 0xA00) == 2560 )
            v96 = v66 | 0x800;
        }
        else
        {
          v61 = v19;
        }
        v29 = pAttributeAcl;
        valid = RtlpCombineAcls(v60, v61, pAttributeAcl, pScopeAcl, pTrustAcl, ppNewAcl, &pSaclSecurityInformation);
        if( valid < 0 )
          goto LABEL_63;
        v12 = (unsigned __int16 *)pSaclSecurityInformation;
        Src = (VOID *)pSaclSecurityInformation;
        if( !v113 && pSaclSecurityInformation && !*(_WORD *)(pSaclSecurityInformation + 4) )
        {
          ExFreePoolWithTag((PVOID)pSaclSecurityInformation, 0);
          v12 = 0i64;
          Src = 0i64;
        }
        v9 = v118;
        v109 = 1;
LABEL_26:
        if( (v10 & 4) != 0 )
        {
          v30 = *((_WORD *)v11 + 1);
          if( (AutoInheritFlags & 1) != 0 )
          {
            if( (v30 & 4) != 0 )
            {
              if( v30 >= 0 )
              {
                v89 = (_ACL *)*((_QWORD *)v11 + 4);
              }
              else
              {
                v90 = v11[4];
                if( (_DWORD)v90 )
                  v89 = (_ACL *)((char *)v11 + v90);
                else
                  v89 = 0i64;
              }
            }
            else
            {
              v89 = 0i64;
            }
            v91 = *v9;
            v92 = *((_WORD *)*v9 + 1);
            if( (v92 & 4) != 0 )
            {
              if( v92 >= 0 )
              {
                v93 = (_BYTE *)v91[4];
              }
              else
              {
                v94 = *((unsigned int *)v91 + 4);
                if( (_DWORD)v94 )
                  v93 = (char *)v91 + v94;
                else
                  v93 = 0i64;
              }
            }
            else
            {
              v93 = 0i64;
            }
            valid = RtlpComputeMergedAcl(
                      v93,
                      *((_WORD *)*v9 + 1) & 0x140C,
                      v89,
                      *((_WORD *)v11 + 1) & 0x140C,
                      v24,
                      v28,
                      v120,
                      SepAclTypeDacl,
                      (_ACL **)&P,
                      (UINT64 *)((char *)&pIndex + 4));
            if( valid < 0 )
              goto LABEL_63;
            v31 = (_ACL *)P;
            v103 = 1;
            v96 |= WORD2(pIndex) & 0x1408 | 4;
          }
          else
          {
            if( (v30 & 4) != 0 )
            {
              if( v30 < 0 )
              {
                v68 = v11[4];
                if( (_DWORD)v68 )
                  v31 = (_ACL *)((char *)v11 + v68);
                else
                  v31 = 0i64;
              }
              else
              {
                v31 = (_ACL *)*((_QWORD *)v11 + 4);
              }
            }
            else
            {
              v31 = 0i64;
            }
            v32 = v30 & 0x1000 | 4 | v96;
            v96 = v32;
            if( (v30 & 0x500) == 1280 )
              v96 = v32 | 0x400;
          }
          if( v99 )
          {
            *(_QWORD *)Size = 0i64;
            NewAcl = 0i64;
            pSaclSecurityInformation = 0i64;
            v128 = 0i64;
            v129 = 0i64;
            v130 = 0i64;
            Dacl = 0i64;
            SepGetDefaultsSubjectContext(
              v126,
              (VOID **)Size,
              (VOID **)&NewAcl,
              (VOID **)&pSaclSecurityInformation,
              (VOID **)&v128,
              (VOID **)&v129,
              (VOID **)&v130,
              &Dacl);
            valid = RtlpCreateServerAcl(v31, v100, (VOID *)pSaclSecurityInformation, &ServerAcl, ServerAclAllocated);
            if( valid < 0 )
            {
LABEL_60:
              if( v103 )
                ExFreePoolWithTag(P, 0);
              goto LABEL_62;
            }
            v31 = ServerAcl;
          }
        }
        else
        {
          v69 = (unsigned int *)*v9;
          v70 = *((_WORD *)*v9 + 1);
          if( (v70 & 4) != 0 )
          {
            if( v70 >= 0 )
            {
              v31 = (_ACL *)*((_QWORD *)v69 + 4);
            }
            else
            {
              v71 = v69[4];
              if( (_DWORD)v71 )
                v31 = (_ACL *)((char *)v69 + v71);
              else
                v31 = 0i64;
            }
          }
          else
          {
            v31 = 0i64;
          }
        }
        v33 = 4 * v24[1] + 8;
        v34 = 4 * (unsigned __int8)v28[1] + 8;
        Size[0] = v34;
        if( v12 )
          v35 = (v12[1] + 3) & 0xFFFFFFFC;
        else
          v35 = 0;
        if( v31 )
          v36 = (v31->AclSize + 3) & 0xFFFFFFFC;
        else
          v36 = 0;
        PoolWithTag = ExAllocatePoolWithTag(*(unsigned int *)v115.Value, v33 + v34 + 20 + v36 + v35, 1683187027i64);
        v38 = PoolWithTag;
        if( PoolWithTag )
        {
          v39 = (_ACL *)((char *)PoolWithTag + 20);
          v25 = !v123;
          *(_OWORD *)PoolWithTag = 0i64;
          *((_DWORD *)PoolWithTag + 4) = 0;
          v40 = v96;
          *(_BYTE *)v38 = 1;
          if( !v25 )
            v40 = v96 | 0x800;
          v41 = (__int64)v119;
          v42 = *((_WORD *)v38 + 1) | v40;
          *((_WORD *)v38 + 1) = v42;
          if( (*(_WORD *)(v41 + 2) & 0x4000) != 0 )
          {
            *((_BYTE *)v38 + 1) = *(_BYTE *)(v41 + 1);
            *((_WORD *)v38 + 1) = v42 | 0x4000;
          }
          if( Src )
          {
            memmove((char *)v38 + 20, Src, *((unsigned __int16 *)Src + 1));
            RtlpApplyAclToObject((_ACL *)((char *)v38 + 20), v120, v43);
            *((_DWORD *)v38 + 3) = (_DWORD)v39 - (_DWORD)v38;
            v44 = *((unsigned __int16 *)Src + 1);
            if( v35 > (unsigned int)v44 )
              memset((char *)v39 + v44, 0i64, v35 - v44);
            v39 = (_ACL *)((char *)v39 + v35);
          }
          else
          {
            *((_DWORD *)v38 + 3) = 0;
          }
          v45 = v118;
          if( (v96 & 0x10) == 0 )
            *((_WORD *)v38 + 1) |= *((_WORD *)*v118 + 1) & 0x2830;
          if( v31 )
          {
            memmove(v39, v31, v31->AclSize);
            RtlpApplyAclToObject(v39, v120, v46);
            *((_DWORD *)v38 + 4) = (_DWORD)v39 - (_DWORD)v38;
            AclSize = v31->AclSize;
            if( v36 > (unsigned int)AclSize )
              memset((char *)v39 + AclSize, 0i64, v36 - AclSize);
            v39 = (_ACL *)((char *)v39 + v36);
          }
          else
          {
            *((_DWORD *)v38 + 4) = 0;
          }
          if( (v96 & 4) != 0 )
            goto LABEL_54;
          *((_WORD *)v38 + 1) |= *((_WORD *)*v45 + 1) & 0x140C;
          if( !(_BYTE)v124 )
            goto LABEL_54;
          *(_DWORD *)v115.Value = 0;
          *(_WORD *)&v115.Value[4] = 768;
          valid = RtlInitializeSid(Sid, &v115, 1u);
          if( valid >= 0 )
          {
            v138 = 4;
            LODWORD(pIndex) = 0;
            while( 1 )
            {
              v72 = *((_WORD *)v38 + 1);
              if( (v72 & 4) != 0 )
              {
                if( v72 >= 0 )
                {
                  v74 = (_ACL *)v38[4];
                }
                else
                {
                  v73 = *((unsigned int *)v38 + 4);
                  v74 = (_DWORD)v73 ? (_ACL *)((char *)v38 + v73) : 0i64;
                }
              }
              else
              {
                v74 = 0i64;
              }
              AceBySid = RtlFindAceBySid(v74, Sid, &pIndex);
              if( !AceBySid )
                break;
              v95 = AceBySid[1] & 0xF4 | 8;
              LODWORD(pIndex) = pIndex + 1;
              AceBySid[1] = v95;
            }
            v45 = v118;
LABEL_54:
            memmove(v39, v125, v33);
            *((_DWORD *)v38 + 1) = (_DWORD)v39 - (_DWORD)v38;
            v48 = (char *)v39 + v33;
            if( !v101 )
              *((_WORD *)v38 + 1) |= *((_WORD *)*v45 + 1) & 1;
            memmove(v48, v28, Size[0]);
            v25 = v102 == 0;
            *((_DWORD *)v38 + 2) = (_DWORD)v48 - (_DWORD)v38;
            if( v25 )
              *((_WORD *)v38 + 1) |= *((_WORD *)*v45 + 1) & 2;
            *v45 = v38;
            valid = 0;
          }
        }
        else
        {
          valid = -1073741801;
        }
        v12 = (unsigned __int16 *)Src;
        goto LABEL_60;
      }
      valid = RtlpComputeMergedAcl(
                v19,
                (*((_WORD *)*v9 + 1) & 0x2800 | (*((unsigned __int16 *)*v9 + 1) >> 1) & 0x18u) >> 1,
                (_ACL *)Src,
                (v78 & 0x2800 | (v78 >> 1) & 0x18) >> 1,
                v24,
                v28,
                v120,
                SepAclTypeSacl,
                &NewAcl,
                (UINT64 *)((char *)&pIndex + 4));
      if( valid < 0 )
      {
        v113 = NewAcl;
LABEL_62:
        v29 = pAttributeAcl;
LABEL_63:
        v50 = pScopeAcl;
LABEL_64:
        v51 = v112;
LABEL_65:
        v52 = v117;
        goto LABEL_66;
      }
      v60 = NewAcl;
      v9 = v118;
      v59 = v119;
      v104 = 1;
      v113 = NewAcl;
      v96 = 2 * (WORD2(pIndex) & 0x1400 | (2 * (BYTE4(pIndex) & 8 | 0x2004)));
      v58 = pIndex;
    }
    else
    {
      v60 = v19;
      v113 = v19;
    }
    v61 = (_ACL *)Src;
    goto LABEL_90;
  }
  if( TokenTrustLevel )
  {
    LODWORD(pIndex) = 0;
    while( 1 )
    {
      v81 = RtlFindAceByType((_ACL *)Src, 0x14ui64, &pIndex);
      v113 = v81;
      if( v81 )
      {
        if( (v81[1] & 0xFF000000) != 0 )
          goto LABEL_192;
        if( !(unsigned __int8)RtlpValidTrustSubjectContext(TokenTrustLevel, v81 + 2, v82, &ReturnStatus) )
          break;
        v81 = v113;
      }
      LODWORD(pIndex) = pIndex + 1;
      if( !v81 )
        goto LABEL_86;
    }
  }
  valid = -1073741790;
LABEL_76:
  if( v126 == &SubjectContext )
    SeReleaseSubjectContext(&SubjectContext);
  return valid;
}

Referenced by:

CmpSetSecurityDescriptorInfo
SeSetSecurityDescriptorInfo
SeSetSecurityDescriptorInfoEx