SepDeReferenceLogonSession

VOID __stdcall SepDeReferenceLogonSession(_LUID *LogonId, VOID *ServerSilo){
  __int64 v4; 
  _SEP_LOGON_SESSION_REFERENCES **p_Next; 
  _ETHREAD *CurrentThread; 
  INT64 v7; 
  _ERESOURCE *v8; 
  _SEP_LOGON_SESSION_REFERENCES *i; 
  __int64 v10; 
  _ADAPTER_OBJECT *Token; 
  _DEVICE_MAP *pDeviceMap; 
  wchar_t *Buffer; 

  v4 = (1529154084 * LogonId->LowPart) >> 28;
  p_Next = (_SEP_LOGON_SESSION_REFERENCES **)(SepLogonSessions + 8 * v4);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  v7 = v4 & 3;
  v8 = &stru_140CEC5A0 + v7;
  ExAcquireResourceExclusiveLite((UINT64)v8, 1, v7);
  for( i = *p_Next; ; i = i->Next )
  {
    if( !i )
    {
      ExReleaseResourceLite(v8);
      KeLeaveCriticalRegion();
      KeBugCheckEx(0x46u, 0i64, 0i64, 0i64, 0i64);
    }
    if( i->ServerSilo == ServerSilo
      && LogonId->LowPart == i->LogonId.LowPart
      && LogonId->HighPart == i->LogonId.HighPart )
    {
      break;
    }
    p_Next = &i->Next;
  }
  v10 = _InterlockedDecrement64(&i->ReferenceCount);
  if( v10 > 0 )
  {
    ExReleaseResourceLite(v8);
    KeLeaveCriticalRegion();
  }
  else
  {
    if( v10 )
      __fastfail(0xEu);
    *p_Next = i->Next;
    ExReleaseResourceLite(v8);
    KeLeaveCriticalRegion();
    if( (i->Flags & 4) != 0 && (i->BuddyLogonId.LowPart || i->BuddyLogonId.HighPart) )
      SepDeReferenceLogonSession(&i->BuddyLogonId, i->ServerSilo);
    Token = (_ADAPTER_OBJECT *)i->Token;
    if( Token )
    {
      HalPutDmaAdapter(Token);
      i->Token = 0i64;
    }
    pDeviceMap = i->pDeviceMap;
    if( pDeviceMap )
    {
      i->pDeviceMap = 0i64;
      SepCleanupLUIDDeviceMapDirectory(LogonId, (_EJOB *)ServerSilo);
      ObfDereferenceDeviceMap(pDeviceMap);
    }
    if( (i->Flags & 1) != 0 )
      SepInformFileSystemsOfDeletedLogon(LogonId, ServerSilo);
    Buffer = i->AccountName.Buffer;
    if( Buffer )
      ExFreePoolWithTag(Buffer, 0);
    SepDeleteLogonSessionClaims(i);
    if( SepTokenSidSharingEnabled )
      SepDeleteLogonSessionSidValues(i);
    ObDestroyHandleRevocationBlock(&i->RevocationBlock);
    SepInformLsaOfDeletedLogon(LogonId, i->ServerSilo, (_SEP_LSA_WORK_ITEM *)i);
    SepDeleteSessionLowboxEntries();
  }
}

Referenced by:

SepDeReferenceLogonSession
SepDeReferenceLogonSessionDirect
SepTokenDeleteMethod