SepDeleteLogonSessionTrack
INT64 __stdcall SepDeleteLogonSessionTrack(LUID *LogonId, UINT8 MarkForInteractiveLogoff){
_DEVICE_MAP *v2;
__int64 v5;
_DWORD **v6;
_ETHREAD *CurrentThread;
struct _ERESOURCE *v8;
_DWORD *i;
__int64 v10;
_DEVICE_MAP *v11;
void *v12;
void *v13;
unsigned int v15;
v2 = 0i64;
v5 = (1529154084 * LogonId->LowPart) >> 28;
v6 = (_DWORD **)(SepLogonSessions + 8 * v5);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
v8 = &SepRmDbLock + (v5 & 3);
ExAcquireResourceExclusiveLite(v8, 1u);
for( i = *v6; ; i = *(_DWORD **)i )
{
if( !i )
{
v15 = -1073741729;
goto LABEL_26;
}
if( *((_EJOB **)i + 20) == PsGetCurrentServerSilo() && LogonId->LowPart == i[2] && LogonId->HighPart == i[3] )
break;
v6 = (_DWORD **)i;
}
if( MarkForInteractiveLogoff )
{
i[8] |= 0x10u;
ObRevokeHandles((_OB_HANDLE_REVOCATION_BLOCK *)i + 4);
ExReleaseResourceLite(v8);
KeLeaveCriticalRegion();
return 0i64;
}
v10 = *((_QWORD *)i + 3);
if( !v10 || (i[8] & 8) == 0 && v10 == 1 )
{
*v6 = *(_DWORD **)i;
v11 = (_DEVICE_MAP *)*((_QWORD *)i + 5);
if( v11 )
{
*((_QWORD *)i + 5) = 0i64;
v2 = v11;
}
ExReleaseResourceLite(v8);
KeLeaveCriticalRegion();
if( v2 )
{
SepCleanupLUIDDeviceMapDirectory(LogonId, *((_EJOB **)i + 20));
ObfDereferenceDeviceMap(v2);
}
v12 = (void *)*((_QWORD *)i + 20);
if( v12 )
ObfDereferenceObjectWithTag(v12, 0x734C6553ui64);
v13 = (void *)*((_QWORD *)i + 8);
if( v13 )
ExFreePoolWithTag(v13, 0);
SepDeleteLogonSessionClaims((INT64)i);
if( SepTokenSidSharingEnabled )
SepDeleteLogonSessionSidValues((INT64)i);
ObDestroyHandleRevocationBlock((_OB_HANDLE_REVOCATION_BLOCK *)i + 4);
ExFreePoolWithTag(i, 0);
SepDeleteSessionLowboxEntries();
return 0i64;
}
v15 = -1073741564;
LABEL_26:
ExReleaseResourceLite(v8);
KeLeaveCriticalRegion();
return v15;
}Referenced by:
SeInitServerSilo
SepDeleteUnreferencedLogonSessionsInSilo
SepRmDeleteLogonSessionWrkr
SepRmInteractiveLogoffLogonSessionWrkr