CryptoAPI函数测试实例代码(三)
rror();
_stprintf( szErrInfo, _T("CertAddCertificateContextToStore FAILED, Error Code: 0x%X "), dwError );
}
break;
}
nRet = true;
}
while(0);
if( pCertContex )
CertFreeCertificateContext( pCertContex );
if( hCryptProv )
CryptReleaseContext( hCryptProv, 0 );
if( hCertStoreToWhere )
CertCloseStore( hCertStoreToWhere, 0 );
if( hCertStore )
CertCloseStore(hCertStore, 0);
return nRet;
}
//
// 函数: bool RemoveCert( TCHAR* szSubject, TCHAR* szIssuer, WCHAR* wcsRemoveFromWhere, TCHAR* szErrInfo = NULL )
//
// 目的: 从系统中wcsImportToWhere指定区域删除一张证书,要求符合主题和颁发者
//
// 参数
// szSubject
// [in]: 要删除的证书的主题
// szIssuer
// [in]: 要删除的证书的颁发者
// wcsImportToWhere
// [in]: L"MY", L"CA", L"ROOT"
// szErrInfo
// [out]: 如果错误,返回错误信息
//
// 返回: 成功返回true,失败返回false
//
bool RemoveCert( TCHAR* szSubject, TCHAR* szIssuer, WCHAR* wcsRemoveFromWhere, TCHAR* szErrInfo )
{
bool bRet = false;
HCERTSTORE hCertStore = NULL;
PCCERT_CONTEXT pCCertContext = NULL;
do
{
hCertStore = ::CertOpenStore(CERT_STORE_PROV_SYSTEM_W, 0, NULL,
CERT_SYSTEM_STORE_CURRENT_USER | CERT_STORE_OPEN_EXISTING_FLAG, wcsRemoveFromWhere );
if( NULL == hCertStore )
{
if( NULL != szErrInfo )
{
_tcscpy( szErrInfo, _T("CertOpenStoren Failed") );
}
break;
}
do
{
pCCertContext = ::CertEnumCertificatesInStore( hCertStore, pCCertContext );
if( NULL == pCCertContext )
{
if( NULL != szErrInfo )
{
DWORD dwErrCode = ::GetLastError();
_stprintf( szErrInfo, _T("CertFindCertificateInStore FAILED, Error Code: 0x%d "), dwErrCode );
}
break;
}
else
{
// 获取证书主题和颁发者
CBuffer subjectB
uf;
CBuffer issuerBuf;
DWORD dwSize = ::CertGetNameString( pCCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0/*CERT_NAME_ISSUER_FLAG*/, NULL, NULL, 0 );
subjectBuf.malloc( dwSize );
dwSize = ::CertGetNameString( pCCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0/*CERT_NAME_ISSUER_FLAG*/, NULL, subjectBuf, dwSize );
dwSize = ::CertGetNameString( pCCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, CERT_NAME_ISSUER_FLAG, NULL, NULL, 0 );
issuerBuf.malloc( dwSize );
dwSize = ::CertGetNameString( pCCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, CERT_NAME_ISSUER_FLAG, NULL, issuerBuf, dwSize );
if( 0 == _tcscmp( (TCHAR*)subjectBuf, szSubject ) &&
0 == _tcscmp( (TCHAR*)issuerBuf, szIssuer ))
{
// 在这里开一个线程来由程序点击“是”那个按钮
if( 0 == wcscmp( L"ROOT", wcsRemoveFromWhere ) )
{
CreateThread( NULL, 0, RemoveRootCertAutoClickProc, 0, 0, 0 );
}
if( FALSE == ::CertDeleteCertificateFromStore( pCCertContext ) )
{
if( NULL != szErrInfo )
{
DWORD dwErrCode = ::GetLastError();
_stprintf( szErrInfo, _T("CertDeleteCertificateFromStore FAILED, Error Code: 0x% "), dwErrCode );
}
}
break;
}
}
}
while( true );
bRet = true;
}
while(false);
if( pCCertContext )
CertFreeCertificateContext( pCCertContext );
if( hCertStore )
::CertCloseStore( hCertStore, 0 );
return bRet;
}
//
// 函数:bool ImportDerCert( TCHAR* szCertPath, WCHAR* wcsImportToWhere, TCHAR* szErrInfo = NULL )
//
// 目的:导入一张Der证书到IE中的区域
//
// 参数:
// wcsImportToWhere
// [in] L"MY", L"CA",
//
bool ImportDerCert( TCHAR* szCertPath, WCHAR* wcsImportToWhere, TCHAR* szErrInfo )
{
bool bRet = false;
HCERTSTORE hCertStore = NULL;
PCCERT_CONTEXT lpCertContext = NULL;