SepIsImpersonationAllowedDueToCapability
UINT8 __stdcall SepIsImpersonationAllowedDueToCapability(VOID *ProcessToken, VOID *ImpersonationToken, VOID *a3){
char v5;
UINT8 result;
VOID *v7;
UINT8 v8;
VOID *v9;
UINT8 v10;
char v11;
VOID *v12;
UINT8 v13;
char v14;
UINT8 *v15;
bool v16;
UINT8 Matcha;
v5 = 0;
if( *((_DWORD *)ImpersonationToken + 30) != *((_DWORD *)ProcessToken + 30)
|| (*(_DWORD *)(*((_QWORD *)ImpersonationToken + 27) + 32i64) & 0x10) != 0
|| RtlIsMultiSessionSku() )
{
return 0;
}
v7 = SeDefaultAccountAliasSid;
v8 = SepSidInToken(ProcessToken, 0i64, SeDefaultAccountAliasSid, 0, 0, 0);
if( v8 )
{
if( SeTokenIsRestricted(ProcessToken) )
v8 = SepSidInToken(ProcessToken, 0i64, v7, 0, 1u, 0);
if( v8 )
v5 = 1;
}
if( SepAllowSessionImpersonationCap && (*((_DWORD *)ProcessToken + 50) & 0x4000) == 0 )
{
v9 = SeSessionImpersonationCapabilityGroupSid;
v10 = SepSidInToken(ProcessToken, 0i64, SeSessionImpersonationCapabilityGroupSid, 0, 0, 0);
if( v10 )
{
if( SeTokenIsRestricted(ProcessToken) )
v10 = SepSidInToken(ProcessToken, 0i64, v9, 0, 1u, 0);
if( v10 )
return 1;
}
v11 = v10;
if( v5 )
v11 = 1;
if( v11 )
return 1;
}
if( (*((_DWORD *)ImpersonationToken + 50) & 0x4000) == 0 )
return 0;
v12 = SeConstrainedImpersonationCapabilityGroupSid;
v13 = SepSidInToken(ProcessToken, 0i64, SeConstrainedImpersonationCapabilityGroupSid, 0, 0, 0);
if( v13 )
{
if( SeTokenIsRestricted(ProcessToken) )
v13 = SepSidInToken(ProcessToken, 0i64, v12, 0, 1u, 0);
if( v13 )
goto LABEL_28;
}
v14 = v13;
if( v5 )
v14 = 1;
if( v14 )
{
LABEL_28:
if( (*((_DWORD *)ProcessToken + 50) & 0x4000) == 0 )
return 1;
}
result = SepSidInTokenSidHash(
(_SID_AND_ATTRIBUTES_HASH *)((char *)ProcessToken + 808),
0i64,
SeConstrainedImpersonationCapabilitySid,
0,
1u,
0);
Matcha = result;
if( result )
{
v16 = SepCheckCapabilities(
ProcessToken,
*((unsigned int *)ImpersonationToken + 200),
*((_SID_AND_ATTRIBUTES **)ImpersonationToken + 99),
v15,
&Matcha) < 0;
result = Matcha;
if( !v16 && !Matcha )
return RtlEqualSid(*((PVOID *)ProcessToken + 98), *((PVOID *)ImpersonationToken + 98));
}
return result;
}Referenced by:
SeTokenCanImpersonate