SepRemoveTokenLogonSession
VOID __fastcall SepRemoveTokenLogonSession(INT64 a1){
_ETHREAD *CurrentThread;
unsigned int v3;
__int64 v4;
struct _ERESOURCE *v5;
__int64 *v6;
__int64 *v7;
__int64 *v8;
__int64 **v9;
if( (*(_DWORD *)(a1 + 200) & 0x20) == 0 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v3 = (unsigned int)(1529154084 * *(_DWORD *)(a1 + 24)) >> 28;
--*((_WORD *)CurrentThread + 242);
v4 = v3;
v5 = &SepRmDbLock + (v3 & 3);
ExAcquireResourceExclusiveLite(v5, 1u);
v6 = *(__int64 **)(SepLogonSessions + 8 * v4);
if( v6 )
{
while( 1 )
{
if( *(_DWORD *)(a1 + 24) == *((_DWORD *)v6 + 2)
&& *(_DWORD *)(a1 + 28) == *((_DWORD *)v6 + 3)
&& *(_QWORD *)(*(_QWORD *)(a1 + 216) + 160i64) == v6[20] )
{
v7 = (__int64 *)v6[22];
if( v7 != v6 + 22 )
break;
}
LABEL_9:
v6 = (__int64 *)*v6;
if( !v6 )
goto LABEL_10;
}
while( 1 )
{
v8 = (__int64 *)*v7;
if( v7[2] == a1 )
break;
v7 = (__int64 *)*v7;
if( v8 == v6 + 22 )
goto LABEL_9;
}
if( (__int64 *)v8[1] != v7 || (v9 = (__int64 **)v7[1], *v9 != v7) )
__fastfail(3u);
*v9 = v8;
v8[1] = (__int64)v9;
ExReleaseResourceLite(v5);
KeLeaveCriticalRegion();
ExFreePoolWithTag(v7, 0);
}
else
{
LABEL_10:
ExReleaseResourceLite(v5);
KeLeaveCriticalRegion();
}
}
}Referenced by:
NtSetInformationToken
SepLinkLogonSessions
SepSetServerSiloToken
SepTokenDeleteMethod