📄 usbkeypnpactivexctl.cpp
字号:
if(rv)
{
ErrMsg.Format("读取密码卡序列号出错,请检查智能卡内是否有BJCA颁发的证书!");
TRACE(ErrMsg);
FreeLibrary(CSPDSO_Handler);
return FALSE;
}
TRACE("CloseCard ...\n");
rv = CloseCard(hKey);
if(rv)
{
ErrMsg.Format("关闭智能卡出错");
TRACE(ErrMsg);
}
else
TRACE("CloseCard OK.\n");
FreeLibrary(CSPDSO_Handler);
if(hDlgHandle != NULL)
{
pProMsg = (PROGRESSMSG_PTR)malloc(sizeof(PROGRESSMSG));
memset(pProMsg,0,sizeof(PROGRESSMSG));
pProMsg->pos = 50;
strcpy(pProMsg->msg,"正在读取证书...");
::PostMessage(hDlgHandle,WM_USER+2,NULL,(long)pProMsg);
}
TRACE("BCA_Initialize...CSP:%s\n",CSPProvider);
rv = BCA_Initialize(BCA_PROVIDER_CSP,
CSPProvider.GetBuffer(0),
1,
Dllpri.GetBuffer(0));
if(rv)
{
ErrMsg.Format("初始化智能卡CSP出错");
return FALSE;
}
TRACE("BCA_Initialize. ok\n");
unsigned char cert[4096];
unsigned long certLen;
TRACE("BCA_GetUsrCertificate[keytype=1]...conname= %s\n",conname);
rv = BCA_GetUsrCertificate(conname,connameLen,1,cert,&certLen);
if(rv)
{
ErrMsg.Format("读取证书出错!");
BCA_Finalize();
return FALSE;
}
TRACE("BCA_GetUsrCertificate[keytype=1] OK.\n");
keytype = 1;
unsigned char signcert[4096];
unsigned long signcertLen;
rv = BCA_GetUsrCertificate(conname,connameLen,2,signcert,&signcertLen);
if(rv == 0)
keytype = 2;
char issueName[1024]={0};
DWORD infoLen;
if(hDlgHandle != NULL)
{
pProMsg = (PROGRESSMSG_PTR)malloc(sizeof(PROGRESSMSG));
memset(pProMsg,0,sizeof(PROGRESSMSG));
pProMsg->pos = 80;
strcpy(pProMsg->msg,"正在解析证书...");
::PostMessage(hDlgHandle,WM_USER+2,NULL,(long)pProMsg);
}
TRACE("BCA_GetCertificateInfo 8...\n");
rv = BCA_GetCertificateInfo(cert,certLen,8,issueName,&infoLen);
if(rv)
{
ErrMsg.Format("解析证书颁发者出错!");
BCA_Finalize();
return FALSE;
}
TRACE("BCA_GetCertificateInfo OK\n");
char subjectname[1024]={0};
TRACE("BCA_GetCertificateInfo 17...\n");
rv = BCA_GetCertificateInfo(cert,certLen,17,subjectname,&infoLen);
if(rv)
{
ErrMsg.Format("解析证书主题出错!");
BCA_Finalize();
return FALSE;
}
TRACE("BCA_GetCertificateInfo OK\n");
subjectname[infoLen] = '\0';
sConName = conname;
sSubjectName = subjectname;
sIssueName = issueName;
BCA_Finalize();
if(hDlgHandle != NULL)
{
pProMsg = (PROGRESSMSG_PTR)malloc(sizeof(PROGRESSMSG));
memset(pProMsg,0,sizeof(PROGRESSMSG));
pProMsg->pos = 95;
strcpy(pProMsg->msg,"解析证书成功.");
::PostMessage(hDlgHandle,WM_USER+2,NULL,(long)pProMsg);
}
TRACE("ReadUSBKeyCert Success\n");
return TRUE;
}
BOOL ReadUSBKeyCert_Ex(CString CSPProvider,
CString Dllpri,
CString &sConName,
CString &sSubjectName,
CString &sIssueName,
CString &ErrMsg,
int &keytype,
HWND hDlgHandle)
{
int rv;
OpenCardFptr OpenCard;
CloseCardFptr CloseCard;
BjcaKeyReadDataFptr BjcaKeyReadData;
GetCardCountFptr GetCardCount;
OpenCardByIndexFptr OpenCardByIndex;
HINSTANCE CSPDSO_Handler=0L;
unsigned char conname[1024]={0};
unsigned long connameLen;
HANDLE hKey;
PROGRESSMSG_PTR pProMsg;
CSPDSO_Handler = LoadLibrary(Dllpri.GetBuffer(0));
if(CSPDSO_Handler == NULL)
{
ErrMsg.Format("加载文件\"%s\"错误,智能卡相关文件未正确安装!");
return FALSE;
}
TRACE("开始加载私有接口dll:%s\n",Dllpri);
OpenCard = (OpenCardFptr)GetProcAddress(CSPDSO_Handler,"OpenCard");
CloseCard = (CloseCardFptr)GetProcAddress(CSPDSO_Handler,"CloseCard");
BjcaKeyReadData = (BjcaKeyReadDataFptr)GetProcAddress(CSPDSO_Handler,"BjcaKeyReadData");
GetCardCount = (GetCardCountFptr)GetProcAddress(CSPDSO_Handler,"GetCardCount");
OpenCardByIndex = (OpenCardByIndexFptr)GetProcAddress(CSPDSO_Handler,"OpenCardByIndex");
if( (OpenCard==NULL) ||(CloseCard==NULL) ||(BjcaKeyReadData==NULL))
{
ErrMsg = " GetProcAddress Err!";
FreeLibrary(CSPDSO_Handler);
return FALSE;
}
if((GetCardCount == NULL)||(OpenCardByIndex==NULL))
{
ErrMsg = " OpenCardByIndex GetProcAddress Err!";
FreeLibrary(CSPDSO_Handler);
return FALSE;
}
TRACE("OpenCard...\n");
DWORD dwCardCount = 0;
rv = GetCardCount(&dwCardCount);
if(dwCardCount == 0)
{
Sleep(2000);
rv = GetCardCount(&dwCardCount);
}
for(int i=0;i<dwCardCount;i++)
{
rv = OpenCardByIndex(&hKey,i);
if(rv)
{
if(rv == 0x20000002 )//USBKEY_KEY_REMOVED
{
TRACE("OpenCard Err.Sleep 2\'\n");
Sleep(2000);
rv = OpenCard(&hKey);
}
if(rv)
{
ErrMsg.Format("打开智能卡失败!");
TRACE(ErrMsg);
FreeLibrary(CSPDSO_Handler);
if(hDlgHandle != NULL)
{
pProMsg = (PROGRESSMSG_PTR)malloc(sizeof(PROGRESSMSG));
memset(pProMsg,0,sizeof(PROGRESSMSG));
pProMsg->pos = 20;
strcpy(pProMsg->msg,ErrMsg.GetBuffer(0));
::PostMessage(hDlgHandle,WM_USER+2,NULL,(long)pProMsg);
}
return FALSE;
}
}
if(hDlgHandle != NULL)
{
pProMsg = (PROGRESSMSG_PTR)malloc(sizeof(PROGRESSMSG));
memset(pProMsg,0,sizeof(PROGRESSMSG));
pProMsg->pos = 30;
strcpy(pProMsg->msg,"正在读取密码卡序列号");
::PostMessage(hDlgHandle,WM_USER+2,NULL,(long)pProMsg);
}
TRACE("BjcaKeyReadData ...\n");
connameLen = 0;
TRACE("hKey=%ld\n",hKey);
rv = BjcaKeyReadData(hKey,(unsigned char *)"BJCAENVSN",strlen("BJCAENVSN"),NULL,&connameLen);
if((rv) ||(connameLen==0))
{
#ifdef _DEBUG
ErrMsg.Format("读取密码卡序列号失败,请检查智能卡内是否有BJCA颁发的证书!错误码:0x%x",rv);
#else
ErrMsg.Format("读取密码卡序列号失败,请检查智能卡内是否有BJCA颁发的证书!");
#endif
TRACE(ErrMsg);
FreeLibrary(CSPDSO_Handler);
return FALSE;
}
rv = BjcaKeyReadData(hKey,(unsigned char *)"BJCAENVSN",strlen("BJCAENVSN"),conname,&connameLen);
if(rv)
{
ErrMsg.Format("读取密码卡序列号出错,请检查智能卡内是否有BJCA颁发的证书!");
TRACE(ErrMsg);
FreeLibrary(CSPDSO_Handler);
return FALSE;
}
TRACE("CloseCard ...\n");
rv = CloseCard(hKey);
if(rv)
{
ErrMsg.Format("关闭智能卡出错");
TRACE(ErrMsg);
}
else
TRACE("CloseCard OK.\n");
if(hDlgHandle != NULL)
{
pProMsg = (PROGRESSMSG_PTR)malloc(sizeof(PROGRESSMSG));
memset(pProMsg,0,sizeof(PROGRESSMSG));
pProMsg->pos = 50;
strcpy(pProMsg->msg,"正在读取证书...");
::PostMessage(hDlgHandle,WM_USER+2,NULL,(long)pProMsg);
}
TRACE("BCA_Initialize...CSP:%s\n",CSPProvider);
rv = BCA_Initialize(BCA_PROVIDER_CSP,
CSPProvider.GetBuffer(0),
1,
Dllpri.GetBuffer(0));
if(rv)
{
ErrMsg.Format("初始化智能卡CSP出错");
return FALSE;
}
TRACE("BCA_Initialize. ok\n");
unsigned char cert[4096];
unsigned long certLen;
TRACE("BCA_GetUsrCertificate[keytype=1]...conname= %s\n",conname);
rv = BCA_GetUsrCertificate(conname,connameLen,1,cert,&certLen);
if(rv)
{
ErrMsg.Format("读取证书出错!");
BCA_Finalize();
return FALSE;
}
TRACE("BCA_GetUsrCertificate[keytype=1] OK.\n");
keytype = 1;
unsigned char signcert[4096];
unsigned long signcertLen;
rv = BCA_GetUsrCertificate(conname,connameLen,2,signcert,&signcertLen);
if(rv == 0)
keytype = 2;
char issueName[1024]={0};
DWORD infoLen;
if(hDlgHandle != NULL)
{
pProMsg = (PROGRESSMSG_PTR)malloc(sizeof(PROGRESSMSG));
memset(pProMsg,0,sizeof(PROGRESSMSG));
pProMsg->pos = 80;
strcpy(pProMsg->msg,"正在解析证书...");
::PostMessage(hDlgHandle,WM_USER+2,NULL,(long)pProMsg);
}
TRACE("BCA_GetCertificateInfo 8...\n");
rv = BCA_GetCertificateInfo(cert,certLen,8,issueName,&infoLen);
if(rv)
{
ErrMsg.Format("解析证书颁发者出错!");
BCA_Finalize();
return FALSE;
}
TRACE("BCA_GetCertificateInfo OK\n");
char subjectname[1024]={0};
TRACE("BCA_GetCertificateInfo 17...\n");
rv = BCA_GetCertificateInfo(cert,certLen,17,subjectname,&infoLen);
if(rv)
{
ErrMsg.Format("解析证书主题出错!");
BCA_Finalize();
return FALSE;
}
TRACE("BCA_GetCertificateInfo OK\n");
subjectname[infoLen] = '\0';
sConName = conname;
sSubjectName = subjectname;
sIssueName = issueName;
BCA_Finalize();
if(hDlgHandle != NULL)
{
pProMsg = (PROGRESSMSG_PTR)malloc(sizeof(PROGRESSMSG));
memset(pProMsg,0,sizeof(PROGRESSMSG));
pProMsg->pos = 95;
strcpy(pProMsg->msg,"解析证书成功.");
::PostMessage(hDlgHandle,WM_USER+2,NULL,(long)pProMsg);
}
}
FreeLibrary(CSPDSO_Handler);
TRACE("ReadUSBKeyCert Success\n");
return TRUE;
}
void CUSBKeyPnPActiveXCtrl::ProgressShowFunc(char *msg,int percent)
{
pProgressDlg.SetTipInfor(msg);
pProgressDlg.SetProgress(percent);
}
void CUSBKeyPnPActiveXCtrl::Pthread_ReadCruUSBKeyCert(void *handle)
{
//CUSBKEYActiveXCtrl *crl = (CUSBKEYActiveXCtrl *)handle;
DEBUGMSG("Pthread_ReadCruUSBKeyCert Begin");
HWND hDlgHandle = (HWND)handle;
CString Msg;
int i;
CString CSPProvider;
CString Dllpri;
CString sConName;
CString sSubjectName;
CString sIssueName;
CString ErrMsg;
PROGRESSMSG_PTR pProMsg;
i = g_bjcakey_index;
try
{
EnterCriticalSection(&g_cs);
}
catch (...)
{
//AfxMessageBox("EnterCriticalSection 异常");
InitializeCriticalSection(&g_cs);
EnterCriticalSection(&g_cs);
//return;
}
//判断当前进程其他线程已经读取该usbkey完毕
if(g_bjcakeycallway_suport[i].isExist)
{
for(int j=0;j<MAX_CERT_COUNT;j++)
{
if( (g_AllCertInfo[j].isValide)&&(g_AllCertInfo[j].bjcakeycallway_index==i))
{
::PostMessage(hDlgHandle,WM_USER+1,NULL,NULL);//发送消息,更新列表
return;
}
}
}
DEBUGMSG("ShowWindow...\n");
//pProgressDlg.ShowWindow(SW_SHOW);
::PostMessage(hDlgHandle,WM_USER+2,SW_SHOW,NULL);
DEBUGMSG("Pthread_ReadCruUSBKeyCert...\n");
if(g_bjcakeycallway_suport[i].isExist)
{
//判断当前进程其他线程已经读取该usbkey完毕
CSPProvider = g_bjcakeycallway_suport[i].CSPProvider;
Dllpri = g_bjcakeycallway_suport[i].Dllpri;
Msg.Format("正在打开%s智能卡",g_bjcakeycallway_suport[i].KeyName);
/* pProgressDlg.SetTipInfor(Msg.GetBuffer(0));
pProgressDlg.SetProgress(10);
DEBUGMSG(Msg.GetBuffer(0));*/
pProMsg = (PROGRESSMSG_PTR)malloc(sizeof(PROGRESSMSG));
memset(pProMsg,0,sizeof(PROGRESSMSG));
pProMsg->pos = 10;
strcpy(pProMsg->msg,Msg.GetBuffer(0));
Msg.ReleaseBuffer();
::PostMessage(hDlgHandle,WM_USER+2,NULL,(long)pProMsg);
int keytype;
if(ReadUSBKeyCert(CSPProvider,Dllpri,sConName,sSubjectName,sIssueName,ErrMsg,keytype,hDlgHandle))
{
for(int j=0;j<MAX_CERT_COUNT;j++)
{
if(!g_AllCertInfo[j].isValide)
{
g_AllCertInfo[j].isValide = TRUE;
g_AllCertInfo[j].CSPProvider = CSPProvider;
g_AllCertInfo[j].Dllpri = Dllpri;
g_AllCertInfo[j].sConName = sConName;
g_AllCertInfo[j].sSubjectName = sSubjectName;
g_AllCertInfo[j].bjcakeycallway_index = i;
g_AllCertInfo[j].keytype = keytype;
break;
}
}
if(j==MAX_CERT_COUNT)//满了
{
AfxMessageBox("当前安装的证书太多了!!");
//g_reading --;
::PostMessage(hDlgHandle,WM_USER+1,NULL,NULL);
return;
}
//count = crl->m_CertName.GetCount();
//crl->m_CertName.InsertString(count,sSubjectName);
//crl->m_CertName.SetCurSel(count);
}
else
{
//SetDlgItemText(hDlg,IDS_EDIT,ErrMsg);
#ifdef _DEBUG
AfxMessageBox(ErrMsg);
#endif
}
}
/*
pProgressDlg.SetProgress(100);
pProgressDlg.SetTipInfor("OK");*/
pProMsg = (PROGRESSMSG_PTR)malloc(sizeof(PROGRESSMSG));
memset(pProMsg,0,sizeof(PROGRESSMSG));
pProMsg->pos = 100;
strcpy(pProMsg->msg,"OK");
::PostMessage(hDlgHandle,WM_USER+2,NULL,(long)pProMsg);
DEBUGMSG("Pthread_ReadCruUSBKeyCert End.Post Message To FireKeyChange.\n");
::PostMessage(hDlgHandle,WM_USER+1,NULL,NULL);
}
IMPLEMENT_DYNCREATE(CUSBKeyPnPActiveXCtrl, COleControl)
/////////////////////////////////////////////////////////////////////////////
// Message map
BEGIN_MESSAGE_MAP(CUSBKeyPnPActiveXCtrl, COleControl)
//{{AFX_MSG_MAP(CUSBKeyPnPActiveXCtrl)
ON_WM_CREATE()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -