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