SepFilterCheck
NTSTATUS __stdcall SepFilterCheck(INT64 a1, INT64 *a2, VOID *a3, CHAR a4, INT64 Condition){
INT64 v5;
_AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION *v6;
int v7;
char v8;
VOID *v9;
unsigned int v10;
int v11;
__int16 v12;
_ACL *v13;
_AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION **p_ResourceInfo;
_ACL *v15;
unsigned int v16;
__int64 v18;
unsigned __int16 v19;
int v20;
int v21;
_ETHREAD *CurrentThread;
_QWORD *v23;
VOID *v24;
VOID *v25;
VOID *v26;
int v27;
int v28;
_QWORD *v29;
VOID *pRestrictedDeviceInfo;
VOID *pDeviceInfo;
VOID *pRestrictedUserInfo;
_AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION *v33;
char v34;
UINT64 ConditionSize;
int v36;
int v37;
unsigned int v38;
PVOID ResourceInfo;
INT64 Result;
int v41;
VOID *Token;
CHAR v43;
v43 = a4;
Token = a3;
v5 = Condition;
v6 = 0i64;
v7 = -1;
ResourceInfo = 0i64;
LODWORD(Result) = 0;
v8 = 0;
v9 = a3;
v10 = 0;
*(_DWORD *)Condition = -1;
v11 = 0;
v12 = *(_WORD *)(a1 + 2);
if( (v12 & 0x10) != 0 )
{
if( v12 < 0 )
{
v18 = *(unsigned int *)(a1 + 12);
if( (_DWORD)v18 )
v13 = (_ACL *)(a1 + v18);
else
v13 = 0i64;
}
else
{
v13 = *(_ACL **)(a1 + 24);
}
}
else
{
v13 = 0i64;
}
LOBYTE(v41) = 0;
p_ResourceInfo = (_AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION **)&ResourceInfo;
if( a2 )
p_ResourceInfo = (_AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION **)a2;
while( 1 )
{
if( !v13 || (v15 = v13 + 1, v16 = 0, !v13->AceCount) )
{
LABEL_11:
v15 = 0i64;
goto LABEL_12;
}
while( v16 < v10 || v15->AclRevision != 21 )
{
++v16;
v15 = (_ACL *)((char *)v15 + v15->AclSize);
if( v16 >= v13->AceCount )
goto LABEL_11;
}
v10 = v16;
v38 = v16;
if( (v15->Sbz1 & 8) != 0 )
goto LABEL_12;
v19 = 4 * (v15[1].Sbz1 + 2);
v20 = v19;
v21 = v15->AclSize - v19;
LOWORD(Condition) = v19;
v36 = v19;
if( v21 - 8 <= 0 )
break;
v37 = *(_DWORD *)&v15->AceCount;
if( (v37 & 0xFF000000) != 0 )
break;
if( a4 && !v8 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquireResourceSharedLite(*((_QWORD *)v9 + 6), 1);
v9 = Token;
v6 = 0i64;
v19 = Condition;
v8 = 1;
v10 = v38;
}
if( !*p_ResourceInfo )
{
v11 = AuthzBasepInitializeResourceClaimsFromSacl(v13, p_ResourceInfo);
if( v11 < 0 )
goto LABEL_13;
v9 = Token;
v6 = 0i64;
v19 = Condition;
v20 = v36;
}
v23 = (_QWORD *)*((_QWORD *)v9 + 137);
LODWORD(Result) = -1;
if( v23 )
{
v24 = (VOID *)v23[75];
v25 = (VOID *)v23[73];
v26 = (VOID *)v23[74];
v6 = (_AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION *)v23[72];
}
else
{
v24 = 0i64;
v25 = 0i64;
v26 = 0i64;
}
v27 = v15->AclSize - v20;
Condition = (INT64)&v15[1] + v19;
LODWORD(ConditionSize) = v27 - 8;
v11 = AuthzBasepEvaluateAceCondition(
v9,
*((_AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION **)v9 + 97),
*p_ResourceInfo,
v6,
v26,
v25,
v24,
(UINT8 *)Condition,
ConditionSize,
1u,
0,
&Result);
if( v11 < 0 )
goto LABEL_13;
if( (_DWORD)Result != 1 )
{
v28 = (unsigned __int8)v41;
if( (v15->Sbz1 & 0x40) != 0 )
v28 = 1;
v41 = v28;
v7 &= v37 | 0x1000000;
}
v9 = Token;
if( (*((_DWORD *)Token + 50) & 0x10) != 0 )
{
v29 = (_QWORD *)*((_QWORD *)Token + 137);
LODWORD(Result) = -1;
if( v29 )
{
pRestrictedDeviceInfo = (VOID *)v29[75];
pDeviceInfo = (VOID *)v29[73];
pRestrictedUserInfo = (VOID *)v29[74];
v33 = (_AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION *)v29[72];
}
else
{
pRestrictedDeviceInfo = 0i64;
pDeviceInfo = 0i64;
pRestrictedUserInfo = 0i64;
v33 = 0i64;
}
LODWORD(ConditionSize) = v15->AclSize - v36 - 8;
v11 = AuthzBasepEvaluateAceCondition(
Token,
*((_AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION **)Token + 97),
*p_ResourceInfo,
v33,
pRestrictedUserInfo,
pDeviceInfo,
pRestrictedDeviceInfo,
(UINT8 *)Condition,
ConditionSize,
1u,
1u,
&Result);
if( v11 < 0 )
goto LABEL_13;
a4 = v43;
v9 = Token;
if( (_DWORD)Result != 1 )
{
v34 = v41;
if( (v15->Sbz1 & 0x40) != 0 )
v34 = 1;
LOBYTE(v41) = v34;
v7 &= v37 | 0x1000000;
}
}
else
{
a4 = v43;
}
v6 = 0i64;
LABEL_12:
++v10;
if( !v15 )
goto LABEL_13;
}
v11 = -1073741705;
LABEL_13:
if( v7 != -1 )
{
*(_BYTE *)(v5 + 4) = v41;
*(_DWORD *)v5 = v7;
}
if( v8 )
{
ExReleaseResourceLite(*((PERESOURCE *)Token + 6));
KeLeaveCriticalRegion();
}
if( ResourceInfo )
SepFreeResourceInfo(ResourceInfo);
return v11;
}Referenced by:
SeAccessCheckByTypeWithAdminlessChecks
SeAccessCheckWithHintWithAdminlessChecks
SeAdjustAccessStateForAccessConstraints
SeShouldCheckForAccessRightsFromParent
SepAccessCheckAndAuditAlarmWithAdminlessChecks
SepAdjustAccessStateForConstraints
SepCommonAccessCheckExWithAdminlessChecks