Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / CryptoAPI зависает приложение / 5 сообщений из 5, страница 1 из 1
29.01.2013, 22:46
    #38129785
SmilDev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI зависает приложение
Здравствуйте.

кто может натолкнуть на причину проблемы.

есть функция которая вычисляет md5 хэш файла и возвращает его

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
String __fastcall Unit1::getFileMD5(char *filename) {

	HCRYPTHASH hHash;
	HCRYPTPROV hProv;
	BYTE md5hash[16];
	DWORD md5hash_size, dwSize;
	static char str_hash[33];
	int i;
	ZeroMemory(str_hash, sizeof(str_hash));
	ZeroMemory(md5hash, sizeof(md5hash));
	CryptAcquireContext(&hProv, NULL,
		NULL, PROV_RSA_FULL, 0);
	CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);

	FILE *f = fopen(filename, "rb");

	fseek(f, 0, SEEK_END);
	int size = ftell(f);
	int size1 = size;
	int readed = 0;
	while (size1 > 0) {
		int len = 0;
		if (size1 - 50000000 >= 0) {
			len = 50000000;
		}
		else {
			len = size1;
		}
		fseek(f, readed, SEEK_SET);
		fread(buf, 1, len, f);
		size1 -= len;
		readed += len;
		CryptHashData(hHash, buf, len, 0);
	}
	fclose(f);

	dwSize = sizeof(md5hash_size);

	CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*) & md5hash_size, &dwSize, 0);

	CryptGetHashParam(hHash, HP_HASHVAL, md5hash, &md5hash_size, 0);

	CryptDestroyHash(hHash);

	CryptReleaseContext(hProv, 0);

	for (i = 0; i < md5hash_size; i++)
		sprintf(str_hash + 2 * i, "%2.2x", md5hash[i]);

	static char *md5str = str_hash;
	return md5str;
}



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

CryptReleaseContext(hProv, 0);

подскажите куда копать ?
...
Рейтинг: 0 / 0
29.01.2013, 23:01
    #38129795
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI зависает приложение
SmilDev, как у тебя всё работает прекрасно, когда ты не анализируешь булево
значение которое возвращают все эти функции?

CryptAcquireContext
CryptCreateHash
CryptHashData
CryptGetHashParam
CryptDestroyHash
...
Рейтинг: 0 / 0
29.01.2013, 23:52
    #38129858
SmilDev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI зависает приложение
mayton да не анализирую.

добавил проверку на true false + GetLastError()

в результате на проблемном компьютере

при выполнении

CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL,0)

получаю код ошибки 2148073494

на 5-ти других компах (на всех стоит win7 но сборки возможно разные) все работает без ошибок.
...
Рейтинг: 0 / 0
30.01.2013, 00:06
    #38129872
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI зависает приложение
SmilDev, посмотри тут как собирается полная инфа
о версии ОС Windows.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms725487%28v=vs.85%29.aspx

И выясни чем отличается 6-я рабочая станция от 5 нормальных.
Это будет самый простой путь. Дальше - по обстановке.
Переустановить ее нахер или еще что-то сделать.
...
Рейтинг: 0 / 0
30.01.2013, 07:31
    #38130025
mikhail_n
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CryptoAPI зависает приложение
В те давние давние времена, когда по всей стране только только отгремела вой... тьфу, вышел SQL Server 2000, угораздило одного мальчиша-плохиша накатать ESP под тот сервер реализующую MD5 хэш, вот как выглядели первые несколько строк:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
//Acquire a handle to a default MS_ENHANCED_PROV CSP 
if(!CryptAcquireContext( 
&hCryptProv, 
NULL, 
MS_ENHANCED_PROV, 
PROV_RSA_FULL, 
0)) 
{ 
//if CSP container does not exist, it has to be created 
if(!CryptAcquireContext( 
&hCryptProv, 
NULL, 
MS_ENHANCED_PROV, 
PROV_RSA_FULL, 
CRYPT_NEWKEYSET)) 
{ 
printError(pSrvProc, "Failed to create a default container for MS_ENHANCED_PROV CSP."); 
RetCode = XP_ERROR; 
goto GARBAGE_COLLECTOR; 
}
} 



Мораль - а кто вам сказал что на любом вынь компе всегда найдётся дефолтный безъимянный CSP нужного вам типа?
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / CryptoAPI зависает приложение / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]