Правильная логика проверки наличия ключа

Ниже приведен кусок кода который следит за наличием ключа в слоте. Написано в соответствии с рекомендациями ваших собаководов. =) Однако бывает баг следующего генеза - если достать ключ, а затем снова вставить(не каждый раз, нужно повторять до потери пульса.). В итоге, в данном процессе ключ определится, вся информация считается. Однако Ключ после этого не доступен в других процессах. В частности guardant - диагностика просто навсегда зависает в поиске ключа(любой другой процесс пытающийся повторить поиск - заканчивает так же плачевно, т.е. не заканчивается никогда). Если застрелить чекер с нижеуказанным кодом - все сразу оживает. Я чтото делаю не так, или всетаки лыжи не едут?

if (GrdStartup(GrdFMR_Local) == GrdE_OK)
    {
        HANDLE hGrd = GrdCreateHandle(NULL, GrdCHM_MultiThread, NULL);
        if (hGrd)
        {
            //TODO: protect access codes
            if (GrdSetAccessCodes(hGrd, ***, ***, 0, 0) == GrdE_OK)
            {
                if (GrdSetFindMode(hGrd, GrdFMR_Local, GrdFM_NProg, 1, 0, 0, 0, 0, 0, 0, GrdFMI_USB) == GrdE_OK)
                {
                    while (!abort.Check())
                    {
                        DWORD keyId = 0;
                        TGrdFindInfo fi;
                        int r = GrdFind(hGrd, GrdF_First, &keyId, &fi);
                        if (r != GrdE_OK && r != GrdE_DongleNotFound && r != GrdE_AllDonglesFound)
                            break;
                        if (r == GrdE_OK)
                        {
                            if (GrdLogin(hGrd, 0, 0) != GrdE_OK)
                                break;
                            if (GrdRead(hGrd, UAM_WORKER_ID, 4, &workerInfo.m_id, NULL) == GrdE_OK)
                            {
                               
                                while (!abort.Wait(GUARDANT_KEY_RECHECK_TIMEOUT))
                                {
                                    if (GrdCheck(hGrd) != GrdE_OK)
                                        break;
                                }
                                m_logout();
                            }
                            GrdLogout(hGrd, 0);
                        }
                        else
                            abort.Wait(GUARDANT_KEY_RECHECK_TIMEOUT);
                    }
                }
            }
            GrdCloseHandle(hGrd);
        }
        GrdCleanup();
    }

Re: Правильная логика проверки наличия ключа

Здравствуйте. Уточните подробнее, указанное поведение защищённого приложения воспроизводится только на одном компьютере или на нескольких?

Служба технической поддержки компании "Актив"

Re: Правильная логика проверки наличия ключа

на нескольких тестовых с голой операционкой. На моем воспроизводится гарантированно со второго-третьего раза.
На сколько я понимаю логику - скомпилируйте вышеуказанный код - у вас должно получиться то же самое. Если будет необходимость я могу изолировать это приложение от остальной части софта чтобы вы могли его запустить.

Re: Правильная логика проверки наличия ключа

GUARDANT_KEY_RECHECK_TIMEOUT - 5 сек.
Ключи guardant code, но для приведенной ситуации не используется ничего кроме того что написано в коде.

Re: Правильная логика проверки наличия ключа

В таком случае пришлите нам следующие данные на hotline@guardant.ru:
1. О каких именно рекомендациях идёт речь;
2. Версия Мастер Комплекта;
3. Язык программирования;
4. Среда разработки;
5. На какой операционной системе выполняется приложение и на каком железе(достаточно данных утилиты msinfo.32  с проблемного компьютера);
6. Тестовое приложение с исходниками на котором воспроизводится ошибка;
7. Отчёт утилиты диагностики ключа и файл маски .nsd прошитый в используемом ключе.

Служба технической поддержки компании "Актив"