IopDestroyActiveConnectBlock

VOID __stdcall IopDestroyActiveConnectBlock(_ACTIVE_CONNECT_BLOCK *ConnectBlock){
  __int64 v2; 
  volatile signed __int32 *v3; 
  _KEVENT *v4; 
  char v5; 
  signed __int32 v6; 
  __int64 v7; 
  _ACTIVE_CONNECT_BLOCK **v8; 
  _ETHREAD *CurrentThread; 
  __int128 Object; 
  __int64 v11; 

  Object = 0i64;
  v11 = 0i64;
  if( *((_QWORD *)ConnectBlock + 3) )
  {
    v2 = *((_QWORD *)ConnectBlock + 4);
    v3 = ConnectBlock + 16;
    KeInitializeEvent((INT64)&Object, 1, 0);
    v4 = 0i64;
    v5 = 0;
    IopAcquireReleaseConnectLockInternal(0i64, 1u, 2ui64);
    v6 = _InterlockedDecrement((volatile signed __int32 *)v2);
    if( (volatile signed __int32 *)v2 == v3 )
    {
      if( v6 )
      {
        v5 = 1;
        *((_QWORD *)ConnectBlock + 9) = &Object;
      }
    }
    else
    {
      if( !v6 )
        v4 = *(_KEVENT **)(v2 + 8);
      _InterlockedAdd(v3, 0xFFFFFFFF);
    }
    v7 = *(_QWORD *)ConnectBlock;
    if( *(_ACTIVE_CONNECT_BLOCK **)(*(_QWORD *)ConnectBlock + 8i64) != ConnectBlock
      || (v8 = (_ACTIVE_CONNECT_BLOCK **)*((_QWORD *)ConnectBlock + 1), *v8 != ConnectBlock) )
    {
      __fastfail(3u);
    }
    *v8 = (_ACTIVE_CONNECT_BLOCK *)v7;
    *(_QWORD *)(v7 + 8) = v8;
    IopAcquireReleaseConnectLockInternal(0i64, 0, 2ui64);
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.KernelApcDisable;
    if( v5 )
    {
      KeWaitForSingleObject((UINT64)&Object, 0, 0, 0, 0i64);
    }
    else if( v4 )
    {
      KeSetEvent(v4, 0, 0);
    }
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
  }
}

Referenced by:

IoDisconnectInterrupt
IopConnectInterrupt