NtCompareTokens
NTSTATUS __stdcall NtCompareTokens(VOID *FirstTokenHandle, VOID *SecondTokenHandle, UINT8 *Equal){
UINT8 *v3;
char v6;
char PreviousMode;
__int64 v8;
int InformationToken;
_TOKEN *v10;
unsigned int *v11;
__int64 v12;
_SID_AND_ATTRIBUTES *UserAndGroups;
void *TrustLevelSid;
void *v15;
UINT8 IsRestricted;
UINT8 v17;
UINT8 v19;
VOID *TokenInformation;
PVOID AccessToken;
unsigned int *v22;
PVOID Token;
char v25;
v3 = Equal;
v22 = 0i64;
v6 = 0;
v25 = 0;
TokenInformation = 0i64;
PreviousMode = KeGetCurrentThread()->PreviousMode;
if( PreviousMode )
{
v8 = 0x7FFFFFFF0000i64;
if( (unsigned __int64)Equal < 0x7FFFFFFF0000i64 )
v8 = (__int64)Equal;
*(_BYTE *)v8 = *(_BYTE *)v8;
}
AccessToken = 0i64;
InformationToken = ObReferenceObjectByHandle(
FirstTokenHandle,
8ui64,
(_OBJECT_TYPE *)SeTokenObjectType,
PreviousMode,
&AccessToken,
0i64);
v10 = (_TOKEN *)AccessToken;
if( InformationToken < 0 )
{
v10 = 0i64;
LABEL_36:
v11 = v22;
goto LABEL_27;
}
if( FirstTokenHandle == SecondTokenHandle )
{
v6 = 1;
goto LABEL_36;
}
Token = 0i64;
InformationToken = ObReferenceObjectByHandle(
SecondTokenHandle,
8ui64,
(_OBJECT_TYPE *)SeTokenObjectType,
PreviousMode,
&Token,
0i64);
v11 = (unsigned int *)Token;
if( InformationToken < 0 )
{
v11 = 0i64;
}
else if( v10 == Token )
{
v6 = 1;
}
else
{
SepAcquireOrderedReadLocks(v10, (_TOKEN *)Token);
v25 = 1;
v12 = *((_QWORD *)v11 + 19);
UserAndGroups = v10->UserAndGroups;
if( RtlEqualSid(UserAndGroups->Sid, *(PVOID *)v12) )
{
if( ((*(_BYTE *)(v12 + 8) ^ LOBYTE(UserAndGroups->Attributes)) & 0x14) == 0 )
{
InformationToken = SeQueryInformationToken(v10, TokenIsAppContainer, &TokenInformation);
if( InformationToken >= 0 )
{
InformationToken = SeQueryInformationToken(v11, TokenIsAppContainer, (VOID **)((char *)&TokenInformation + 4));
if( InformationToken >= 0
&& (_DWORD)TokenInformation == HIDWORD(TokenInformation)
&& (!(_DWORD)TokenInformation
|| RtlEqualSid(v10->Package, *((PVOID *)v11 + 98))
&& SepCompareSidAndAttributeArrays(
v10->Capabilities,
v10->CapabilityCount,
*((_SID_AND_ATTRIBUTES **)v11 + 99),
v11[200])) )
{
TrustLevelSid = v10->TrustLevelSid;
v15 = (void *)*((_QWORD *)v11 + 138);
if( (TrustLevelSid != 0i64) == (v15 != 0i64) && (!TrustLevelSid || RtlEqualSid(TrustLevelSid, v15)) )
{
IsRestricted = SeTokenIsRestricted(v10);
if( IsRestricted == SeTokenIsRestricted(v11) )
{
if( !IsRestricted
|| (v19 = SeTokenIsWriteRestricted(v10), v19 == SeTokenIsWriteRestricted(v11))
&& SepCompareSidAndAttributeArrays(
v10->RestrictedSids,
v10->RestrictedSidCount,
*((_SID_AND_ATTRIBUTES **)v11 + 20),
v11[32]) )
{
if( v10->Privileges.Enabled == *((_QWORD *)v11 + 9)
&& v10->Privileges.Present == *((_QWORD *)v11 + 8)
&& v10->MandatoryPolicy == v11[53]
&& SepCompareSidAndAttributeArrays(
v10->UserAndGroups + 1,
v10->UserAndGroupCount - 1,
(_SID_AND_ATTRIBUTES *)(*((_QWORD *)v11 + 19) + 16i64),
v11[31] - 1)
&& SepCompareClaimAttributes(
v10->pClaimAttributes,
*((_AUTHZBASEP_CLAIM_ATTRIBUTES_COLLECTION **)v11 + 137),
v17)
&& AuthzBasepCompareLegacySecurityAttributesInformation(
v10->pSecurityAttributes,
*((_KTHREAD **)v11 + 97)) )
{
v6 = 1;
}
}
}
}
}
}
}
}
v3 = Equal;
}
LABEL_27:
if( v25 )
SepReleaseOrderedReadLocks(v10, (_TOKEN *)v11);
if( v10 )
HalPutDmaAdapter((PADAPTER_OBJECT)v10);
if( v11 )
HalPutDmaAdapter((PADAPTER_OBJECT)v11);
*v3 = v6;
return InformationToken;
}Referenced by:
No references.