SepDeleteUnreferencedLogonSessionsInSilo

VOID __stdcall SepDeleteUnreferencedLogonSessionsInSilo(PEJOB ServerSilo){
  __int64 v2; 
  _EJOB *v3; 
  __int64 v4; 
  __int64 v5; 
  _ETHREAD *CurrentThread; 
  __int64 v7; 
  struct _ERESOURCE *v8; 
  __int64 i; 
  __int64 v10; 
  _ETHREAD *v11; 
  LUID LogonId; 
  v2 = 0i64;
  v3 = PsAttachSiloToCurrentThread(ServerSilo);
  v4 = 0i64;
  v5 = 16i64;
  do
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    v7 = SepLogonSessions;
    --*((_WORD *)CurrentThread + 242);
    v8 = &SepRmDbLock + (v2 & 3);
    ExAcquireResourceExclusiveLite(v8, 1u);
    for( i = *(_QWORD *)(v4 + v7); i; i = *(_QWORD *)i )
    {
      if( *(PEJOB *)(i + 160) == ServerSilo )
      {
        v10 = *(_QWORD *)(i + 24);
        if( !v10 || (*(_DWORD *)(i + 32) & 8) == 0 && v10 == 1 )
        {
          LogonId = *(LUID *)(i + 8);
          ExReleaseResourceLite(v8);
          KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
          SepDeleteLogonSessionTrack(&LogonId, 0);
          v11 = (_ETHREAD *)KeGetCurrentThread();
          --*((_WORD *)v11 + 242);
          ExAcquireResourceExclusiveLite(v8, 1u);
          i = SepLogonSessions + 8 * v2;
        }
      }
    }
    ExReleaseResourceLite(v8);
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
    ++v2;
    v4 += 8i64;
    --v5;
  }
  while( v5 );
  PsDetachSiloFromCurrentThread(v3);
}

Referenced by:

SeShutdownServerSilo