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