SepUpdateLogonSessionTrack
INT64 __fastcall SepUpdateLogonSessionTrack(INT64 a1){
unsigned int v1;
_ETHREAD *CurrentThread;
unsigned int v4;
__int64 v5;
struct _ERESOURCE *v6;
__int64 *v7;
void *v8;
UINT8 *PoolWithTag;
unsigned __int64 v10;
unsigned __int64 v11;
v1 = 0;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v4 = (unsigned int)(1529154084 * *(_DWORD *)a1) >> 28;
--*((_WORD *)CurrentThread + 242);
v5 = v4;
v6 = &SepRmDbLock + (v4 & 3);
ExAcquireResourceExclusiveLite(v6, 1u);
v7 = *(__int64 **)(SepLogonSessions + 8 * v5);
if( v7 )
{
while( *(_DWORD *)a1 != *((_DWORD *)v7 + 2) || *(_DWORD *)(a1 + 4) != *((_DWORD *)v7 + 3) )
{
v7 = (__int64 *)*v7;
if( !v7 )
goto LABEL_10;
}
v8 = (void *)v7[8];
if( v8 )
{
ExFreePoolWithTag(v8, 0);
v7[8] = 0i64;
v7[10] = 0i64;
}
PoolWithTag = (UINT8 *)ExAllocatePoolWithTag(
PagedPool,
*(unsigned __int16 *)(a1 + 24)
+ 2i64
+ ((*(unsigned __int16 *)(a1 + 8) + 9i64) & 0xFFFFFFF8i64),
0x734C6553ui64);
if( PoolWithTag )
{
v7[8] = (__int64)PoolWithTag;
v7[10] = (__int64)&PoolWithTag[(*(unsigned __int16 *)(a1 + 8) + 9i64) & 0xFFFFFFFFFFFFFFF8ui64];
memmove(PoolWithTag, (UINT8 *)(a1 + 40), *(unsigned __int16 *)(a1 + 8));
v10 = *(unsigned __int16 *)(a1 + 8);
*((_WORD *)v7 + 28) = v10;
*((_WORD *)v7 + 29) = v10 + 2;
*(_WORD *)(v7[8] + 2 * (v10 >> 1)) = 0;
memmove(
(UINT8 *)v7[10],
(UINT8 *)(((*(unsigned __int16 *)(a1 + 8) + 7i64) & 0xFFFFFFFFFFFFFFF8ui64) + a1 + 40),
*(unsigned __int16 *)(a1 + 24));
v11 = *(unsigned __int16 *)(a1 + 24);
*((_WORD *)v7 + 36) = v11;
*((_WORD *)v7 + 37) = v11 + 2;
*(_WORD *)(v7[10] + 2 * (v11 >> 1)) = 0;
}
else
{
v1 = -1073741670;
}
}
else
{
LABEL_10:
v1 = -1073741729;
}
ExReleaseResourceLite(v6);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
return v1;
}Referenced by:
SepRmAddLogonSessionInfoWrkr