Спасибо за ответ.
Эта функция работает только с ключами Guardant Code. Более подробно о ней можно узнать на портале документации - GrdSetDriverMode.
Все-таки у меня не складывается полная картина.
Функция GrdSetDriverMode позволяет переключать режим из клиентской программы в рантайм?
Или она изменяет глобальные флаги при прошивке ключа между вызовами GrdInit и GrdProtect?
Флаги указываемые в GrdProtect - это начальное значение или что?
Про ключи модели Code у меня не праздное любопытство.
Если они реально удобнее в плане работы без драйверов Guardant, то мы можем принять решение о добавлении их поддержки в нашем софте.
А пока остались вопросы по модели Sign.
Как я понял, поддержка HID фиксируется в момент вызова GrdProtect с флагом GrdGF_HID или без него.
При полной прошивке ключа с вызовом GrdInit и последующим формированием памяти ключа все ок.
Т.е. для вновь продаваемых ключей мы научились на выбор делать их с глобальными флагами GrdGF_HID или 0.
Остается проблема с ключами Sign, которые уже находятся на руках у пользователей.
Многие обновляют компьютеры, с включенным модулем TPM драйверы Guardant не работают.
Включение удаленно поддержки HID для таких пользователей - актуальная проблема.
У нас есть собственный механизм удаленной ограниченной записи в ключ на стороне пользователя.
Т.е. потенциально есть возможность указать другое значение глобальных флагов при вызове GrdProtect.
Эксперименты с вызовом GrdProtect без предшествующего GrdInit показали, что флаг GrdGF_HID включается, но указание флагов 0 не отключает HID. Т.е. получается только одностороннее включение HID без возможности отката.
Смысл отказа от вызова GrdInit - не сбрасывать всю память ключа, на стороне пользователя нет возможности сделать полноценную прошивку.
В примере из SDK demo.cpp я добавил такой код:
/*
printf("Init: ");
nRet = grdDongle.Init();
ErrorHandling(nRet);
*/
uint32_t dwWrProt = 3952;
uint32_t dwRdProt = 3952;
uint32_t dwNumFunc = 40;
uint32_t dwTableLMS = 0;
uint32_t dwGlobalFlags = 0/*GrdGF_HID*/;
printf("Protect: ");
nRet = grdDongle.Protect(dwWrProt, dwRdProt, dwNumFunc, dwTableLMS, dwGlobalFlags);
ErrorHandling(nRet);
Если раскоментировать dwGlobalFlags = GrdGF_HID, то ключ переводится в режим HID без вызова Init.
А вот когда dwGlobalFlags = 0, то глобальные флаги не обнуляются.
Если добавить вызов Init, то флаги и устанавливаются, и обнуляются, но при этом сбрасывается вся остальная память ключа (чего хотелось бы избежать).
Может я чего-то не понимаю на базовом уровне?
Вызов Protect с флагами dwGlobalFlags = 0 проходит без ошибки, но результат контринтуитивен...