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

📄 usbkeypnpactivexctl.cpp

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