⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbkeypnpactivexctl.cpp

📁 手机智能卡开发
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	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 + -