SeAccessCheckWithHintWithAdminlessChecks
BOOL __fastcall SeAccessCheckWithHintWithAdminlessChecks(
UINT64 *SecurityDescriptor,
CHAR a2,
INT64 a3,
CHAR a4,
UINT64 a5,
INT64 a6,
PRIVILEGE_SET **a7,
INT64 *a8,
CHAR a9,
UINT64 *a10,
INT64 *a11,
CHAR a12){
INT64 *v12;
UINT64 *Permissive;
unsigned int v14;
INT64 *v16;
int v18;
__int16 v19;
unsigned int v20;
char *v21;
char *v22;
unsigned int v23;
int v24;
__int64 v25;
int *v26;
char v27;
char v28;
CHAR v29;
int *v30;
char v31;
unsigned __int8 *v32;
unsigned int *v33;
int v34;
__int64 v35;
unsigned int v36;
unsigned __int64 v37;
__int64 v38;
int v39;
unsigned __int64 v40;
int v41;
__int64 v42;
__int64 v43;
char v44;
__int16 v45;
char *v46;
_WORD *SeOwnerRightsSid;
unsigned int v48;
int v49;
unsigned int v50;
unsigned int v51;
SECURITY_SUBJECT_CONTEXT *v52;
void *ClientToken;
void *PrimaryToken;
RTL_DYNAMIC_HASH_TABLE_ENTRY *v55;
char v56;
int *v57;
unsigned int *v58;
char v59;
char v60;
PVOID v61;
__int64 v62;
__int64 v63;
__int64 v64;
unsigned __int8 *v65;
unsigned int v66;
int v67;
unsigned int v68;
__int64 v69;
unsigned __int8 *v70;
unsigned __int64 v71;
unsigned int v72;
UINT64 v73;
int v74;
void *v75;
void *v76;
bool v77;
VOID *v78;
UINT64 v79;
__int16 v80;
__int64 v81;
ACL *v82;
void *v83;
NTSTATUS Cap;
RTL_DYNAMIC_HASH_TABLE_ENTRY *v85;
__int64 v86;
unsigned int v87;
unsigned int v88;
unsigned int v89;
RTL_DYNAMIC_HASH_TABLE_ENTRY *v90;
PVOID v91;
int v92;
int v93;
_QWORD *v94;
__int64 v95;
__int64 v96;
__int64 v97;
__int64 v98;
int v99;
int v100;
int v101;
_QWORD *v102;
__int64 v103;
__int64 v104;
__int64 v105;
__int64 v106;
NTSTATUS v107;
int v108;
unsigned int v109;
unsigned int v110;
volatile INT64 *Blink;
volatile INT64 *v112;
int v113;
int v114;
int v115;
volatile INT64 *v116;
unsigned __int8 v118;
CHAR v119;
char v120;
UINT8 pbDominate;
UINT8 v122;
char v123;
unsigned int v124;
unsigned int v125;
char v126;
int v127;
INT64 *v128;
RTL_DYNAMIC_HASH_TABLE_ENTRY *v129;
unsigned int *v130;
int v131;
PVOID P;
int v133;
int v134;
RTL_DYNAMIC_HASH_TABLE_ENTRY *v135;
unsigned int v136;
int v137;
PSECURITY_SUBJECT_CONTEXT SubjectContext;
int v139;
UINT8 v140[8];
ACL *Sacl;
_WORD *v142;
__int128 v143;
int *v144;
int v145;
__int64 v146;
LUID **v147;
__int128 SecurityDescriptora[2];
__int64 v149;
_OWORD v150[2];
v12 = a11;
Permissive = SecurityDescriptor;
v14 = a5;
*(_QWORD *)v140 = SecurityDescriptor;
*(_QWORD *)&v150[1] = 0i64;
LODWORD(v16) = (unsigned __int8)a4;
DWORD2(v150[1]) = 0;
v149 = 0i64;
v120 = 0;
v18 = -1;
v145 = -1;
SubjectContext = (PSECURITY_SUBJECT_CONTEXT)a3;
v119 = a4;
v124 = a6;
v128 = a11;
*(_DWORD *)a10 = 0;
v130 = (unsigned int *)a10;
v147 = (LUID **)a7;
v144 = (int *)a8;
v118 = 0;
Sacl = 0i64;
v135 = 0i64;
v125 = 0;
P = 0i64;
v133 = 0;
*(_DWORD *)a11 = -1073741790;
v136 = 0;
v139 = -1073741790;
v137 = a2 & 8;
v143 = 0i64;
v150[0] = 0i64;
memset(SecurityDescriptora, 0, sizeof(SecurityDescriptora));
if( a7 )
*a7 = 0i64;
if( !a9 )
{
if( (a5 & 0x2000000) != 0 )
LODWORD(v16) = a6 | a5 & 0xFDFFFFFF | *((_DWORD *)a8 + 3);
else
LODWORD(v16) = a6 | a5;
*(_DWORD *)a10 = (_DWORD)v16;
LOBYTE(v16) = 1;
*(_DWORD *)a11 = 0;
return(int)v16;
}
if( !SecurityDescriptor )
goto LABEL_308;
if( *(_QWORD *)a3 && *(int *)(a3 + 8) < 2 )
{
*(_DWORD *)a11 = -1073741659;
LOBYTE(v16) = 0;
return(int)v16;
}
if( (_DWORD)a5 )
{
if( !a4 )
SeLockSubjectContext((_SECURITY_SUBJECT_CONTEXT *)a3);
v19 = *((_WORD *)Permissive + 1);
v20 = 0;
pbDominate = 0;
v122 = 0;
while( (v19 & 0x10) != 0 )
{
if( v19 < 0 )
{
v63 = *((unsigned int *)Permissive + 3);
if( !(_DWORD)v63 )
break;
v21 = (char *)Permissive + v63;
}
else
{
v21 = (char *)Permissive[3];
}
if( !v21 )
break;
v22 = v21 + 8;
v23 = 0;
if( !*((_WORD *)v21 + 2) )
break;
while( v23 < v20 || *v22 != 20 )
{
++v23;
v22 += *((unsigned __int16 *)v22 + 1);
if( v23 >= *((unsigned __int16 *)v21 + 2) )
goto LABEL_18;
}
v20 = v23;
if( (v22[1] & 8) == 0 )
{
if( v22 )
{
v74 = *((_DWORD *)v22 + 1);
v75 = v22 + 8;
if( v22 == (char *)-8i64 )
{
v12 = v128;
}
else
{
if( !*(_QWORD *)a3 )
goto LABEL_178;
v76 = *(void **)(*(_QWORD *)a3 + 1104i64);
LODWORD(v16) = RtlSidDominatesForTrust(*(PVOID *)(*(_QWORD *)(a3 + 16) + 1104i64), v76, &v122);
if( (int)v16 >= 0 )
{
if( !v122 )
LABEL_178:
v76 = *(void **)(*(_QWORD *)(a3 + 16) + 1104i64);
LODWORD(v16) = RtlSidDominatesForTrust(v76, v75, &pbDominate);
if( (int)v16 >= 0 )
{
v18 = v74 | 0x1000000;
if( pbDominate )
v18 = -1;
}
}
v12 = v128;
*(_DWORD *)v128 = (_DWORD)v16;
if( (int)v16 < 0 )
{
LABEL_183:
if( v119 )
goto LABEL_156;
goto LABEL_155;
}
}
}
LABEL_20:
v24 = a5 & 0xFDFFFFFF;
LODWORD(v16) = v18 & a5 & 0xFDFFFFFF;
if( (_DWORD)v16 != (a5 & 0xFDFFFFFF) )
{
v77 = v137 == 0;
*(_DWORD *)v12 = -1073741790;
if( v77 )
{
v78 = *(VOID **)a3;
if( !*(_QWORD *)a3 )
v78 = *(VOID **)(a3 + 16);
LODWORD(v79) = SepLocateTokenTrustLevel((SECURITY_SUBJECT_CONTEXT *)a3);
SeLogAccessFailure(v78, 0i64, 0i64, v79, (UINT8)Permissive);
}
if( v119 )
goto LABEL_156;
goto LABEL_155;
}
*(_DWORD *)v12 = 0;
v25 = *(_QWORD *)a3;
if( !*(_QWORD *)a3 )
v25 = *(_QWORD *)(a3 + 16);
if( (a2 & 4) == 0 )
{
LODWORD(v16) = SepFilterCheck((__int64)Permissive, (__int64 *)&P, v25, 0, (char *)&v145);
v26 = (int *)v128;
*(_DWORD *)v128 = (_DWORD)v16;
if( (int)v16 < 0 )
goto LABEL_183;
LODWORD(v16) = v145 & v24;
if( (v145 & v24) == v24 )
{
*v26 = 0;
goto LABEL_27;
}
v77 = v137 == 0;
*v26 = -1073741790;
if( v77 )
SeLogAccessFailure((VOID *)v25, 0i64, 0i64, 0i64, (UINT8)Permissive);
if( v119 )
goto LABEL_156;
LABEL_155:
SeUnlockSubjectContext((SECURITY_SUBJECT_CONTEXT *)a3);
goto LABEL_156;
}
v26 = (int *)v128;
LABEL_27:
if( (a2 & 2) == 0 )
{
v27 = 0;
goto LABEL_29;
}
v27 = 1;
if( (*(_DWORD *)(v25 + 200) & 0x2000) != 0 )
v28 = 1;
else
LABEL_29:
v28 = 0;
v126 = v28;
v123 = 0;
if( !SepAllowAccessUponLogoff && (*(_DWORD *)(v25 + 200) & 0x20) == 0 )
{
v16 = *(INT64 **)(v25 + 216);
if( v16 )
{
LODWORD(v16) = *((_DWORD *)v16 + 8);
if( ((unsigned __int8)v16 & 0x20) != 0 )
{
v77 = v119 == 0;
*v130 = 0;
*v26 = -1073741790;
if( !v77 )
goto LABEL_156;
goto LABEL_155;
}
}
}
v29 = a12;
if( !v28 )
{
LODWORD(v16) = SepMandatoryIntegrityCheck(v144, (__int64)Permissive, v27, v25, 0, a12, (__int64)&v143);
v30 = (int *)v128;
*(_DWORD *)v128 = (_DWORD)v16;
if( (int)v16 < 0 )
goto LABEL_183;
if( DWORD2(v143) && (LODWORD(v16) = v24 & v143, (v24 & (unsigned int)v143) != v24) )
{
*v30 = -1073741790;
if( (*(_DWORD *)(v25 + 200) & 0x4000) == 0 || HIDWORD(v143) > 0x2000 )
{
if( v119 )
goto LABEL_156;
goto LABEL_155;
}
}
else
{
*v30 = 0;
if( (a5 & 0x2000000) == 0 || (*(_DWORD *)(v25 + 200) & 0x4000) == 0 || HIDWORD(v143) > 0x2000 )
{
LABEL_36:
v29 = a12;
goto LABEL_37;
}
}
v123 = 1;
goto LABEL_36;
}
LABEL_37:
if( !SepRmEnforceCap )
{
LABEL_38:
v31 = 0;
goto LABEL_39;
}
v80 = *((_WORD *)Permissive + 1);
if( (v80 & 0x10) != 0 && KeGetCurrentIrql() < 2u )
{
if( v80 >= 0 )
{
v82 = (ACL *)Permissive[3];
}
else
{
v81 = *((unsigned int *)Permissive + 3);
if( !(_DWORD)v81 )
{
Sacl = 0i64;
goto LABEL_215;
}
v82 = (ACL *)((char *)Permissive + v81);
}
Sacl = v82;
if( v82 )
{
LODWORD(v83) = SepGetScopedPolicySid(v82);
if( v83 )
{
Cap = SepRmReferenceFindCap(v83, &v135);
v85 = v135;
v29 = a12;
v31 = 1;
if( Cap < 0 )
v85 = (RTL_DYNAMIC_HASH_TABLE_ENTRY *)SepRmDefaultCap;
v135 = v85;
v120 = 1;
LABEL_39:
if( (a2 & 1) != 0 )
{
v122 = 1;
if( (a5 & 0x2060000) == 0 && !v31 )
{
v44 = 0;
goto LABEL_70;
}
}
else
{
v122 = 0;
}
if( *((__int16 *)Permissive + 1) < 0 )
{
v62 = *((unsigned int *)Permissive + 1);
if( (_DWORD)v62 )
v32 = (unsigned __int8 *)Permissive + v62;
else
v32 = 0i64;
}
else
{
v32 = (unsigned __int8 *)Permissive[1];
}
v33 = (unsigned int *)(v25 + 232);
if( v29 && v32 && RtlEqualSid(SeAliasAdminsSid, v32) )
{
v44 = 0;
goto LABEL_56;
}
if( v25 == -232 || !v32 )
goto LABEL_68;
v34 = v32[1];
v35 = *(unsigned __int16 *)v32;
v146 = v35;
v36 = 4 * v34 + 8;
v131 = v36;
v37 = (unsigned __int64)v32[4 * ((unsigned __int64)(unsigned int)v35 >> 8) + 4] >> 4;
v38 = v32[4 * ((unsigned __int64)(unsigned int)v35 >> 8) + 4] & 0xF;
LOBYTE(v39) = 0;
pbDominate = 0;
v40 = *(_QWORD *)&v33[2 * v38 + 4] & *(_QWORD *)&v33[2 * v37 + 36];
if( !v40 )
goto LABEL_66;
LABEL_47:
LOBYTE(v41) = v40;
v127 = (unsigned __int8)v40;
if( !(_BYTE)v40 )
goto LABEL_135;
v42 = *(_QWORD *)(v25 + 240);
v39 = (unsigned __int8)v39;
v142 = (_WORD *)v42;
v134 = (unsigned __int8)v39;
while( 1 )
{
LODWORD(v129) = *((unsigned __int8 *)SidHashByteToIndexLookupTable + (unsigned __int8)v41);
v43 = v42 + 16i64 * (unsigned int)(v39 + (_DWORD)v129);
if( **(_WORD **)v43 == (_WORD)v35 )
{
if( !memcmp(v32, *(PVOID *)v43, v36) )
{
LABEL_51:
if( v43 == *(_QWORD *)(v25 + 240) && (*(_DWORD *)(v43 + 8) & 0x10) == 0
|| (*(_DWORD *)(v43 + 8) & 4) != 0 )
{
if( *(_DWORD *)(v25 + 128) )
v44 = SepSidInTokenSidHash((SID_AND_ATTRIBUTES_HASH *)(v25 + 504), 0i64, v32, 0, 1u, 0);
else
v44 = 1;
}
else
{
v44 = 0;
}
Permissive = *(UINT64 **)v140;
LABEL_56:
if( !v44 || (a5 & 0x2060000) == 0 )
goto LABEL_69;
if( v122 )
goto LABEL_62;
v45 = *((_WORD *)Permissive + 1);
if( (v45 & 4) != 0 )
{
if( v45 >= 0 )
{
v46 = (char *)Permissive[4];
}
else
{
v64 = *((unsigned int *)Permissive + 4);
v46 = (_DWORD)v64 ? (char *)Permissive + v64 : 0i64;
}
}
else
{
v46 = 0i64;
}
SeOwnerRightsSid = SeExports->SeOwnerRightsSid;
v142 = SeOwnerRightsSid;
if( !v46
|| (v65 = (unsigned __int8 *)(v46 + 8),
LODWORD(v129) = *((unsigned __int16 *)v46 + 2),
v66 = 0,
!(_DWORD)v129) )
{
LABEL_62:
v31 = v120;
v48 = 393216;
if( (a5 & 0x2000000) == 0 )
v48 = a5 & 0x60000;
v14 = a5 & 0xFFF9FFFF;
v49 = v124 | v48;
v124 = v49;
v50 = v49;
if( !v120 )
{
v44 = 0;
v124 = v49;
}
goto LABEL_71;
}
v67 = 104928;
while( 2 )
{
if( (v65[1] & 8) != 0 )
goto LABEL_117;
v68 = *v65;
if( (unsigned __int8)v68 <= 0x10u && _bittest(&v67, v68) )
{
v69 = 16i64 * (*((_DWORD *)v65 + 2) & 1) + ((8i64 * (*((_DWORD *)v65 + 2) & 2)) | 0xC);
}
else
{
if( (_BYTE)v68 != 4 )
{
if( (unsigned __int8)v68 < 0xBu || (unsigned __int8)(v68 - 13) <= 1u )
{
v69 = 8i64;
break;
}
LABEL_117:
++v66;
v65 += *((unsigned __int16 *)v65 + 1);
if( v66 >= (unsigned int)v129 )
goto LABEL_62;
continue;
}
v69 = 12i64;
}
break;
}
v70 = &v65[v69];
if( v70 )
{
v71 = *(unsigned __int16 *)v70;
if( (_WORD)v71 == *SeOwnerRightsSid )
{
if( !memcmp(v70, SeOwnerRightsSid, 4 * (v71 >> 8) + 8) )
goto LABEL_69;
SeOwnerRightsSid = v142;
v67 = 104928;
}
}
goto LABEL_117;
}
LOWORD(v35) = v146;
v36 = v131;
v39 = v134;
}
v41 = (unsigned __int8)v127 ^ (1 << (char)v129);
v42 = (__int64)v142;
v127 = v41;
if( !(_BYTE)v41 )
{
LOBYTE(v39) = pbDominate;
LABEL_135:
LOBYTE(v39) = v39 + 8;
v40 >>= 8;
pbDominate = v39;
if( !v40 )
{
LABEL_66:
v51 = *v33;
if( *v33 > 0x40 )
{
v86 = *(_QWORD *)(v25 + 240);
v87 = 64;
v127 = 64;
v142 = (_WORD *)v86;
do
{
v43 = v86 + 16i64 * v87;
if( **(_WORD **)v43 == (_WORD)v35 )
{
if( !memcmp(v32, *(PVOID *)v43, v36) )
goto LABEL_51;
LOWORD(v35) = v146;
v36 = v131;
v87 = v127;
v86 = (__int64)v142;
}
v127 = ++v87;
}
while( v87 < v51 );
}
Permissive = *(UINT64 **)v140;
LABEL_68:
v44 = 0;
LABEL_69:
v31 = v120;
LABEL_70:
v48 = v125;
v50 = v124;
LABEL_71:
if( !v14 && !v31 && ((*(_DWORD *)(v25 + 200) & 0x2000) != 0 || !v48) )
{
if( !v119 )
SeUnlockSubjectContext(SubjectContext);
v16 = v128;
*v130 = v50;
*(_DWORD *)v16 = 0;
LOBYTE(v16) = 1;
return(int)v16;
}
v52 = SubjectContext;
ClientToken = SubjectContext->ClientToken;
PrimaryToken = SubjectContext->PrimaryToken;
LODWORD(v150[0]) = v48;
memset((char *)v150 + 4, 0, 24);
LODWORD(v16) = SepAccessCheck(
(__int64)Permissive,
0i64,
(__int64)PrimaryToken,
(__int64)ClientToken,
v14,
0i64,
0,
v144,
v50,
a9,
v130,
v147,
(int *)v128,
0,
v44,
(int *)v150,
(__int64 *)&P,
(char *)&v118,
0i64,
a12);
v55 = v135;
v56 = (char)v16;
v129 = v135;
if( !SepRmEnforceCap || (LODWORD(v16) = *(_DWORD *)v128, v131 = (int)v16, (int)v16 < 0) || !v120 )
{
v57 = (int *)v128;
v58 = v130;
goto LABEL_74;
}
v88 = 0;
pbDominate = 0;
LOBYTE(v127) = 0;
v134 = 0;
v89 = *v130;
v125 = *v130;
if( !HIDWORD(v135[2].Linkage.Blink) )
goto LABEL_288;
while( 2 )
{
v90 = (RTL_DYNAMIC_HASH_TABLE_ENTRY *)*(&v55[2].Signature + v88);
v135 = v90;
if( v90[1].Linkage.Flink )
{
v91 = P;
if( !P )
{
v92 = AuthzBasepInitializeResourceClaimsFromSacl((__int64)Sacl, (__int64)&P);
v91 = P;
v93 = (unsigned __int8)v127;
if( v92 < 0 )
v93 = 1;
v127 = v93;
}
v94 = *(_QWORD **)(v25 + 1096);
if( v94 )
{
v95 = v94[75];
v96 = v94[73];
v97 = v94[74];
v98 = v94[72];
}
else
{
v95 = 0i64;
v96 = 0i64;
v97 = 0i64;
v98 = 0i64;
}
v99 = AuthzBasepEvaluateAceCondition(
v25,
*(_QWORD *)(v25 + 776),
(__int64)v91,
v98,
v97,
v96,
v95,
(char *)v90[1].Linkage.Flink,
v90->Signature,
1,
0,
&v133);
v100 = v133;
v101 = v99;
if( v133 != 1 )
{
if( v99 < 0 )
{
if( !v119 )
SeUnlockSubjectContext(SubjectContext);
Blink = (volatile INT64 *)v129[1].Linkage.Blink;
if( Blink )
LABEL_277:
SepRmDereferenceCapTable(Blink);
LABEL_278:
*v130 = 0;
*(_DWORD *)v128 = v101;
LABEL_280:
SepFreeResourceInfo(P);
goto LABEL_156;
}
if( (*(_DWORD *)(v25 + 200) & 0x10) != 0 )
{
v102 = *(_QWORD **)(v25 + 1096);
if( v102 )
{
v103 = v102[75];
v104 = v102[73];
v105 = v102[74];
v106 = v102[72];
}
else
{
v103 = 0i64;
v104 = 0i64;
v105 = 0i64;
v106 = 0i64;
}
v101 = AuthzBasepEvaluateAceCondition(
v25,
*(_QWORD *)(v25 + 776),
(__int64)P,
v106,
v105,
v104,
v103,
(char *)v135[1].Linkage.Flink,
v135->Signature,
1,
1,
&v133);
if( v101 < 0 )
{
if( !v119 )
SeUnlockSubjectContext(SubjectContext);
Blink = (volatile INT64 *)v129[1].Linkage.Blink;
if( Blink )
goto LABEL_277;
goto LABEL_278;
}
v100 = v133;
}
if( !(_BYTE)v127 && v100 != 1 )
{
LODWORD(v16) = v131;
v52 = SubjectContext;
LABEL_272:
v55 = v129;
v88 = v134 + 1;
v134 = v88;
if( v88 >= HIDWORD(v129[2].Linkage.Blink) )
goto LABEL_287;
continue;
}
}
v90 = v135;
}
break;
}
v107 = SepBuildCapeSecurityDescriptor(SecurityDescriptora, v90[1].Linkage.Blink, Sacl);
if( v107 < 0 )
{
if( !v119 )
SeUnlockSubjectContext(SubjectContext);
v112 = (volatile INT64 *)v129[1].Linkage.Blink;
if( v112 )
SepRmDereferenceCapTable(v112);
*v130 = 0;
*(_DWORD *)v128 = v107;
goto LABEL_280;
}
v108 = v14;
if( ((__int64)v90[2].Linkage.Flink & 1) != 0 )
{
v109 = 0;
if( (v14 & 0x2000000) == 0 )
v108 = v124 | v14;
}
else
{
v109 = v124;
}
v52 = SubjectContext;
v56 = SepAccessCheck(
(__int64)SecurityDescriptora,
0i64,
(__int64)SubjectContext->PrimaryToken,
(__int64)SubjectContext->ClientToken,
v108,
0i64,
0,
v144,
v109,
a9,
&v136,
0i64,
&v139,
0,
v44,
(int *)v150,
(__int64 *)&P,
(char *)&v118,
0i64,
a12);
if( pbDominate )
v110 = v136 & v125;
else
v110 = v136;
v125 = v110;
if( !v110 )
{
LODWORD(v16) = -1073741790;
LABEL_286:
v55 = v129;
LABEL_287:
v89 = v125;
LABEL_288:
v57 = (int *)v128;
v58 = v130;
*(_DWORD *)v128 = (_DWORD)v16;
LODWORD(v16) = v118;
*v58 &= v89;
if( *v57 < 0 )
LODWORD(v16) = 0;
v118 = (unsigned __int8)v16;
LABEL_74:
if( !v126 && (v14 & 0x2000000) != 0 )
{
if( (!v123 || !*(_WORD *)((char *)&v150[1] + 5))
&& DWORD2(v143)
&& (!BYTE4(v143) || !BYTE5(v143) || !BYTE6(v143)) )
{
LODWORD(v16) = *v58;
v72 = *v58 & v143;
if( v72 != *v58 )
{
*v58 = v72;
if( v72 )
{
*v57 = 0;
v118 = 1;
}
else
{
*v57 = -1073741790;
LABEL_166:
v118 = 0;
}
}
}
}
else if( v123 && !*(_WORD *)((char *)&v150[1] + 5) )
{
*v57 = -1073741790;
*v58 = 0;
goto LABEL_166;
}
v59 = 0;
if( (v14 & 0x2000000) != 0 )
{
if( v18 != -1 )
{
v113 = v18 & *v58;
if( v113 != *v58 )
{
*v58 = v113;
v59 = 1;
if( v113 )
{
*v57 = 0;
v118 = 1;
}
else
{
*v57 = -1073741790;
v118 = 0;
}
}
}
v60 = 0;
LODWORD(v16) = -1;
if( v145 != -1 )
{
LODWORD(v16) = *v58;
v114 = v145 & *v58;
if( v114 != (_DWORD)v16 )
{
LODWORD(v16) = (_DWORD)v130;
v60 = 1;
*v130 = v114;
if( v114 )
{
*v57 = 0;
v118 = 1;
}
else
{
*v57 = -1073741790;
v118 = 0;
}
}
}
}
else
{
v60 = 0;
}
if( v25 )
{
if( (v59
|| v60
|| !HIDWORD(v150[0])
&& (*(_DWORD *)(v25 + 200) & 0x4000) != 0
&& (*v57 < 0 || BYTE7(v150[1])))
&& !v137 )
{
LODWORD(v73) = SepLocateTokenTrustLevel(v52);
SeLogAccessFailure((VOID *)v25, 0i64, 0i64, v73, (UINT8)Permissive);
v55 = v129;
v57 = (int *)v128;
}
if( *v57 < 0 && !HIDWORD(v150[0]) && (*(_DWORD *)(v25 + 200) & 0x4000) != 0 )
{
if( BYTE8(v150[1]) )
{
v115 = v14 & ~(DWORD1(v150[0]) | DWORD2(v150[0]) | 0x2000000);
LODWORD(v16) = v115 & v150[1];
if( (v115 & v150[1]) == v115 )
{
LODWORD(v16) = SepLogLpacAccessFailure();
v55 = v129;
}
}
}
}
if( v120 )
{
v116 = (volatile INT64 *)v55[1].Linkage.Blink;
if( v116 )
SepRmDereferenceCapTable(v116);
}
if( !v119 )
SeUnlockSubjectContext(v52);
v61 = P;
if( P )
{
AuthzBasepFreeSecurityAttributesList(P);
ExFreePoolWithTag(v61, 0);
}
if( v56 && v118 )
{
LOBYTE(v16) = 1;
return(int)v16;
}
LABEL_156:
LOBYTE(v16) = 0;
return(int)v16;
}
LODWORD(v16) = v139;
v131 = v139;
pbDominate = 1;
if( v139 < 0 )
goto LABEL_286;
goto LABEL_272;
}
goto LABEL_47;
}
}
}
}
}
LABEL_215:
v29 = a12;
goto LABEL_38;
}
LABEL_19:
++v20;
if( !v22 )
goto LABEL_20;
}
LABEL_18:
v22 = 0i64;
goto LABEL_19;
}
if( !(_DWORD)a6 )
{
LABEL_308:
*(_DWORD *)a11 = -1073741790;
goto LABEL_156;
}
*(_DWORD *)a10 = a6;
*(_DWORD *)a11 = 0;
if( a7 )
*a7 = 0i64;
LOBYTE(v16) = 1;
return(int)v16;
}Referenced by:
SeAccessCheck
SeAccessCheckWithHint