📄 usbkeypnpactivexctl.cpp
字号:
//}}AFX_MSG_MAP
ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
ON_MESSAGE(WM_DEVICECHANGE , OnDeviceChange)
ON_MESSAGE(WM_USER+1, OnFireOnUSBKeyChange)
ON_MESSAGE(WM_USER+2, OnProgressMsg)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// Dispatch map
BEGIN_DISPATCH_MAP(CUSBKeyPnPActiveXCtrl, COleControl)
//{{AFX_DISPATCH_MAP(CUSBKeyPnPActiveXCtrl)
DISP_FUNCTION(CUSBKeyPnPActiveXCtrl, "EnumUsbKey", EnumUsbKey, VT_BSTR, VTS_NONE)
DISP_FUNCTION(CUSBKeyPnPActiveXCtrl, "getUserInfoByContainer", getUserInfoByContainer, VT_BSTR, VTS_BSTR VTS_I2)
DISP_FUNCTION(CUSBKeyPnPActiveXCtrl, "getUserList", getUserList, VT_BSTR, VTS_NONE)
DISP_FUNCTION(CUSBKeyPnPActiveXCtrl, "RegisterDeviceInterface", RegisterDeviceInterface, VT_EMPTY, VTS_NONE)
DISP_FUNCTION(CUSBKeyPnPActiveXCtrl, "SetLoginState", SetLoginState, VT_BOOL, VTS_BSTR VTS_BSTR)
DISP_FUNCTION(CUSBKeyPnPActiveXCtrl, "GetSavedPass", GetSavedPass, VT_BSTR, VTS_BSTR)
DISP_FUNCTION(CUSBKeyPnPActiveXCtrl, "GetUSBKeyList", GetUSBKeyList, VT_BSTR, VTS_NONE)
DISP_FUNCTION(CUSBKeyPnPActiveXCtrl, "GetPassSaveState", GetPassSaveState, VT_BOOL, VTS_BSTR)
DISP_FUNCTION(CUSBKeyPnPActiveXCtrl, "SaveUserPass", SaveUserPass, VT_BOOL, VTS_BSTR VTS_BSTR)
DISP_FUNCTION(CUSBKeyPnPActiveXCtrl, "DelUserPass", DelUserPass, VT_BOOL, VTS_BSTR)
//}}AFX_DISPATCH_MAP
DISP_FUNCTION_ID(CUSBKeyPnPActiveXCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
END_DISPATCH_MAP()
/////////////////////////////////////////////////////////////////////////////
// Event map
BEGIN_EVENT_MAP(CUSBKeyPnPActiveXCtrl, COleControl)
//{{AFX_EVENT_MAP(CUSBKeyPnPActiveXCtrl)
EVENT_CUSTOM("OnUSBKeyChange", FireOnUSBKeyChange, VTS_NONE)
//}}AFX_EVENT_MAP
END_EVENT_MAP()
/////////////////////////////////////////////////////////////////////////////
// Property pages
// TODO: Add more property pages as needed. Remember to increase the count!
BEGIN_PROPPAGEIDS(CUSBKeyPnPActiveXCtrl, 1)
PROPPAGEID(CUSBKeyPnPActiveXPropPage::guid)
END_PROPPAGEIDS(CUSBKeyPnPActiveXCtrl)
/////////////////////////////////////////////////////////////////////////////
// Initialize class factory and guid
IMPLEMENT_OLECREATE_EX(CUSBKeyPnPActiveXCtrl, "USBKEYPNPACTIVEX.USBKeyPnPActiveXCtrl.1",
0xcf5259b, 0xa812, 0x4b6e, 0x97, 0x46, 0xac, 0xf7, 0x27, 0x9f, 0xef, 0x74)
/////////////////////////////////////////////////////////////////////////////
// Type library ID and version
IMPLEMENT_OLETYPELIB(CUSBKeyPnPActiveXCtrl, _tlid, _wVerMajor, _wVerMinor)
/////////////////////////////////////////////////////////////////////////////
// Interface IDs
const IID BASED_CODE IID_DUSBKeyPnPActiveX =
{ 0x2d85d5ef, 0x6954, 0x464e, { 0x96, 0xf7, 0xc1, 0x19, 0xdc, 0xdd, 0xab, 0x81 } };
const IID BASED_CODE IID_DUSBKeyPnPActiveXEvents =
{ 0xe7d2618, 0x9ebe, 0x4227, { 0x9f, 0x98, 0x9b, 0x86, 0x43, 0x90, 0x54, 0x8 } };
/////////////////////////////////////////////////////////////////////////////
// Control type information
static const DWORD BASED_CODE _dwUSBKeyPnPActiveXOleMisc =
OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST |
OLEMISC_INSIDEOUT |
OLEMISC_CANTLINKINSIDE |
OLEMISC_RECOMPOSEONRESIZE;
IMPLEMENT_OLECTLTYPE(CUSBKeyPnPActiveXCtrl, IDS_USBKEYPNPACTIVEX, _dwUSBKeyPnPActiveXOleMisc)
/////////////////////////////////////////////////////////////////////////////
// CUSBKeyPnPActiveXCtrl::CUSBKeyPnPActiveXCtrlFactory::UpdateRegistry -
// Adds or removes system registry entries for CUSBKeyPnPActiveXCtrl
BOOL CUSBKeyPnPActiveXCtrl::CUSBKeyPnPActiveXCtrlFactory::UpdateRegistry(BOOL bRegister)
{
// TODO: Verify that your control follows apartment-model threading rules.
// Refer to MFC TechNote 64 for more information.
// If your control does not conform to the apartment-model rules, then
// you must modify the code below, changing the 6th parameter from
// afxRegApartmentThreading to 0.
if (bRegister)
return AfxOleRegisterControlClass(
AfxGetInstanceHandle(),
m_clsid,
m_lpszProgID,
IDS_USBKEYPNPACTIVEX,
IDB_USBKEYPNPACTIVEX,
afxRegApartmentThreading,
_dwUSBKeyPnPActiveXOleMisc,
_tlid,
_wVerMajor,
_wVerMinor);
else
return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
}
/////////////////////////////////////////////////////////////////////////////
// CUSBKeyPnPActiveXCtrl::CUSBKeyPnPActiveXCtrl - Constructor
CUSBKeyPnPActiveXCtrl::CUSBKeyPnPActiveXCtrl()
{
InitializeIIDs(&IID_DUSBKeyPnPActiveX, &IID_DUSBKeyPnPActiveXEvents);
// TODO: Initialize your control's instance data here.
//AfxMessageBox("CUSBKeyPnPActiveXCtrl::CUSBKeyPnPActiveXCtrl");
bIsReged = FALSE;
hDevNotify = NULL;
InitializeCriticalSection(&g_cs);
HINSTANCE hInst = AfxGetInstanceHandle();
HANDLE hResource = ::LoadResource(hInst, FindResource(hInst,
reinterpret_cast<LPCTSTR>(IDD_MYPROG_DLG), RT_DIALOG));
pProgressDlg.SetTipInfor("有智能卡插入");
LPDLGTEMPLATE lpTemplate = static_cast<DLGTEMPLATE*>(LockResource(hResource));
pProgressDlg.CreateIndirect(lpTemplate);
pProgressDlg.SetProgress(0);
}
/////////////////////////////////////////////////////////////////////////////
// CUSBKeyPnPActiveXCtrl::~CUSBKeyPnPActiveXCtrl - Destructor
CUSBKeyPnPActiveXCtrl::~CUSBKeyPnPActiveXCtrl()
{
// TODO: Cleanup your control's instance data here.
pProgressDlg.DestroyWindow();
// DeleteCriticalSection(&g_cs);
if(hDevNotify)
{
//AfxMessageBox("UnregisterDeviceNotification");
UnregisterDeviceNotification(hDevNotify);
}
//BjcaUnRegDevNotify_MWIC(this->GetSafeHwnd());
//BjcaUnRegDevNotify_HDIC(this->GetSafeHwnd());
}
/////////////////////////////////////////////////////////////////////////////
// CUSBKeyPnPActiveXCtrl::OnDraw - Drawing function
void CUSBKeyPnPActiveXCtrl::OnDraw(
CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
// TODO: Replace the following code with your own drawing code.
pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
pdc->Ellipse(rcBounds);
}
/////////////////////////////////////////////////////////////////////////////
// CUSBKeyPnPActiveXCtrl::DoPropExchange - Persistence support
void CUSBKeyPnPActiveXCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
// TODO: Call PX_ functions for each persistent custom property.
}
/////////////////////////////////////////////////////////////////////////////
// CUSBKeyPnPActiveXCtrl::OnResetState - Reset control to default state
void CUSBKeyPnPActiveXCtrl::OnResetState()
{
COleControl::OnResetState(); // Resets defaults found in DoPropExchange
// TODO: Reset any other control state here.
}
/////////////////////////////////////////////////////////////////////////////
// CUSBKeyPnPActiveXCtrl::AboutBox - Display an "About" box to the user
void CUSBKeyPnPActiveXCtrl::AboutBox()
{
//test
//DWORD lpdwHandle;
//DWORD dwSize = GetFileVersionInfoSize("c:\\USBKeyPnPActiveX.ocx",&lpdwHandle);
CDialog dlgAbout(IDD_ABOUTBOX_USBKEYPNPACTIVEX);
dlgAbout.DoModal();
}
/////////////////////////////////////////////////////////////////////////////
// CUSBKeyPnPActiveXCtrl message handlers
BSTR CUSBKeyPnPActiveXCtrl::EnumUsbKey()
{
CString strResult;
///*
char szTraceBuf[256];
// Get device interface info set handle for all devices attached to system
HDEVINFO hDevInfo = SetupDiGetClassDevs(
&GUID_DEVINTERFACE_USB_DEVICE,
NULL,
NULL,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE
);
if (hDevInfo == INVALID_HANDLE_VALUE)
{
sprintf(szTraceBuf, "SetupDiClassDevs() failed. GetLastError() " \
"returns: 0x%x\n", GetLastError());
DEBUGMSG(szTraceBuf);
return strResult.AllocSysString();
}
sprintf(szTraceBuf, "Device info set handle for all devices attached to " \
"system: 0x%x\n", hDevInfo);
OutputDebugString(szTraceBuf);
DEBUGMSG(szTraceBuf);
// Retrieve a context structure for a device interface of a device
// information set.
for(int i=0;;i++)
{
if(g_bjcakeycallway_suport[i].dwVendorID == 0)
break;
g_bjcakeycallway_suport[i].isExist = 0;
}
for(i=0;i<MAX_CERT_COUNT;i++)
{
g_AllCertInfo[i].isValide = FALSE;
}
DEBUGMSG("");
// sCurusbNames.RemoveAll();
DWORD dwIndex = 0;
SP_DEVICE_INTERFACE_DATA devInterfaceData;
ZeroMemory(&devInterfaceData, sizeof(SP_DEVICE_INTERFACE_DATA));
devInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
BOOL bRet = FALSE;
while(TRUE)
{
bRet = SetupDiEnumDeviceInterfaces(
hDevInfo,
NULL,
&GUID_DEVINTERFACE_USB_DEVICE,
dwIndex,
&devInterfaceData
);
if (!bRet)
{
if (GetLastError() == ERROR_NO_MORE_ITEMS)
{
break;
}
sprintf(szTraceBuf, "SetupDiEnumDeviceInterfaces failed " \
"GetLastError() returns: 0x%x\n", GetLastError());
OutputDebugString(szTraceBuf);
DEBUGMSG(szTraceBuf);
}//end if bRet
dwIndex++;
sprintf(szTraceBuf,"dwIndex=%d",dwIndex);
DEBUGMSG(szTraceBuf);
//查找设备路径
//SP_DEVICE_INTERFACE_DETAIL_DATA strtDetailData;
//ZeroMemory(&strtDetailData, sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA));
//strtDetailData.cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail;
pDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)GlobalAlloc(LMEM_ZEROINIT, 1024);
pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
if (!SetupDiGetDeviceInterfaceDetail(hDevInfo,&devInterfaceData,
pDetail,1024,NULL,NULL))
{
GlobalFree(pDetail);
sprintf(szTraceBuf, "SetupDiGetDeviceInterfaceDetail failed " \
"GetLastError() returns: 0x%x\n", GetLastError());
DEBUGMSG(szTraceBuf);
continue;
}
// 找到了设备路径
CString m_strPath = pDetail->DevicePath;
// sCurusbNames.Add(m_strPath);
GlobalFree(pDetail);
WORD vid,pid;
sprintf(szTraceBuf,"m_strPath=%s",m_strPath.GetBuffer(0));
DEBUGMSG(szTraceBuf);
if(ParseDevicePath(m_strPath.GetBuffer(0),vid,pid))
{
//update bjcakey status
//g_bjcakeycallway_suport
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 while
SetupDiDestroyDeviceInfoList(hDevInfo);
DEBUGMSG("SetupDiDestroyDeviceInfoList");
//*/
if(IsWin98())
EnumUsbDevice();
GetAllUSBKEYCertInfo();//读取当前USBKEY信息
return strResult.AllocSysString();
}
//通过更底层的方法
void CUSBKeyPnPActiveXCtrl::EnumUsbDevice()
{
char HCName[16];
int HCNum;
HANDLE hHCDev;
PCHAR leafName;
for(int i=0;;i++)
{
if(g_bjcakeycallway_suport[i].dwVendorID == 0)
break;
g_bjcakeycallway_suport[i].isExist = 0;
}
for(i=0;i<MAX_CERT_COUNT;i++)
{
g_AllCertInfo[i].isValide = FALSE;
}
for (HCNum = 0; HCNum < NUM_HCS_TO_CHECK; HCNum++)
{
wsprintf(HCName, "\\\\.\\HCD%d", HCNum);
hHCDev = CreateFile(HCName,
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if (hHCDev == INVALID_HANDLE_VALUE)
{
break;
}
leafName = HCName + sizeof("\\\\.\\") - sizeof("");
PCHAR rootHubName;
rootHubName =(char*) GetRootHubName(hHCDev);
if(rootHubName == NULL)
{
CloseHandle(hHCDev);
break;
}
CloseHandle(hHCDev);
EnumerateHub(rootHubName);
free(rootHubName);
}//end for
}
/*
void CUSBKeyPnPActiveXCtrl::EnumUsbDevice()
{
char HCName[16];
int HCNum;
HANDLE hHCDev;
PCHAR rootHubName;
PCHAR leafName;
CString strShow;
ULONG index;
BOOL success;
PUSB_NODE_CONNECTION_INFORMATION connectionInfo;
HANDLE hHubDevice;
for(int i=0;;i++)
{
if(g_bjcakeycallway_suport[i].dwVendorID == 0)
break;
g_bjcakeycallway_suport[i].isExist = 0;
}
for(i=0;i<MAX_CERT_COUNT;i++)
{
g_AllCertInfo[i].isValide = FALSE;
}
for (HCNum = 0; HCNum < NUM_HCS_TO_CHECK; HCNum++)
{
wsprintf(HCName, "\\\\.\\HCD%d", HCNum);
hHCDev = CreateFile(HCName,
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if (hHCDev != INVALID_HANDLE_VALUE)
{
strShow.Format("\r\n找到USB控制器:%d\r\n",HCNum+1);
}
else
{
CloseHandle(hHCDev);
break;
}
leafName = HCName + sizeof("\\\\.\\") - sizeof("");
strShow.Format("USB控制器名称:%s\r\n",leafName);
ULONG nBytes;
rootHubName =(char*) GetRootHubName(hHCDev);
if(rootHubName==NULL)
{
strShow.Format("错误!\r\n");
CloseHandle(hHCDev);
break;
}
strShow.Format("USB Hub名称:\r\n%s\r\n",rootHubName);
PUSB_NODE_INFORMATION HubInfo;
HubInfo = (PUSB_NODE_INFORMATION)malloc(sizeof(USB_NODE_INFORMATION));
PCHAR deviceName;
deviceName = (PCHAR)malloc(strlen(rootHubName) + sizeof("\\\\.\\"));
if (rootHubName != NULL)
{
strcpy(deviceName, "\\\\.\\");
strcpy(deviceName + sizeof("\\\\.\\") - 1, rootHubName);
hHubDevice = CreateFile(deviceName,
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
free(deviceName);
if (hHubDevice == INVALID_HANDLE_VALUE)
{
strShow.Format("错误!\r\n");
free(HubInfo);
CloseHandle(hHCDev);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -