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

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

есть функция которая вычисляет 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
CryptoAPI зависает приложение
    #38129795
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SmilDev, как у тебя всё работает прекрасно, когда ты не анализируешь булево
значение которое возвращают все эти функции?

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

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

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

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

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

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

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

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

И выясни чем отличается 6-я рабочая станция от 5 нормальных.
Это будет самый простой путь. Дальше - по обстановке.
Переустановить ее нахер или еще что-то сделать.
...
Рейтинг: 0 / 0
CryptoAPI зависает приложение
    #38130025
mikhail_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В те давние давние времена, когда по всей стране только только отгремела вой... тьфу, вышел 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
5 сообщений из 5, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / CryptoAPI зависает приложение
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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