SepIsSiblingTokenByPointer
NTSTATUS __stdcall SepIsSiblingTokenByPointer(PVOID Token, UINT8 *IsSibling){
_ETHREAD *CurrentThread;
__int64 v5;
_TOKEN *v6;
_TOKEN *v7;
_LUID ParentTokenId;
_LUID AuthenticationId;
__int64 v10;
__int64 v11;
_SEP_LOGON_SESSION_REFERENCES *LogonSession;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
*IsSibling = 0;
v5 = *((_QWORD *)CurrentThread + 23);
v6 = (_TOKEN *)PsReferencePrimaryToken((PEPROCESS)v5);
v7 = v6;
if( !v6 )
return -1073741823;
ParentTokenId = v6->ParentTokenId;
AuthenticationId = v6->AuthenticationId;
ObFastDereferenceObject((INT64 *)(v5 + 1208), (struct DMA_ADAPTER *)v6);
v10 = *((_QWORD *)Token + 3);
if( *((_QWORD *)Token + 4) == ParentTokenId )
{
if( v10 == AuthenticationId )
{
*IsSibling = 1;
}
else
{
SepAcquireOrderedReadLocks(v7, (_TOKEN *)Token);
if( (v7->TokenFlags & 0x20) == 0 && (*((_DWORD *)Token + 50) & 0x20) == 0 )
{
v11 = *((_QWORD *)Token + 27);
LogonSession = v7->LogonSession;
if( (LogonSession->Flags & *(_BYTE *)(v11 + 32) & 0x40) != 0
&& AuthenticationId == *(_QWORD *)(v11 + 168)
&& v10 == *(_QWORD *)&LogonSession->SiblingAuthId )
{
*IsSibling = 1;
}
}
SepReleaseOrderedReadLocks((INT64)v7, (INT64)Token);
}
}
return 0;
}Referenced by:
SeIsTokenAssignableToProcess