SepUpdateLogonSessionTrack
__int64 __fastcall SepUpdateLogonSessionTrack(__int64 a1, __int64 a2, INT64 a3){
unsigned int v3;
_ETHREAD *CurrentThread;
unsigned int v6;
__int64 v7;
_ERESOURCE *v8;
__int64 *v9;
void *v10;
VOID **PoolWithTag;
unsigned __int64 v12;
unsigned __int64 v13;
v3 = 0;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v6 = (unsigned int)(1529154084 * *(_DWORD *)a1) >> 28;
--CurrentThread->Tcb.KernelApcDisable;
v7 = v6;
v8 = &stru_140CEC5A0 + (v6 & 3);
ExAcquireResourceExclusiveLite((UINT64)v8, 1, a3);
v9 = *(__int64 **)(SepLogonSessions + 8 * v7);
if( v9 )
{
while( *(_DWORD *)a1 != *((_DWORD *)v9 + 2) || *(_DWORD *)(a1 + 4) != *((_DWORD *)v9 + 3) )
{
v9 = (__int64 *)*v9;
if( !v9 )
goto LABEL_10;
}
v10 = (void *)v9[8];
if( v10 )
{
ExFreePoolWithTag(v10, 0);
v9[8] = 0i64;
v9[10] = 0i64;
}
PoolWithTag = ExAllocatePoolWithTag(
1ui64,
*(unsigned __int16 *)(a1 + 24) + 2i64 + ((*(unsigned __int16 *)(a1 + 8) + 9i64) & 0xFFFFFFF8i64),
1934386515i64);
if( PoolWithTag )
{
v9[8] = (__int64)PoolWithTag;
v9[10] = (__int64)PoolWithTag + ((*(unsigned __int16 *)(a1 + 8) + 9i64) & 0xFFFFFFFFFFFFFFF8ui64);
memmove(PoolWithTag, (const VOID *)(a1 + 40), *(unsigned __int16 *)(a1 + 8));
v12 = *(unsigned __int16 *)(a1 + 8);
*((_WORD *)v9 + 28) = v12;
*((_WORD *)v9 + 29) = v12 + 2;
*(_WORD *)(v9[8] + 2 * (v12 >> 1)) = 0;
memmove(
(VOID *)v9[10],
(const VOID *)(((*(unsigned __int16 *)(a1 + 8) + 7i64) & 0xFFFFFFFFFFFFFFF8ui64) + a1 + 40),
*(unsigned __int16 *)(a1 + 24));
v13 = *(unsigned __int16 *)(a1 + 24);
*((_WORD *)v9 + 36) = v13;
*((_WORD *)v9 + 37) = v13 + 2;
*(_WORD *)(v9[10] + 2 * (v13 >> 1)) = 0;
}
else
{
v3 = -1073741670;
}
}
else
{
LABEL_10:
v3 = -1073741729;
}
ExReleaseResourceLite(v8);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
return v3;
}Referenced by:
SepRmAddLogonSessionInfoWrkr