SeTokenCanImpersonate
NTSTATUS __stdcall SeTokenCanImpersonate(
VOID *ProcessToken,
VOID *Token,
_SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
UINT8 *UseProcessTrust){
NTSTATUS result;
void *v7;
void *v8;
_BYTE *v9;
int IsElevated;
VOID *v11;
void *v12;
void *v13;
int v14;
_SID_AND_ATTRIBUTES v15;
_SID_AND_ATTRIBUTES IntegritySA;
UINT8 pbDominate;
UINT8 v18;
UINT8 TokenIsElevated;
int v20;
v18 = 0;
pbDominate = 0;
TokenIsElevated = 0;
v20 = 0;
*UseProcessTrust = 0;
IntegritySA = 0i64;
v15 = 0i64;
if( ImpersonationLevel < SecurityImpersonation )
return 0;
if( *((_DWORD *)Token + 6) == 998 && !*((_DWORD *)Token + 7) )
{
if( (*((_DWORD *)ProcessToken + 50) & 0x4000) != 0 )
{
if( (*((_DWORD *)Token + 50) & 0x4000) == 0 )
return -1073741727;
v7 = (void *)*((_QWORD *)Token + 98);
v8 = (void *)*((_QWORD *)ProcessToken + 98);
if( !RtlEqualSid(v8, v7) && !RtlIsParentOfChildAppContainer(v8, v7) )
return -1073741727;
}
return 0;
}
result = RtlSidDominatesForTrust(*((VOID **)ProcessToken + 138), *((VOID **)Token + 138), &pbDominate);
if( result < 0 )
return result;
if( !pbDominate )
*v9 = 1;
if( (*((_DWORD *)ProcessToken + 16) & *((_DWORD *)ProcessToken + 18) & 0x20000000) != 0 )
return 0;
SepAcquireOrderedReadLocks((_TOKEN *)ProcessToken, (_TOKEN *)Token);
SepCopyTokenIntegrity((_TOKEN *)ProcessToken, &IntegritySA);
SepCopyTokenIntegrity((_TOKEN *)Token, &v15);
IsElevated = RtlSidDominates(IntegritySA.Sid, v15.Sid, &v18);
if( IsElevated >= 0 )
{
if( !v18 )
goto LABEL_42;
if( SepIsImpersonationAllowedDueToCapability(ProcessToken, Token, v11)
|| *((_DWORD *)ProcessToken + 6) == *((_DWORD *)Token + 56)
&& *((_DWORD *)ProcessToken + 7) == *((_DWORD *)Token + 57) )
{
IsElevated = 0;
goto LABEL_43;
}
if( !RtlEqualSid(**((PVOID **)ProcessToken + 19), **((PVOID **)Token + 19)) )
{
LABEL_42:
IsElevated = -1073741727;
goto LABEL_43;
}
if( (int)RtlQueryElevationFlags(&v20) < 0 || (v20 & 1) == 0 )
goto LABEL_32;
IsElevated = SeTokenIsElevated(Token, &TokenIsElevated);
if( IsElevated >= 0 )
{
if( !TokenIsElevated )
goto LABEL_29;
IsElevated = SeTokenIsElevated(ProcessToken, &TokenIsElevated);
if( IsElevated >= 0 )
{
if( !TokenIsElevated && (*(_DWORD *)(*((_QWORD *)ProcessToken + 27) + 32i64) & 4) != 0 )
goto LABEL_42;
LABEL_29:
if( (*(_DWORD *)(*((_QWORD *)ProcessToken + 27) + 32i64) & 4) != 0
&& (*(_DWORD *)(*((_QWORD *)Token + 27) + 32i64) & 4) == 0 )
{
SepLogUnmatchedSessionFlagImpersonationAttempt((INT64)ProcessToken, (INT64)Token);
goto LABEL_42;
}
LABEL_32:
IsElevated = 0;
if( (*((_DWORD *)ProcessToken + 50) & 0x4000) == 0
|| (*((_DWORD *)Token + 50) & 0x4000) != 0
&& ((v12 = (void *)*((_QWORD *)Token + 98), v13 = (void *)*((_QWORD *)ProcessToken + 98),
RtlEqualSid(v13, v12))
|| RtlIsParentOfChildAppContainer(v13, v12)) )
{
if( !SeTokenIsRestricted(ProcessToken)
|| SeTokenIsRestricted(Token)
&& (SeTokenIsWriteRestricted(ProcessToken) || !SeTokenIsWriteRestricted(Token)) )
{
v14 = *((_DWORD *)Token + 30);
if( *((_DWORD *)ProcessToken + 30) == v14 || v14 )
goto LABEL_43;
}
}
goto LABEL_42;
}
}
}
LABEL_43:
SepReleaseOrderedReadLocks((_TOKEN *)ProcessToken, (_TOKEN *)Token);
return IsElevated;
}Referenced by:
PsImpersonateClient