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

📄 usbkeypnpactivexctl.cpp

📁 手机智能卡开发
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// USBKeyPnPActiveXCtl.cpp : Implementation of the CUSBKeyPnPActiveXCtrl ActiveX Control class.

#include "stdafx.h"
#include "USBKeyPnPActiveX.h"
#include "USBKeyPnPActiveXCtl.h"
#include "USBKeyPnPActiveXPpg.h"
#include <io.h>
#include <direct.h>
#include <process.h> 
#include <dbt.h>
#include "devioctl.h"
#include <winioctl.h>	
#include "usbdi.h"
#include "windows.h"
#include "Setupapi.h"
#include "stdio.h"
#include "hidsdi.h"
#include "winioctl.h"
#include "Atlbase.h"
#include "bca_all.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define NUM_HCS_TO_CHECK 10

static /*const*/ GUID GUID_DEVINTERFACE_USB_DEVICE = 
{ 0xA5DCBF10L, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } };
#define DEVICE_NOTIFY_ALL_INTERFACE_CLASSES  0x00000004

#define CERT_XML_SUBJECT			1		//从XML配置文件取用户名
#define CERT_XML_UNIQUEID			2		//从XML配置文件取用户唯一表识
#define CERT_XML_DEPT				3		//从XML配置文件取用户所有者部门
#define CERT_XML_ISSUE				4		//从XML配置文件取用户证书颁发者
#define CERT_XML_STATE				5		//从XML配置文件取用户证书使用状态
#define CERT_XML_TRADETYPE			6		//从XML配置文件取用户证书应用类型
#define CERT_XML_PASSWORD			7		//从XML配置文件取用户证书私钥保护口令
#define CERT_XML_DEVICETYPE			8		//从XML配置文件取用户证书介质类型
#define CERT_XML_CATYPE				9		//从XML配置文件取用户证书CA类型
#define CERT_XML_KEYTYPE			10		//从XML配置文件取用户证书密钥类型
#define CERT_XML_SIGNSN				11		//从XML配置文件取用户签名证书序列号
#define CERT_XML_EXCHSN				12		//从XML配置文件取用户加密证书序列号
#define CERT_XML_DEVICENAME			13		//从XML配置文件取用户证书介质名称
#define CERT_XML_DEVICEPROVIDER		14		//从XML配置文件取用户证书介质提供者
#define CERT_XML_DEVICEAFFIX		15		//从XML配置文件取用户证书介质附加库
#define CERT_XML_SIGNPATH			16		//从XML配置文件取用户签名证书路径
#define CERT_XML_EXCHPATH			17		//从XML配置文件取用户加密证书路径
#define	CERT_XML_SIGNPFXPATH		18		//从XML配置文件取用户签名P12证书路径
#define	CERT_XML_EXCHPFXPATH		19		//从XML配置文件取用户加密P12证书路径
#define CERT_XML_CHAINPATH			20		//从XML配置文件取用户证书链路径
#define CERT_XML_CRLPATH			21		//从XML配置文件取用户证书作废列表路径
#define CERT_XML_UNIQUEIDOID		22		//从XML配置文件取用户证书UniqueID的OID
#define CERT_XML_VERIFYTYPE			23		//从XML配置文件取用户证书验证类型
#define CERT_XML_CACOUNTS			24		//从XML配置文件取用户证书根证书个数
#define CERT_XML_CANUMTYPE			25		//从XML配置文件取用户证书跟证书类型

#define CERT_XML_OLDKEYEXCHCERT		31		//从XML配置文件取存储卡用户加密证书
#define CERT_XML_OLDKEYEXCHPFX		32		//从XML配置文件取存储卡用户加密PFX
#define CERT_XML_OLDKEYSIGNCERT		33		//从XML配置文件取存储卡用户签名证书
#define CERT_XML_OLDKEYSIGNPFX		34		//从XML配置文件取存储卡用户签名PFX

typedef DWORD  (WINAPI *OpenCardFptr)(HANDLE* hKey);
typedef DWORD  (WINAPI *GetCardCountFptr)(DWORD *nCount);
typedef DWORD  (WINAPI *OpenCardByIndexFptr)(HANDLE* hKey,DWORD index);

typedef DWORD  (WINAPI *CloseCardFptr)(HANDLE hKey);
typedef DWORD  (WINAPI *BjcaKeyReadDataFptr)(HANDLE hKey,
                             unsigned char *FileName,
                             unsigned long FileNameLen,
							 unsigned char *pbData, 
							 unsigned long *pbDataLen);
typedef DWORD  (WINAPI *BjcaRegDevNotifyFptr)(HWND hWnd);
typedef DWORD  (WINAPI *BjcaUnregDevNotifyFptr)(HWND hWnd);

HINSTANCE	  MWICDLL_Handler=0L;//明华ic卡
HINSTANCE	  HDICDLL_Handler=0L;//华大ic卡


/*如果注册成功,则当设备有插拔消息时,所注册的窗口会在OnDeviceChange函数中接收到
nEventType为0x10000和0x10001的消息,其中0x10000为拔出,0x10001为插入*/


/*
//当前支持的所有设备信息以及调用方法 
BJCAKEYCALLWAY g_bjcakeycallway_suport[]=
{
	{"BJCA02型 USBKEY",0x096e,0x0401,"FEITIAN ePassNG RSA Cryptographic Service Provider","BjcaKey_FT.dll",0},
	{"BJCA02型 USBKEY",0x096e,0x0802,"FEITIAN ePassNG RSA Cryptographic Service Provider","BjcaKey_FT.dll",0},
	{"BJCA02型 USBKEY",0x096e,0x0801,"FEITIAN ePassNG RSA Cryptographic Service Provider","BjcaKey_FT.dll",0},
//	{"飞天无驱epass2000",0x096e,0x0801,"EnterSafe CSP v1.0 for BJCA","BjcaKey_FT.dll",0},
	{"BJCA01型 USBKEY",0x04b4,0x1234,"M&W eKey XCSP","BjcaKey_MW.dll",0},
	{"卫士通",0x0519,0x0005,"SW RSA CSP","BjcaKey_WST.dll",0},
	{"海泰",0x5448,0x0001,"HaiTai Cryptographic Service Provider","BjcaKey_ht.dll",0},
	{"海泰无驱",0x5448,0x0003,"HaiTai Cryptographic Service Provider","BjcaKey_ht.dll",0},
	//{"海泰U&Key",0x058F,0x9254,"HaiTai Cryptographic Service Provider","BjcaKey_ht.dll",0},
	{"中钞",0xD6A3,0x2599,"NJA EKEY CSP V1.0","BjcaKey_zc.dll",0},
	{"中钞32位",0xD1A1,0x2191,"NJA EKEY CSP V1.0","BjcaKey_zc.dll",0},	
	{"天地融",0x1780,0x0001,"Tendyron USB Key CSP v1.0","BjcaKey_tdr.dll",0},
	{"志久",0x14D6,0x0007,"ZHIJIU MASSKEY CSP1.0.0","BjcaKey_zj.dll",0},
	{"华旗",0x0007,0x1100,"SecToken108z CSP V1.0","BjcaKey_hq.dll",0},
	{NULL,0,0,NULL,NULL,0}
}; 
//*/
//*
//当前支持的所有设备信息以及调用方法
BJCAKEYCALLWAY g_bjcakeycallway_suport[]=
{
	{"BJCA02型 USBKEY",0x096e,0x0401,"EnterSafe CSP (ePass3000) v1.0 for BJCA","BjcaKey_FT3K.dll",0},
	{"BJCA02型 USBKEY",0x096e,0x0701,"EnterSafe CSP (ePass3000HN) v1.0 for BJCA","bjcakey_FT3khn.dll",0},	
	{"BJCA02型 USBKEY",0x096e,0x0802,"EnterSafe CSP (ePass2000-FT12) v1.0 for BJCA","BjcaKey_FT12.dll",0},
	{"BJCA02型 USBKEY",0x096e,0x0801,"EnterSafe CSP (ePass2000-FT11) v1.0 for BJCA","BjcaKey_FT11.dll",0},
	{"BJCA01型 USBKEY",0x04b4,0x1234,"M&W eKey XCSP","BjcaKey_MW.dll",0},
	{"MWIC卡",0x1483,0x2001,"M&W eKey XCSP V3","BjcaKey_MHIC.dll",0},
	{"卫士通",0x0519,0x0005,"SW RSA CSP","BjcaKey_WST.dll",0},
	{"海泰",0x5448,0x0001,"HaiTai Cryptographic Service Provider","BjcaKey_ht.dll",0},
	{"海泰无驱",0x5448,0x0003,"HaiTai Cryptographic Service Provider","BjcaKey_ht.dll",0},
	//{"海泰U&Key",0x058F,0x9254,"HaiTai Cryptographic Service Provider","BjcaKey_ht.dll",0},
	{"中钞",0xD6A3,0x2599,"NJA EKEY CSP V1.0","BjcaKey_zc.dll",0},
	{"中钞32位",0xD1A1,0x2191,"NJA EKEY CSP V1.0","BjcaKey_zc.dll",0},	
	{"天地融",0x1780,0x0010,"Tendyron USB Key CSP v1.0","BjcaKey_tdr.dll",0},
	{"天地融",0x1780,0x0171,"Tendyron USB Key CSP v1.0","BjcaKey_tdr.dll",0},
	{"志久",0x14D6,0x0007,"ZHIJIU MASSKEY CSP1.0.0","BjcaKey_zj.dll",0},
	{"华旗",0x0007,0x1100,"SecToken108z CSP V1.0","BjcaKey_hq.dll",0},
	{"握奇",0x163C,0x0401,"WatchData Cryptographic Provider v3.0","BjcaKey_wd.dll",0},
	{"华大IC卡",0x1677,0x0203,"CIDC Cryptographic Service Provider v1.0.0","BjcaKey_HDIC.dll",0},	
	{"得安",0x04B4,0x658A,"DATech RSA FULL CSP v3.0","bjcakey_da.dll",0},
	{"My3ia",0x0ED1,0x6685,"My3ia AutoKey RSA Cryptographic Service Provider","BjcaKey_MY3IA.dll",0},
	{NULL,0,0,NULL,NULL,0}
};
//*/
//BJCACERTINFO m_CurCertInfo;
#define  MAX_CERT_COUNT 128
BJCACERTINFO g_AllCertInfo[MAX_CERT_COUNT];
int	g_AllCertCount = 0;
int g_bjcakey_index;
static int g_reading = 0;
 
typedef struct _ProgressMsg
{
	char msg[256];
	int pos;
}PROGRESSMSG,*PROGRESSMSG_PTR;

CRITICAL_SECTION g_cs={0};

typedef int  (*BJCA_ProgressShowFunc)(char *msg,int percent);

void DebugMsg(char *pFileName,int nLine,char *pMsg)
{
	time_t ltime;
	FILE *fp;
	int rv;
	switch(2) 
	{
	case 0:
		break;
	case 1:
		printf("%s [FileName:%s,Line:%d]\n",pMsg,pFileName,nLine);
		break;
	case 2:
#ifdef _DEBUG
		
		printf("%s [FileName:%s,Line:%d]\n",pMsg,pFileName,nLine);
#endif
#ifdef WIN32
		rv = _access("c:\\bca_log",0);
#else
		rv = access(BCA_LOG_DIR,0);
#endif
		if(rv == 0)//目录存在
		{
			time( &ltime );
			fp = fopen("c:\\bca_log\\usbactiveX.log","a+");
			if(fp == NULL)
				return;
#ifdef WIN32
			fprintf(fp,"pid=%ld\n",GetCurrentProcessId());
#endif
			fprintf(fp,"%s",ctime( &ltime ));
			fprintf(fp,"%s [FileName:%s,Line:%d]\n",pMsg,pFileName,nLine);
			fclose(fp);
		}
		
		break;
	default:
		break;
	}
	
	
}

BOOL ParseDevicePath(char *devicepath,WORD &vid,WORD &pid)
{
	//\\?\usb#vid_04b4&pid_1234#5&1c35c9c8&0&3#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
	char *ptr1;
	char *ptr2;
	char tmpbuf[256];
	DEBUGMSG(devicepath);
	memset(tmpbuf,0,256);
	vid = 0;
	pid = 0;
	DEBUGMSG("");
	ptr1 = strstr(devicepath,"#");
	if(ptr1 == NULL)
		return FALSE;
	DEBUGMSG("");
	ptr1 ++;
	DEBUGMSG("");
	
	ptr2 = strstr(ptr1,"#");
	if(ptr2 == NULL)
		return FALSE;
	DEBUGMSG("");
	strncpy(tmpbuf,ptr1,size_t(ptr2-ptr1));
	//转换成小写
	DEBUGMSG("");
	for(unsigned int i=0;i<strlen(tmpbuf);i++)
	{
		if(isupper(tmpbuf[i]))
		{
			tmpbuf[i] = tolower(tmpbuf[i]);
		}
		
	}
	DEBUGMSG("");
	WORD vid_tmp;
	WORD pid_tmp;
	 

	sscanf(tmpbuf,"vid_%04x&pid_%04x",&vid_tmp,&pid_tmp);
	CString msg;
	msg.Format("tmpbuf=%s,vid=0x%04x,pid=0x%04x",tmpbuf,vid_tmp,pid_tmp);
 	vid = vid_tmp;
	pid = pid_tmp;
	DEBUGMSG("");
	return TRUE;
}

char GetVolumeDisk(DWORD dwUnitmask)
{
	char cVolumeDisk = 'A';
	if(dwUnitmask%2 != 0)
	{
		TRACE("错误的Unitmask\n");
		return 0;
	}
	while(dwUnitmask != 1)
	{
		dwUnitmask = dwUnitmask/2;
		cVolumeDisk ++;
	}
	return cVolumeDisk;
}
BOOL BjcaRegDevNotify_HDIC(HWND hHandle)
{
	BjcaRegDevNotifyFptr BjcaRegDevNotify;
	int rv;
	//if(HDICDLL_Handler == NULL)
	if(1)
	{
		//AfxMessageBox("LoadLibrary BjcaKey_HDIC.dll");
		HDICDLL_Handler = LoadLibrary("BjcaKey_HDIC.dll");
		if(HDICDLL_Handler == NULL)
		{
			return FALSE;
		}
		BjcaRegDevNotify = (BjcaRegDevNotifyFptr)GetProcAddress(HDICDLL_Handler,"BjcaRegDevNotify");
		if(BjcaRegDevNotify == NULL)
		{
			FreeLibrary(HDICDLL_Handler);
			HDICDLL_Handler = NULL;
			return FALSE;
		}
		rv = BjcaRegDevNotify(hHandle);
	}
	else
	{
		 //AfxMessageBox("Already LoadLibrary BjcaKey_HDIC.dll");
	}
}
BOOL BjcaUnRegDevNotify_HDIC(HWND hHandle)
{
	BjcaUnregDevNotifyFptr BjcaUnregDevNotify;
	if(HDICDLL_Handler == NULL)
		return FALSE;
	BjcaUnregDevNotify = (BjcaUnregDevNotifyFptr)GetProcAddress(HDICDLL_Handler,"BjcaUnregDevNotify");
	if(BjcaUnregDevNotify == NULL)
	{
		return FALSE;
	}
	BjcaUnregDevNotify(hHandle);
	FreeLibrary(HDICDLL_Handler);
	HDICDLL_Handler = NULL;
	return TRUE;
}

BOOL BjcaRegDevNotify_MWIC(HWND hHandle)
{
	BjcaRegDevNotifyFptr BjcaRegDevNotify;

	if(MWICDLL_Handler == NULL)
	{
		//AfxMessageBox("LoadLibrary BjcaKey_MHIC.dll");
		MWICDLL_Handler = LoadLibrary("BjcaKey_MHIC.dll");
		if(MWICDLL_Handler == NULL)
		{
			return FALSE;
		}
		BjcaRegDevNotify = (BjcaRegDevNotifyFptr)GetProcAddress(MWICDLL_Handler,"BjcaRegDevNotify");
		if(BjcaRegDevNotify == NULL)
		{
			FreeLibrary(MWICDLL_Handler);
			MWICDLL_Handler = NULL;
			return FALSE;
		}
		BjcaRegDevNotify(hHandle);
	}
	else
	{
		//AfxMessageBox("Already LoadLibrary BjcaKey_MHIC.dll");
	}
}


BOOL BjcaUnRegDevNotify_MWIC(HWND hHandle)
{
	BjcaUnregDevNotifyFptr BjcaUnregDevNotify;
	HINSTANCE	  CSPDSO_Handler=0L;
	CSPDSO_Handler = LoadLibrary("BjcaKey_MHIC.dll");
	if(CSPDSO_Handler == NULL)
	{
		return FALSE;
	}
	BjcaUnregDevNotify = (BjcaUnregDevNotifyFptr)GetProcAddress(CSPDSO_Handler,"BjcaUnregDevNotify");
	if(BjcaUnregDevNotify == NULL)
	{
		return FALSE;
	}
	BjcaUnregDevNotify(hHandle);
	FreeLibrary(CSPDSO_Handler);
}
void WriteCertFile(char *filename,unsigned char *data,int dataLen)
{
	FILE *fp;
	fp = fopen(filename,"wb");
	if(fp==NULL)
		return;
	fwrite(data,1,dataLen,fp);
	fclose(fp);
	
}
BOOL ReadUSBKeyCert(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;
	//Sleep(5000);
	CSPDSO_Handler = LoadLibrary(Dllpri.GetBuffer(0));
	if(CSPDSO_Handler == NULL)
	{	
		ErrMsg.Format("加载文件\"%s\"错误,智能卡相关文件未正确安装!",Dllpri.GetBuffer(0));
		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");
	rv = OpenCard(&hKey);
	if(rv)
	{
		if(rv == 0x20000002 )//USBKEY_KEY_REMOVED
		{
			TRACE("OpenCard Err.Sleep 2\'\n");
			Sleep(2000);
			rv = OpenCard(&hKey);
		}
		if(rv)
		{
			ErrMsg.Format("打开智能卡失败!,ErrCode:%x",rv);
			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);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -