КриптоПро CSP, версия ядра СКЗИ: 3.6.5359 КС1, версия продукта: 3.6.6497
#include "stdafx.h"
#include <windows.h>
#include <wincrypt.h>
#include <stdio.h>
#include <process.h>
BOOL fRepeat;
HCERTSTORE CertificateStore;
PCCERT_CONTEXT CertificateContext;
void TestThread( void *arg )
{
HCRYPTPROV CryptoProvider;
BOOL isGetCryptoProvider=FALSE;
DWORD TypeKey;
BOOL b;
CryptoProvider=0;
isGetCryptoProvider = CryptAcquireCertificatePrivateKey(CertificateContext, 0, NULL, &CryptoProvider, &TypeKey, &b);
if(!isGetCryptoProvider)
{
printf( "CryptAcquireCertificatePrivateKey\n" );
exit(1);
}
if( isGetCryptoProvider )
{
b = CryptReleaseContext( CryptoProvider, 0 );
if( !b )
{
printf( "CryptReleaseContext\n" );
exit(1);
}
}
fRepeat = FALSE;
_endthread();
}
int _tmain(int argc, _TCHAR* argv[])
{
CertificateStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, NULL, CERT_SYSTEM_STORE_CURRENT_USER, L"MY");
CertificateContext = CertFindCertificateInStore(CertificateStore, PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, 0,
CERT_FIND_SUBJECT_STR_A, "testcert", NULL);
while( 1 )
{
fRepeat=TRUE;
_beginthread( TestThread, 0, (void*)NULL);
while( fRepeat ) Sleep(1L);
}
CertFreeCertificateContext(CertificateContext);
CertCloseStore(CertificateStore,CERT_CLOSE_STORE_FORCE_FLAG);
}
Запускаем такую программу. В хранилище MY должен быть установлен сертификат testcert с контейнером закрытого ключа в реестре. Или, другой, имя сертификата ничего не меняет, поправьте параметр в вызове функции CertFindCertificateInStore.
Почему процесс непрерывно потребляет всё больше и больше оперативной памяти?
Причём же здесь КриптоПро?! могут спросить некоторые форумчане...:) Специально, для таких сомневающихся
#include "stdafx.h"
#include <windows.h>
#include <wincrypt.h>
#include <stdio.h>
#include <process.h>
BOOL fRepeat;
void TestThread( void *arg )
{
HCRYPTPROV CryptoProvider;
BOOL isGetCryptoProvider=FALSE;
BOOL b;
CryptoProvider=0;
isGetCryptoProvider=CryptAcquireContext(&CryptoProvider,_T("REGISTRY\\\\b103fffa-551e-42ee-8f4b-873e624953b6"),_T("Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider"),75,0);
if(!isGetCryptoProvider)
{
printf( "CryptAcquireCertificatePrivateKey\n" );
exit(1);
}
if( isGetCryptoProvider )
{
b = CryptReleaseContext( CryptoProvider, 0 );
if( !b )
{
printf( "CryptReleaseContext\n" );
exit(1);
}
}
fRepeat = FALSE;
_endthread();
}
int _tmain(int argc, _TCHAR* argv[])
{
while( 1 )
{
fRepeat=TRUE;
_beginthread( TestThread, 0, (void*)NULL);
while( fRepeat ) Sleep(1L);
}
}
Поправьте второй параметр в вызове функции CryptAcquireContext, установив его в имя контейнера закрытого ключа. Его можно посмотреть в Пуск/Панель управления/КриптоПро CSP/Сервис/Протестировать, поищите там по имени сертификата.
Результаты аналогичны, процесс растёт...
Если поток не перезапускать в функции main, зациклить получение/освобождение контекста криптопровайдера в одном потоке, утечки не наблюдается.
Тесты запускались на следующих продуктах Microsoft в реальном и/или виртуальном(VMWare)окружении:
Windows XP SP3 32-bit
Windows Server 2003 SP2 32-bit
Windows Server 2008 SP2 32-bit
Windows Server 2003 SP2 64-bit
Windows Server 2008 SP1 64-bit
Поведение теста аналогично на всех системах.
Любые идеи...