SepDeReferenceLogonSession

VOID __fastcall SepDeReferenceLogonSession(_LUID *LogonId, _EJOB *ServerSilo){
  __int64 v4; 
  INT64 *v5; 
  _ETHREAD *CurrentThread; 
  struct _ERESOURCE *v7; 
  INT64 i; 
  __int64 v9; 
  struct _DMA_ADAPTER *v10; 
  _DEVICE_MAP *v11; 
  void *v12; 
  v4 = (1529154084 * LogonId->LowPart) >> 28;
  v5 = (INT64 *)(SepLogonSessions + 8 * v4);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  v7 = &SepRmDbLock + (v4 & 3);
  ExAcquireResourceExclusiveLite(v7, 1u);
  for( i = *v5; ; i = *(_QWORD *)i )
  {
    if( !i )
    {
      ExReleaseResourceLite(v7);
      KeLeaveCriticalRegion();
      KeBugCheckEx(0x46u, 0i64, 0i64, 0i64, 0i64);
    }
    if( *(_EJOB **)(i + 160) == ServerSilo
      && LogonId->LowPart == *(_DWORD *)(i + 8)
      && LogonId->HighPart == *(_DWORD *)(i + 12) )
    {
      break;
    }
    v5 = (INT64 *)i;
  }
  v9 = _InterlockedDecrement64((volatile signed __int64 *)(i + 24));
  if( v9 > 0 )
  {
    ExReleaseResourceLite(v7);
    KeLeaveCriticalRegion();
  }
  else
  {
    if( v9 )
      __fastfail(0xEu);
    *v5 = *(_QWORD *)i;
    ExReleaseResourceLite(v7);
    KeLeaveCriticalRegion();
    if( (*(_DWORD *)(i + 32) & 4) != 0 && (*(_DWORD *)(i + 16) || *(_DWORD *)(i + 20)) )
      SepDeReferenceLogonSession((_LUID *)(i + 16), *(_EJOB **)(i + 160));
    v10 = *(struct _DMA_ADAPTER **)(i + 48);
    if( v10 )
    {
      HalPutDmaAdapter(v10);
      *(_QWORD *)(i + 48) = 0i64;
    }
    v11 = *(_DEVICE_MAP **)(i + 40);
    if( v11 )
    {
      *(_QWORD *)(i + 40) = 0i64;
      SepCleanupLUIDDeviceMapDirectory(LogonId, ServerSilo);
      ObfDereferenceDeviceMap(v11);
    }
    if( (*(_DWORD *)(i + 32) & 1) != 0 )
      SepInformFileSystemsOfDeletedLogon(LogonId, ServerSilo);
    v12 = *(void **)(i + 64);
    if( v12 )
      ExFreePoolWithTag(v12, 0);
    SepDeleteLogonSessionClaims(i);
    if( SepTokenSidSharingEnabled )
      SepDeleteLogonSessionSidValues(i);
    ObDestroyHandleRevocationBlock((_OB_HANDLE_REVOCATION_BLOCK *)(i + 128));
    SepInformLsaOfDeletedLogon((INT64 *)LogonId, *(VOID **)(i + 160), (CHAR *)i);
    SepDeleteSessionLowboxEntries();
  }
}

Referenced by:

SepDeReferenceLogonSession
SepDeReferenceLogonSessionDirect
SepTokenDeleteMethod