📄 usbkeypnpactivexctl.cpp
字号:
// 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( <ime );
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( <ime ));
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 + -