Собрали утилиту chknsk, вот ее вывод на работающем ключе (поля ID и Public Code изменены):
Welcome to Guardant Diagnostic Tool! (v1.0001)
Detecting Guardant dongles ...
------------- Guardant Code Time Dongle ---------------------------------------
Produce Date (dd.mm.yy): 21.05.2019 (ID=0xXXXXXXXX)
Versions (Hrw,MCUF,Type,PrtSup,Std,Cl,DSt): 0.1,00,5F0,00,00,0.0,0
Supports: PI,TRU,RTC,AES,ECC,CODE
Global Flags: PTIME,HID
Public Code: XXX_XXX (0xXXXXXXXX)
-------------------------------------------------------------------------------
Firmware ProgNum Version SerialN GPcounter Mask NetRes RealRes Index
-------------------------------------------------------------------------------
1.0.2.21 0 1 104 0 0000h 0 0 00000000
-------------------------------------------------------------------------------
Result: 1 dongle(s) found. Press Enter...
Подождем когда ключ зависнет вновь и снова попытаемся ее выполнить.
По поводу хендлов. У нас используется первый описанный вами вариант. Над библиотекой grdapi написана дополнительная библиотека, которая работает непосредственно с ключем, в ней используется однин хендл. Перед выполнением любой функции GrdAPI происходит блокировка семафором, а вызовы фунукций GrdCodeRun дополнительно огорожены функциями GrdLock, GrdUnlock. Так же хотелось бы отметить, что обращение к ключу идет из нескольких процессов, в некоторых из них и из разных потоков.
Функции GrdFind и GrdLogin обращаются только к локальным ключам, так как перед их вызовом выполняется функция:
GrdSetFindMode(keyHandle, GrdFMR_Local, GrdFM_Type, 0, 0, 0, 0, 0, GrdDT_RTC, GrdFMM_CodeUSB, GrdFMI_USB);
Для поиска ключа мы действительно используем функцию GrdFind, а GrdLogin уже выполняется после успешного выполнения GrdFind. Учтем ваше предложение по поводу удаления функции GrdFind из кода, спасибо.
Мы провели эксперимент: после того как ключ уже находился в "зависшем" состоянии, было написано тестове приложение, в котором вместо вызова функции GrdFind была использована функция GrdLogin, но ее выполнение так же происходит с ошибкой до тех пор пока не передернешь физически ключ.
Еще провели небольшой эксперимент на предмет того, что зависает ключ или драйвер. При "зависшем" ключе перезагрузили ПК, при этом с помощью осциллографа убедились, что питание на USB в момент перезагрузки не обрывалось. Так вот после перезагрузки ключ прекрасно начал работать, т.о. предположительно что-то в драйвере ключа происходит.
Ключи у нас работают в HID режиме.