Ключевое слово в защите информации
ключевое слово
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход. Новые регистрации запрещены.

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline acoder  
#1 Оставлено : 22 февраля 2012 г. 20:31:03(UTC)
acoder

Статус: Участник

Группы: Участники
Зарегистрирован: 20.02.2012(UTC)
Сообщений: 15
Откуда: Msc

Я использую CryptGetProvParam(hProv, PP_ENUMCONTAINERS, data, &dataLen, flags) для перечисления контейнеров. Почему-то контейнеры, находящиеся на эмулируемом съемном носителе в перечисление не попадают.
В окне CSP Выбор ключевого контейнера отображаются все контейнеры, даже те, которые записаны на виртуальный носитель.
Как перечислить ВСЕ контейнеры с помощью API?

Отредактировано пользователем 22 февраля 2012 г. 20:46:29(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#2 Оставлено : 22 февраля 2012 г. 22:31:45(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,457
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 39 раз
Поблагодарили: 750 раз в 645 постах
Приведите код цикла перебора.
Важная особенность перечисления контейнеров - выделение памяти один раз перед первым вызовом (только CRYPT_FIRST вызывается дважды)
Знания в базе знаний, поддержка в центре поддержки
Offline acoder  
#3 Оставлено : 23 февраля 2012 г. 14:11:16(UTC)
acoder

Статус: Участник

Группы: Участники
Зарегистрирован: 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;
}
Offline Андрей Писарев  
#4 Оставлено : 23 февраля 2012 г. 14:25:23(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#5 Оставлено : 23 февраля 2012 г. 14:29:32(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,190
Мужчина
Российская Федерация

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
вот ... http://msdn.microsoft.co...us/library/ms938119.aspx

пример внизу

Отредактировано пользователем 23 февраля 2012 г. 14:38:32(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#6 Оставлено : 23 февраля 2012 г. 14:38:15(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 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);
	}
Техническую поддержку оказываем тут
Наша база знаний
Offline acoder  
#7 Оставлено : 23 февраля 2012 г. 15:22:22(UTC)
acoder

Статус: Участник

Группы: Участники
Зарегистрирован: 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 дают остальные контейнеры.

Похоже тут дело не в цикле.
Offline Андрей Писарев  
#8 Оставлено : 23 февраля 2012 г. 15:26:54(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,190
Мужчина
Российская Федерация

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
FIRST
FIRST
NEXT
Техническую поддержку оказываем тут
Наша база знаний
Offline acoder  
#9 Оставлено : 23 февраля 2012 г. 15:44:39(UTC)
acoder

Статус: Участник

Группы: Участники
Зарегистрирован: 20.02.2012(UTC)
Сообщений: 15
Откуда: Msc

я так и делаю
в чем еще может быть проблема?
Offline Андрей Писарев  
#10 Оставлено : 23 февраля 2012 г. 15:59:27(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,190
Мужчина
Российская Федерация

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
acoder написал:
я так и делаю
в чем еще может быть проблема?


Think

у меня работает...
заодно узнал... что 64 контейнера уже

Отредактировано пользователем 23 февраля 2012 г. 16:07:09(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (3)
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.