Доступ к ключам через AnywhereUSB
Добрый день.
Имеется приложение, работающее с ключами Guardant Time. По ряду причин приложение необходимо запускать на виртуальной машине под HyperV. Т.к. HyperV не поддерживает проброску портов USB, то решено было использовать решение AnywhereUSB (проброска портов USB через сеть).
При подключении ключа к хабу AnywhereUSB ключ в системе обнаруживается, утилиты "Диагностика ключей" и "Программирование ключей" ключ находят без проблем и работают с ним так же, как если бы ключ был подключен к реальному порту. Однако нашей программы, нормально работающий с ключами подключенными к реальным портам, не находит ключ, подключенный через AnywhereUSB.
Пример кода
[TestMethod]
public void Guardant_TestNative()
{
uint publicCode = ###;
uint readCode = ###;
uint writeCode = ###;
uint masterCode = ###;
uint programNumber = 0;
uint versionNumber = 1;
var retCode = GrdApi.GrdStartup(GrdFMR.Local);
HandleResult(retCode);
Handle hGrd = new Handle();
hGrd = GrdApi.GrdCreateHandle(hGrd, GrdCHM.MultiThread);
if (hGrd.Address == 0) // Some error found?
HandleResult(GrdE.MemoryAllocation);
retCode = GrdApi.GrdSetAccessCodes(hGrd, publicCode, readCode, writeCode, masterCode);
HandleResult(retCode);
retCode = GrdApi.GrdSetFindMode(hGrd,
GrdFMR.Local,// Local dongles only
GrdFM.NProg | GrdFM.Ver | GrdFM.Type,// Check by bVer & dongle type flag
programNumber,// check by specified program number
0, // Don't check by dongle id
0, // Don't check by serial
versionNumber, // check by version
0, // Don't check by bit mask
GrdDT.GSII64, // Dongle that supports GSII64 algorithm
GrdFMM.ALL, // Guardant Stealth III dongle
GrdFMI.ALL);
HandleResult(retCode);
uint id;
FindInfo info;
retCode = GrdApi.GrdFind(hGrd, GrdF.First, out id, out info);
HandleResult(retCode);
int LMS = -1; // don't use license management system
retCode = GrdApi.GrdLogin(hGrd, LMS, GrdLM.PerStation);
HandleResult(retCode);
retCode = GrdApi.GrdCloseHandle(hGrd);
HandleResult(retCode);
}
private void HandleResult(GrdE nRet)
{
if (nRet != GrdE.OK)
throw new Exception(string.Format("{0}:{1}",nRet, GrdApi.PrintResult((int)nRet)));
}
Вызов GrdApi.GrdFind возаращает AllDonglesFound.
Однако улилита диагностики говорит, что поиск проходит успешно. Результат работы утилиты "Диагностика ключей Guardant":
Диагностика установленных ключей Guardant 17.06.2011 10:26:12
Модель Guardant Time USB
Идентификационный номер ##########
Коды доступа ENRAUPD
Дата и время выпуска 03 Apr 2009 13:19:18
Поддержка Windows, GSII64, PI, TRU, RTC, AES, ECC
Время в ключе (в момент поиска) 17 Jun 2011 10:26:08
Создание дескриптора ключа (GrdCreateHandle) Успешно
Установка режима поиска ключа (GrdSetFindMode) Успешно
Поиск ключа (GrdFind) Успешно
Установка кодов доступа (GrdSetAccessCodes) Успешно
Подключение к ключу (GrdLogin) Успешно
Считывание таблицы LMS (GrdPI_Read/GrdRead) Для данного алгоритма/ячейки
не предусмотрен данный вид сервиса
Проверка ключа (GrdCheck) Успешно
Блокирование ключа (GrdLock) Успешно
Чтение данных из ключа (GrdRead) Успешно
Разблокирование ключа (GrdUnlock) Успешно
Освобождение ключа (GrdLogout) Успешно
Удаление дескриптора ключа (GrdCloseHandle) Успешно
Подскажите пожалуйста, как необходимо изменить код, чтобы поддержить работу через AnywhereUSB?