//---------------------------------------------------------------------------

#pragma hdrstop

#include <windows.h>
#include <wincrypt.h>
#define PP_ENUM_CNT_PRIV_KEYS   45
#define CNT_STATE_WAIT  1
#define PP_CNT_DEL_SN           49
typedef struct _CNT_PRIVATE_KEY {
 HCRYPTKEY hKey;
 ALG_ID    algID;
 BOOL      exp;
 DWORD     state;
 CHAR     *szOID;
 CHAR     *createTime;
 DATA_BLOB serialNum;
 DATA_BLOB publicKey;
 CERT_BLOB certificate;
} CNT_PRIVATE_KEY;

#pragma argsused
int main(int argc, char* argv[])
{
	HCRYPTPROV hProv=0;
	HCRYPTPROV hProv2=0;
	BOOL rv;
	CNT_PRIVATE_KEY *pk=NULL;
	DWORD len;
	int key_count=0;
	DWORD ret=0;
	try
	{
		try
		{
				if (!CryptAcquireContext(&hProv,"profile://test","Tumar CSP",25,NULL)) throw GetLastError();
                                 // получаем количество закрытых ключей в контейнере
				if (!CryptGetProvParam(hProv,PP_ENUM_CNT_PRIV_KEYS,NULL,&len,CRYPT_FIRST)) throw GetLastError();
				while(rv)
				{
						key_count++;
						rv=CryptGetProvParam(hProv,PP_ENUM_CNT_PRIV_KEYS,NULL,&len,0);
				}
				if (!key_count) throw 1;
				pk=(CNT_PRIVATE_KEY*) calloc(key_count,sizeof(CNT_PRIVATE_KEY));
				key_count=0;
				len=sizeof(CNT_PRIVATE_KEY);
                                // перечитываем все закрытые ключи в контейнере
				rv=CryptGetProvParam(hProv,PP_ENUM_CNT_PRIV_KEYS,(BYTE*)&pk[0],&len,CRYPT_FIRST);
				while(rv)
				{
						key_count++;
						rv=CryptGetProvParam(hProv,PP_ENUM_CNT_PRIV_KEYS,(BYTE*)&pk[key_count],&len,0);
				}

                                //удаляем все ключи, имеющие статус WAIT ("Новые")
				if (!CryptAcquireContext(&hProv2,"profile://test","Tumar CSP",25,NULL)) throw GetLastError();
				for(int i=0;i<key_count;i++)
				{
						if (pk[i].state==CNT_STATE_WAIT)
								CryptSetProvParam(hProv2,PP_CNT_DEL_SN,pk[i].serialNum.pbData,0);
				}

		}
		catch(DWORD err)
		{
			  ret=err;
		}
		catch(int err)
		{
				ret=err;
		}
	}
	__finally
	{
			if(hProv) CryptReleaseContext(hProv,0);
			if (hProv2)  CryptReleaseContext(hProv,0);
			if (pk) free(pk);
	}
	return ret;
}
//---------------------------------------------------------------------------
 