首页 > 编程知识 正文

重新枚举pci设备,usb复合设备的枚举

时间:2023-05-03 10:31:34 阅读:114389 作者:4611

我第一次学习VC,试着用MFC制作USB枚举,和大家分享经验。

本文利用微软的usbview源代码,在Visual Stdio2015中利用MFC编写了USB枚举。 首先,使用SetupDiGetClassDevs ()枚举GUID类型。 其中GUID选择guid _ dev接口_ USB _ device。 usbiodef.h头文件中还有很多GUID。

添加头文件。

# includehidsdi.h # includeusbiodef.h # include initguid.h # includewinioctl.h # pragma comment (lib,' hid.lib ' )

efine _ guid (guid _ dev interface _ USB _ device,0xA5DCBF10L,0x 6530,0x 11d 2,0x 90,0x1f,0x00,xc 0,0x4f,/* 3ab F6 f2d-71 C4-462 a-8a 92-1e 6861 e6af 27 */define _ guid (guid _ dev interface _ USB _ host _ controller,0x3ax3/* 4e 623 b20-cb14-11 D1-b331-00a0c 959 bb D2 */define _ guid (guid _ USB _ wmi _ STD _ data,0x4e623B201,0x c b14/* 4e 623 b20-cb14-11 D1-b331-00a0c 959 bb D2 */define _ guid (guid _ USB _ wmi _ STD _ notification,0x4e 65306;

选择GetDeviceProperty ()函数的第三个参数可获取设备信息。 这里得到了USB的名称、端口号等信息。 该函数的内部结构如下。

boolcusb _ enum DLG :3360 getdeviceproperty (in _ hdevinfodeviceinfoset,_ in _ PSP _ devinfo _ datadeviceinfodation Dion DWORD lastError; if(PPbuffer==null ) {return FALSE; } * Pp缓冲器=null; bresult=setupdigetdeviceregistryproperty (设备信息,设备信息,属性,空值,空值,0,请求长度); lastError=GetLastError (; if ((要求长度==0)|(bresult!=FALSE lastError!=ERROR_INSUFFICIENT_BUFFER ) {return FALSE; }*PPbuffer=(lptstr ) alloc )请求长度; if(PPbuffer==null ) {return FALSE; } bresult=setupdigetdeviceregistryproperty (设备信息,设备信息,属性,空,) PBYTE ) *ppBuffer,requi * Pp缓冲器=null; 返回假; }返回真; 创建MFC接口这是一个简单的按钮控件列表控件,列表控件属性View将更改为报告模式。 将成员变量m_listCtrl添加到列表控件中

CListCtrl m_listCtrl; 用初始化成员函数初始化列表控件。

boolcusb _ enum DLG :3360 oninitdialog ({ cdialog ex 33603360 onitdialog ) }; //向系统添加“关于.”菜单项

菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动// 执行此操作SetIcon(m_hIcon, TRUE);// 设置大图标SetIcon(m_hIcon, FALSE);// 设置小图标// TODO: 在此添加额外的初始化代码DWORD dwstyle = m_listCtrl.GetExtendedStyle();dwstyle |= LVS_EX_GRIDLINES;dwstyle |= LVS_EX_FULLROWSELECT;m_listCtrl.SetExtendedStyle(dwstyle);//m_listCtrl.GetHeaderCtrl()->EnableWindow(FALSE);//不允许拖动列表头改变列宽CRect rcList;m_listCtrl.GetClientRect(rcList);//获得控件坐标属性m_listCtrl.InsertColumn(0, _T("Device Description"), LVCFMT_CENTER, 150);m_listCtrl.InsertColumn(1, _T("PORT"), LVCFMT_CENTER, 150);m_listCtrl.InsertColumn(2, _T("Path"), LVCFMT_CENTER, rcList.Width()-300);return TRUE; // 除非将焦点设置到控件,否则返回 TRUE}

 添加枚举成员函数

BOOL CUSB_ENUMDlg::EnumerateAllDevicesWithGuid(){LPTSTR DeviceDescName;SP_DEVINFO_DATA DeviceInfoData;SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;GUID deviceId;DWORD strSize = 0, requiredSize = 0;ULONG DeviceInterfaceDetailSize;LPTSTR DeviceDriverName;TCHAR did[1024];LPTSTR locid;LPTSTR locdesc;//HidD_GetHidGuid(&deviceId);HDEVINFO handle;handle = SetupDiGetClassDevs(&GUID_DEVINTERFACE_USB_DEVICE,NULL,NULL,DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);bool result1 = FALSE;bool result2 = FALSE;UINT Count = 0;DWORD error;do {BOOL success;DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);success = SetupDiEnumDeviceInfo(handle, Count, &DeviceInfoData);if (success == FALSE){break;}result1 = GetDeviceProperty(handle,&DeviceInfoData,SPDRP_DEVICEDESC, //(0x00000000)&DeviceDescName);result1 = GetDeviceProperty(handle,&DeviceInfoData,SPDRP_DRIVER, //Registry Trees and Keys&DeviceDriverName);DWORD buffersize = 1024;DWORD req_bufsize = 0;DWORD DataT;if (!SetupDiGetDeviceInstanceId(handle,&DeviceInfoData,NULL,NULL,&req_bufsize)) {error = GetLastError();}SetupDiGetDeviceInstanceId(handle,&DeviceInfoData,did,req_bufsize,&requiredSize); //获得设备VID和PIDif (!GetDeviceProperty(handle,&DeviceInfoData,SPDRP_LOCATION_PATHS,&locid))continue;if (!GetDeviceProperty(handle,&DeviceInfoData,SPDRP_LOCATION_INFORMATION,&locdesc))continue;DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);result1 = SetupDiEnumDeviceInterfaces(handle,NULL,&GUID_DEVINTERFACE_USB_DEVICE,Count,&DeviceInterfaceData);SetupDiGetDeviceInterfaceDetail(handle,&DeviceInterfaceData,NULL,0,&strSize,NULL);requiredSize = strSize;char s[245];PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData = (SP_DEVICE_INTERFACE_DETAIL_DATA *)s;DeviceInterfaceDetailData->cbSize= sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);result2 = SetupDiGetDeviceInterfaceDetail(handle,&DeviceInterfaceData,DeviceInterfaceDetailData, //DeviceInterfaceDetailData->DevicePath为设备路径。strSize,&requiredSize,NULL);AddListCtrl(DeviceDescName, locdesc, DeviceInterfaceDetailData->DevicePath,Count);Count++;} while (result1);return TRUE;}

 列表添加信息功能的函数AddListCtrl内容如下。

BOOL CUSB_ENUMDlg::AddListCtrl(CString Name, CString Port, CString Path,UINT nCount){m_listCtrl.InsertItem(nCount, Port);m_listCtrl.SetItemText(nCount, 1, Name);m_listCtrl.SetItemText(nCount, 2, Path);return TRUE;}

最后实现效果如下图,单击按钮列表出现枚举设备信息。

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。