Статус: Участник
Группы: Участники
Зарегистрирован: 20.02.2012(UTC) Сообщений: 15 Откуда: Msc
|
Я использую CryptGetProvParam(hProv, PP_ENUMCONTAINERS, data, &dataLen, flags) для перечисления контейнеров. Почему-то контейнеры, находящиеся на эмулируемом съемном носителе в перечисление не попадают. В окне CSP Выбор ключевого контейнера отображаются все контейнеры, даже те, которые записаны на виртуальный носитель. Как перечислить ВСЕ контейнеры с помощью API? Отредактировано пользователем 22 февраля 2012 г. 20:46:29(UTC)
| Причина: Не указана
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,457  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 39 раз Поблагодарили: 750 раз в 645 постах
|
Приведите код цикла перебора. Важная особенность перечисления контейнеров - выделение памяти один раз перед первым вызовом (только CRYPT_FIRST вызывается дважды) |
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 20.02.2012(UTC) Сообщений: 15 Откуда: Msc
|
Код:
BOOL EnumContainers(HCRYPTPROV hProv)
{
BOOL result = TRUE;
DWORD dwFlags = CRYPT_FIRST;
DWORD dwDataLen = 1024;
PBYTE data = new BYTE[dwDataLen];
for(;;)
{
if(!::CryptGetProvParam(hProv, PP_ENUMCONTAINERS, data, &dwDataLen, dwFlags))
{
if(GetLastError() == ERROR_NO_MORE_ITEMS)
{
break;
}
else
{
result = FALSE;
break;
}
}
dwFlags = CRYPT_NEXT;
LPCWSTR text = getText(data,dwDataLen);
::OutputDebugString(text);
::OutputDebugString(L"\n");
delete text;
}
delete data;
return result;
}
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 14,190   Сказал «Спасибо»: 621 раз Поблагодарили: 2397 раз в 1886 постах
|
acoder написал:Код:
BOOL EnumContainers(HCRYPTPROV hProv)
{
BOOL result = TRUE;
DWORD dwFlags = CRYPT_FIRST;
DWORD dwDataLen = 1024;
PBYTE data = new BYTE[dwDataLen];
for(;;)
{
if(!::CryptGetProvParam(hProv, PP_ENUMCONTAINERS, data, &dwDataLen, dwFlags))
{
if(GetLastError() == ERROR_NO_MORE_ITEMS)
{
break;
}
else
{
result = FALSE;
break;
}
}
dwFlags = CRYPT_NEXT;
LPCWSTR text = getText(data,dwDataLen);
::OutputDebugString(text);
::OutputDebugString(L"\n");
delete text;
}
delete data;
return result;
}
нужно добавить первый вызов Flag = CRYPT_FIRST; CryptGetProvParam(hProv, PP_ENUMCONTAINERS, nil, DataLen, Flag) а потом в цикле... попробуй... Отредактировано пользователем 23 февраля 2012 г. 14:26:20(UTC)
| Причина: Не указана |
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 14,190   Сказал «Спасибо»: 621 раз Поблагодарили: 2397 раз в 1886 постах
|
|
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 14,190   Сказал «Спасибо»: 621 раз Поблагодарили: 2397 раз в 1886 постах
|
http://www.ureader.com/msg/16591711.aspxКод:CHAR szTemp[5000] = {};
DWORD dwSize = 5000;
bRet = CryptGetProvParam( hProv, PP_ENUMCONTAINERS, (BYTE*)szTemp,
&dwSize, CRYPT_FIRST);
OutputDebugString(szTemp);
while( CryptGetProvParam( hProv, PP_ENUMCONTAINERS, (BYTE*)szTemp,
&dwSize, 0) == TRUE)
{
OutputDebugString(szTemp);
}
|
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 20.02.2012(UTC) Сообщений: 15 Откуда: Msc
|
Приведенный цикл выдает на один контейнер меньше. Насколько я понял из описания PP_ENUMCONTAINERS, схема перебора должна быть такая Код:BOOL result = TRUE;
DWORD dwFlags = CRYPT_FIRST;
DWORD dwDataLen = 0;
CryptGetProvParam(hProv, PP_ENUMCONTAINERS, NULL, &dwDataLen, dwFlags);
PBYTE data = new BYTE[dwDataLen];
for(;;)
{
if(!CryptGetProvParam(hProv, PP_ENUMCONTAINERS, data, &dwDataLen, dwFlags))
{
if(GetLastError() == ERROR_NO_MORE_ITEMS)
{
break;
}
else
{
result = FALSE;
break;
}
}
dwFlags = CRYPT_NEXT;
}
Первый вызов CryptGetProvParam вне цикла дает максимально возможный размер данных (что бы не выделять с большим запасом CHAR szTemp[5000]). Второй вызов CryptGetProvParam уже в цикле (все еще с CRYPT_FIRST) дает первый контейнер. Последующие вызовы с CRYPT_NEXT или 0 дают остальные контейнеры. Похоже тут дело не в цикле.
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 14,190   Сказал «Спасибо»: 621 раз Поблагодарили: 2397 раз в 1886 постах
|
|
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 20.02.2012(UTC) Сообщений: 15 Откуда: Msc
|
я так и делаю в чем еще может быть проблема?
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 14,190   Сказал «Спасибо»: 621 раз Поблагодарили: 2397 раз в 1886 постах
|
acoder написал:я так и делаю в чем еще может быть проблема? у меня работает... заодно узнал... что 64 контейнера уже Отредактировано пользователем 23 февраля 2012 г. 16:07:09(UTC)
| Причина: Не указана |
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close