📄 usbkeypnpactivexctl.cpp
字号:
free(HubName);
}
else
{
WORD vid,pid;
vid = connectionInfo->DeviceDescriptor.idVendor;
pid = connectionInfo->DeviceDescriptor.idProduct;
for(int i=0;;i++)
{
if(g_bjcakeycallway_suport[i].dwVendorID == 0)
break;
if( (g_bjcakeycallway_suport[i].dwVendorID == vid) &&(g_bjcakeycallway_suport[i].dwProductID==pid))
{
g_bjcakeycallway_suport[i].isExist ++;
break;
}
}//end for
}
}//end ==DeviceConnected
free(connectionInfo);
}//end for
CloseHandle(hHubDevice);
}
BSTR CUSBKeyPnPActiveXCtrl::getUserInfoByContainer(LPCTSTR strContainerName, short type)
{
CString strResult;
// TODO: Add your dispatch handler code here
BOOL bFind = FALSE;
char buf[8] = {0};
for(int i=0;i<MAX_CERT_COUNT;i++)
{
if((g_AllCertInfo[i].isValide) &&(strContainerName==g_AllCertInfo[i].sConName))
{
bFind = TRUE;
break;
}
}
if(bFind)
{
switch(type)
{
case CERT_XML_SUBJECT:
strResult = g_AllCertInfo[i].sSubjectName;
break;
case CERT_XML_ISSUE:
strResult = g_AllCertInfo[i].sIssueName;
break;
case CERT_XML_KEYTYPE:
sprintf(buf,"%d",g_AllCertInfo[i].keytype);
strResult = buf;
break;
case CERT_XML_DEVICEPROVIDER:
strResult = g_AllCertInfo[i].CSPProvider;
break;
case CERT_XML_DEVICEAFFIX:
strResult = g_AllCertInfo[i].Dllpri;
break;
case CERT_XML_DEVICETYPE:
strResult = "BJCA_AUTO_USBKEY";
break;
default:
break;
}
}
else
{
}
return strResult.AllocSysString();
}
BSTR CUSBKeyPnPActiveXCtrl::getUserList()
{
CString strResult;
// TODO: Add your dispatch handler code here
int i;
CString msg;
for(i=0;i<MAX_CERT_COUNT;i++)
{
if(g_AllCertInfo[i].isValide)
{
strResult = strResult +g_AllCertInfo[i].sSubjectName +"||";
strResult = strResult +g_AllCertInfo[i].sConName +"&&&";
}
}
return strResult.AllocSysString();
}
BOOL CUSBKeyPnPActiveXCtrl::DoRegisterDeviceInterface(HANDLE hRecipient, GUID InterfaceClassGuid, HDEVNOTIFY *hDevNotify)
{
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
char szMsg[80];
ZeroMemory( &NotificationFilter, sizeof(NotificationFilter) );
NotificationFilter.dbcc_size =
sizeof(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
NotificationFilter.dbcc_classguid = InterfaceClassGuid;
wsprintf(szMsg, "hRecipient : %d\n",
hRecipient);
*hDevNotify = RegisterDeviceNotification( hRecipient,
&NotificationFilter,
DEVICE_NOTIFY_WINDOW_HANDLE
//DEVICE_NOTIFY_ALL_INTERFACE_CLASSES//DEVICE_NOTIFY_WINDOW_HANDLE
);
if(!*hDevNotify)
{
wsprintf(szMsg, "RegisterDeviceNotification failed.ErrCode:%d\n",
GetLastError());
MessageBox(szMsg, "即插即用控件", MB_OK);
return FALSE;
}
return TRUE;
}
BOOL CUSBKeyPnPActiveXCtrl::GetAllUSBKEYCertInfo()
{
CString Msg;
TRACE("读取当前所有的usbkey设备 ...\n");
for(int i=0;;i++)
{
if(g_bjcakeycallway_suport[i].dwProductID == 0)
break;
if(g_bjcakeycallway_suport[i].isExist)//存在,可能有2个
{
if(g_bjcakeycallway_suport[i].isExist >1)
{
//Msg.Format("当前计算机插入了%d个%s的USBKEY,系统不支持多个同厂家的key同时插入!",g_bjcakeycallway_suport[i].isExist,g_bjcakeycallway_suport[i].KeyName);
//AfxMessageBox(Msg);
// break;
}
CString CSPProvider;
CString Dllpri;
CString sConName;
CString sSubjectName;
CString sIssueName;
CString ErrMsg;
CSPProvider = g_bjcakeycallway_suport[i].CSPProvider;
Dllpri = g_bjcakeycallway_suport[i].Dllpri;
Msg.Format("Reading %s...",g_bjcakeycallway_suport[i].KeyName);
TRACE(Msg);
int keytype;
if(ReadUSBKeyCert(CSPProvider,Dllpri,sConName,sSubjectName,sIssueName,ErrMsg,keytype,NULL))
//if(ReadUSBKeyCert_Ex(CSPProvider,Dllpri,sConName,sSubjectName,sIssueName,ErrMsg,keytype,NULL))
{
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("当前安装的证书太多了!!");
return FALSE;
}
}
else
{
#ifdef _DEBUG
AfxMessageBox(ErrMsg);
#endif
}
continue;
}
}
TRACE("读取当前所有的usbkey设备 END\n");
return TRUE;
}
void CUSBKeyPnPActiveXCtrl::RegisterDeviceInterface()
{
if(hDevNotify == NULL)
{
HWND hCtrlWnd;
hCtrlWnd = this->GetSafeHwnd();
if(hCtrlWnd == NULL)
{
CString ErrMsg;
ErrMsg.Format("RegisterDeviceInterface,GetSafeHwnd Err.ErrCode:0x%x",GetLastError());
AfxMessageBox(ErrMsg);
hCtrlWnd = this->GetSafeHwnd();
if(hCtrlWnd == NULL)
{
AfxMessageBox("GetSafeHwnd Again,hCtrlWnd == NULL");
return;
}
}
CString ErrMsg;
ErrMsg.Format("DoRegisterDeviceInterface,hCtrlWnd=0x%x",hCtrlWnd);
//AfxMessageBox(ErrMsg);
DoRegisterDeviceInterface(hCtrlWnd,
GUID_DEVINTERFACE_USB_DEVICE,&hDevNotify);
}
else
{
//AfxMessageBox("Already Registered DeviceInterface!");
}
return ;
}
void CUSBKeyPnPActiveXCtrl::OnDeviceChange(WPARAM wParam, LPARAM lParam)
{
char buf[128];
PDEV_BROADCAST_HDR pDev_broadcast;
PDEV_BROADCAST_DEVICEINTERFACE pDevInterFace;
PDEV_BROADCAST_VOLUME pDevVolume;
DWORD dbcv_unitmask;
CString sDevName;
WORD vid,pid;
int i;
CString msg;
char cVolumeDisk;
switch(wParam)
{
case 0x10010://hd IC卡拔除
vid = 0x1677;
pid = 0x0203;
for(i=0;;i++)
{
if(g_bjcakeycallway_suport[i].dwProductID == 0)
break;
if((vid == g_bjcakeycallway_suport[i].dwVendorID)&&(pid==g_bjcakeycallway_suport[i].dwProductID))
{
if(g_bjcakeycallway_suport[i].isExist == 0)
{
FireOnUSBKeyChange();
break;
}
if(g_bjcakeycallway_suport[i].isExist>=1)
g_bjcakeycallway_suport[i].isExist = 0;
msg.Format("设备名称:%s\n\n厂家ID:%04x\n\n产品ID:%04x\n\nCSP名称:%s\n\n扩展接口名称:%s\n",g_bjcakeycallway_suport[i].KeyName,
g_bjcakeycallway_suport[i].dwVendorID,
g_bjcakeycallway_suport[i].dwProductID,
g_bjcakeycallway_suport[i].CSPProvider,
g_bjcakeycallway_suport[i].Dllpri
);
for(int j=0;j<MAX_CERT_COUNT;j++)
{
if((g_AllCertInfo[j].isValide) && (g_AllCertInfo[j].bjcakeycallway_index==i))
{
g_AllCertInfo[j].isValide = FALSE;
break;
}
}
FireOnUSBKeyChange();
break;
}
}
break;
case 0x10011://hd ic 插入
vid = 0x1677;
pid = 0x0203;
for(i=0;;i++)
{
msg.Format("i=%d",i);
DEBUGMSG(msg.GetBuffer(0));
if(g_bjcakeycallway_suport[i].dwProductID == 0)
break;
if((vid == g_bjcakeycallway_suport[i].dwVendorID)&&(pid==g_bjcakeycallway_suport[i].dwProductID))
{
TRACE("Found KeyCallWay i=%d\n",i);
{
g_bjcakeycallway_suport[i].isExist = 1;
DEBUGMSG("Found");
msg.Format("设备名称:%s\n\n厂家ID:%04x\n\n产品ID:%04x\n\nCSP名称:%s\n\n扩展接口名称:%s\n",g_bjcakeycallway_suport[i].KeyName,
g_bjcakeycallway_suport[i].dwVendorID,
g_bjcakeycallway_suport[i].dwProductID,
g_bjcakeycallway_suport[i].CSPProvider,
g_bjcakeycallway_suport[i].Dllpri
);
DEBUGMSG(msg.GetBuffer(0));
TRACE(msg);
g_bjcakey_index = i;
GetCurUSBKEYCertInfo();
}
break;
}
}
break;
case 0x10000://明华IC卡拔除
vid = 0x1483;
pid = 0x2001;
for(i=0;;i++)
{
if(g_bjcakeycallway_suport[i].dwProductID == 0)
break;
if((vid == g_bjcakeycallway_suport[i].dwVendorID)&&(pid==g_bjcakeycallway_suport[i].dwProductID))
{
if(g_bjcakeycallway_suport[i].isExist == 0)
{
FireOnUSBKeyChange();
break;
}
if(g_bjcakeycallway_suport[i].isExist>=1)
g_bjcakeycallway_suport[i].isExist = 0;
msg.Format("设备名称:%s\n\n厂家ID:%04x\n\n产品ID:%04x\n\nCSP名称:%s\n\n扩展接口名称:%s\n",g_bjcakeycallway_suport[i].KeyName,
g_bjcakeycallway_suport[i].dwVendorID,
g_bjcakeycallway_suport[i].dwProductID,
g_bjcakeycallway_suport[i].CSPProvider,
g_bjcakeycallway_suport[i].Dllpri
);
// MessageBox(msg,"有设备拔走",MB_OK|MB_ICONINFORMATION);
//把此设备的证书从列表中删除
for(int j=0;j<MAX_CERT_COUNT;j++)
{
if((g_AllCertInfo[j].isValide) && (g_AllCertInfo[j].bjcakeycallway_index==i))
{
g_AllCertInfo[j].isValide = FALSE;
/*
int curindex = m_CertName.FindString(0,g_AllCertInfo[j].sSubjectName);
if(curindex != CB_ERR)
m_CertName.DeleteString(curindex);*/
break;
}
}
FireOnUSBKeyChange();
break;
}
}
break;
case 0x10001:////明华IC卡插入
vid = 0x1483;
pid = 0x2001;
for(i=0;;i++)
{
msg.Format("i=%d",i);
DEBUGMSG(msg.GetBuffer(0));
if(g_bjcakeycallway_suport[i].dwProductID == 0)
break;
if((vid == g_bjcakeycallway_suport[i].dwVendorID)&&(pid==g_bjcakeycallway_suport[i].dwProductID))
{
TRACE("Found KeyCallWay i=%d\n",i);
{
g_bjcakeycallway_suport[i].isExist = 1;
DEBUGMSG("Found");
msg.Format("设备名称:%s\n\n厂家ID:%04x\n\n产品ID:%04x\n\nCSP名称:%s\n\n扩展接口名称:%s\n",g_bjcakeycallway_suport[i].KeyName,
g_bjcakeycallway_suport[i].dwVendorID,
g_bjcakeycallway_suport[i].dwProductID,
g_bjcakeycallway_suport[i].CSPProvider,
g_bjcakeycallway_suport[i].Dllpri
);
DEBUGMSG(msg.GetBuffer(0));
TRACE(msg);
//MessageBox(msg,"有设备插入",MB_OK|MB_ICONINFORMATION);
g_bjcakey_index = i;
GetCurUSBKEYCertInfo();
//FireOnUSBKeyChange();
}
break;
}
}
break;
case DBT_DEVICEARRIVAL:
TRACE("有设备插入!\n");
sprintf(buf,"lParam = %d\n",lParam);
TRACE(buf);
DEBUGMSG("有设备插入");
pDev_broadcast = (PDEV_BROADCAST_HDR)lParam;
switch(pDev_broadcast->dbch_devicetype)
{
case DBT_DEVTYP_DEVICEINTERFACE:
TRACE("Class of devices\n");
pDevInterFace = (PDEV_BROADCAST_DEVICEINTERFACE)lParam;
sDevName = pDevInterFace->dbcc_name;
TRACE(sDevName);
DEBUGMSG(sDevName.GetBuffer(0));
TRACE("ParseDevicePath ...\n");
if(ParseDevicePath(sDevName.GetBuffer(0),vid,pid))
{
msg.Format("ParseDevicePath ok.vid=0x%x,pid=0x%x\n",vid,pid);
DEBUGMSG(msg.GetBuffer(0));
//AfxMessageBox(msg);
for(i=0;;i++)
{
msg.Format("i=%d",i);
DEBUGMSG(msg.GetBuffer(0));
if(g_bjcakeycallway_suport[i].dwProductID == 0)
break;
if((vid == g_bjcakeycallway_suport[i].dwVendorID)&&(pid==g_bjcakeycallway_suport[i].dwProductID))
{
TRACE("Found KeyCallWay i=%d\n",i);
//if(!g_bjcakeycallway_suport[i].isExist)
{
g_bjcakeycallway_suport[i].isExist = 1;
DEBUGMSG("Found");
msg.Format("设备名称:%s\n\n厂家ID:%04x\n\n产品ID:%04x\n\nCSP名称:%s\n\n扩展接口名称:%s\n",g_bjcakeycallway_suport[i].KeyName,
g_bjcakeycallway_suport[i].dwVendorID,
g_bjcakeycallway_suport[i].dwProductID,
g_bjcakeycallway_suport[i].CSPProvider,
g_bjcakeycallway_suport[i].Dllpri
);
DEBUGMSG(msg.GetBuffer(0));
TRACE(msg);
//MessageBox(msg,"有设备插入",MB_OK|MB_ICONINFORMATION);
g_bjcakey_index = i;
GetCurUSBKEYCertInfo();
//FireOnUSBKeyChange();
}
break;
}
}
}
break;
case DBT_DEVTYP_HANDLE:
TRACE("File system handle\n");
break;
case DBT_DEVTYP_OEM:
TRACE("OEM- or IHV-defined device type\n");
break;
case DBT_DEVTYP_PORT:
TRACE("Port device (serial or parallel). \n");
break;
case DBT_DEVTYP_VOLUME:
TRACE("Logical volume \n");
pDevVolume = (PDEV_BROADCAST_VOLUME)lParam;
dbcv_unitmask = pDevVolume->dbcv_unitmask;
TRACE("dbcv_unitmask=%x\n",dbcv_unitmask);
cVolumeDisk = GetVolumeDisk(dbcv_unitmask);
TRACE("新卷:%c\n",cVolumeDisk);
msg.Format("USB存储设备,新卷:%c",cVolumeDisk);
MessageBox(msg,"有设备插入",MB_OK|MB_ICONINFORMATION);
break;
default:
break;
}
break;
case DBT_DEVICEREMOVECOMPLETE:
TRACE("
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -