private static void OnHotPlug(KHOT_HANDLE hotHandle,
                                      KLST_DEVINFO_HANDLE deviceInfo,
                                      KLST_SYNC_FLAG plugType)
        {
            LinkDevice d;
            int        totalPluggedDeviceCount = (int)hotHandle.GetContext().ToInt64();

            if (totalPluggedDeviceCount == int.MaxValue)
            {
                // OnHotPlug is being called for the first time on handle: hotHandle.Pointer.
                totalPluggedDeviceCount = 0;
            }
            switch (plugType)
            {
            case KLST_SYNC_FLAG.ADDED:     // Arrival.
                totalPluggedDeviceCount++;
                lock (Manager.UsbConnectionLock) {
                    if (Settings.DebugLevel > 4)
                    {
                        Log.d(TAG, "OnHotPlug.Added: " + UsbLinkDevice.DeviceInfoToString(deviceInfo));
                    }
                    if (UsbPermissionValidator.CheckAllowed(deviceInfo.Common.Vid, deviceInfo.Common.Pid))
                    {
                        UsbLinkDevice.TryOpeningDevice(deviceInfo);
                    }
                    else
                    {
                        if (Settings.DebugLevel > 4)
                        {
                            Log.d(TAG, "OnHotPlug.Added: Not allowed: " + UsbLinkDevice.DeviceInfoToString(deviceInfo));
                        }
                    }
                }
                break;

            case KLST_SYNC_FLAG.REMOVED:     // Removal.
                totalPluggedDeviceCount--;
                lock (Manager.UsbConnectionLock) {
                    if (Settings.DebugLevel > 4)
                    {
                        Log.d(TAG, "OnHotPlug.Removed: " + UsbLinkDevice.DeviceInfoToString(deviceInfo));
                    }
                    d = LinkManager.Manager.FindDevice(UsbLinkDevice.GetDevIdFromHandle(deviceInfo));
                    UsbLinkDevice u = d as UsbLinkDevice;
                    if (u != null)
                    {
                        u.Disconnect(deviceInfo);                // Disconnect device but keep in Active list.
                    }
                }
                break;

            default:
                return;
            }
            hotHandle.SetContext(new IntPtr(totalPluggedDeviceCount));
        }
 // Scan the current usb devices to check all connected.
 private void CheckConnections()
 {
     lock (UsbConnectionLock) {
         KLST_DEVINFO_HANDLE deviceInfo;
         LstK lst         = new LstK(KLST_FLAG.NONE);
         int  deviceCount = 0;
         lst.Count(ref deviceCount);
         while (lst.MoveNext(out deviceInfo))
         {
             LinkDevice d = LinkManager.Manager.FindDevice(UsbLinkDevice.GetDevIdFromHandle(deviceInfo));
             // Check if d is a suspended Acc with same SN but different V/P.
             if (d == null || ((d.State != ComponentState.Working) /*&& !UsbLinkDevice.CompareVidPid(d, deviceInfo)*/))
             {
                 if (UsbPermissionValidator.CheckAllowed(deviceInfo.Common.Vid, deviceInfo.Common.Pid))
                 {
                     UsbLinkDevice.TryOpeningDevice(deviceInfo);
                 }
             }
         }
         lst.Free();
     }
 }