(USB HID) VC++ 使用 SetupAPI 操作 USB HID Device

在VC裡頭使用 Api必須include 跟加入 lib,加入之後就可以在VC裡頭任意使用api了

暫時先貼上程式碼...等待有空時候在更新說明

1 extern "C"
2 {
3 #include <hidsdi.h>
4 #include <SetupAPI.h>
5 }

Dialog head file

 1 // CUsbHidDlg dialog
 2 class CUsbHidDlg : public CDialogEx
 3 {
 4 // Construction
 5 public:
 6     CUsbHidDlg(CWnd* pParent = NULL);    // standard constructor
 7
 8 // Dialog Data
 9     enum { IDD = IDD_USBHID_DIALOG };
10
11     protected:
12     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
13 public:
14     GUID                            HidGuid;
15     HDEVINFO                        DevInfo;
16     HIDD_ATTRIBUTES                    DevAttributes;
17     SP_DEVICE_INTERFACE_DATA        DevData;
18     PSP_DEVICE_INTERFACE_DETAIL_DATA DevDetail;
19     PHIDP_PREPARSED_DATA            PreparsedData;
20     HIDP_CAPS                        Capabilities;
21     ULONG                           Length;
22     int                             Index;
23     BOOL                            ok;
24     HANDLE                            DevHandle;
25     HANDLE                            RdHandle;
26     int                                DevCount = 0;
27
28     CEdit    m_VID;
29     CEdit    m_PID;
30     CEdit    m_OutID;
31     CEdit    m_InID;
32
33 // Implementation
34 protected:
35     HICON m_hIcon;
36
37     // Generated message map functions
38     virtual BOOL OnInitDialog();
39     afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
40     afx_msg void OnPaint();
41     afx_msg HCURSOR OnQueryDragIcon();
42     DECLARE_MESSAGE_MAP()
43 public:
44     afx_msg void OnBnClickedOk();
45
46 public:
47     BOOL FindHID();
48     BOOL DeviceWriteFile();
49     BOOL DeviceReadFile();
50     BOOL OutReport();
51     BOOL InReport();
52     afx_msg void OnBnClickedWritefile();
53     afx_msg void OnBnClickedReadfile();
54     afx_msg void OnBnClickedGetreport();
55     afx_msg void OnBnClickedSetreport();
56 };

FindHid

 1     uint16_t UVID;
 2     uint16_t UPID;
 3
 4     BOOL bSuccess;
 5     CString buf;
 6     int    index = -1;
 7     CloseHandle(DevHandle);
 8     DevHandle = INVALID_HANDLE_VALUE;
 9     HidD_GetHidGuid(&HidGuid);
10
11     wchar_t * wbuf = NULL;
12     byte ReportID;
13     GetDlgItemTextW(IDC_VID, buf);
14     UVID = wcstol(buf, &wbuf, 16);
15     GetDlgItemTextW(IDC_PID, buf);
16     UPID = wcstol(buf, &wbuf, 16);
17
18     buf.Format(_T("%08x-%04x-%04x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x\r\n"),
19                 HidGuid.Data1, HidGuid.Data2, HidGuid.Data3,
20                 HidGuid.Data4[0],
21                 HidGuid.Data4[1],
22                 HidGuid.Data4[2],
23                 HidGuid.Data4[3],
24                 HidGuid.Data4[4],
25                 HidGuid.Data4[5],
26                 HidGuid.Data4[6],
27                 HidGuid.Data4[7]);
28     SetDlgItemText(IDC_INFO, buf.MakeUpper());
29     ULONG predictedLength = 0;
30     ULONG requiredLength = 0;
31
32     DevInfo = SetupDiGetClassDevs(&HidGuid, NULL, NULL, (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE));
33     DevDetail = NULL;
34     DevData.cbSize = sizeof(SP_INTERFACE_DEVICE_DATA);
35
36     for (int i = 0; i < 128; i++)
37     {
38         bSuccess = SetupDiEnumDeviceInterfaces(DevInfo, 0, &HidGuid, i, &DevData);
39
40         if (!bSuccess) continue;
41         bSuccess = SetupDiGetDeviceInterfaceDetail(DevInfo, &DevData, NULL, 0, &predictedLength, NULL);
42         DevDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(predictedLength);
43         DevDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
44         bSuccess = SetupDiGetDeviceInterfaceDetail(DevInfo, &DevData, DevDetail, predictedLength, &requiredLength, NULL);
45         if (!bSuccess)
46         {
47             free(DevDetail);
48             DevDetail = NULL;
49             continue;
50         }
51         // origianl
52         DevHandle = CreateFile(DevDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING, 0, NULL);
53
54         if (DevHandle == INVALID_HANDLE_VALUE)
55         {
56             free(DevDetail);
57             DevDetail = NULL;
58             continue;
59         }
60
61         if (DevHandle != INVALID_HANDLE_VALUE)
62         {
63             HidD_GetAttributes(DevHandle, &DevAttributes);
64
65             if (!HidD_GetPreparsedData(DevHandle, &PreparsedData))
66             {
67                 CloseHandle(DevHandle);
68                 return 0;
69             }
70
71             if (!HidP_GetCaps(PreparsedData, &Capabilities))
72             {
73                 CloseHandle(DevHandle);
74                 return 0;
75             }
76
77
78             //if (DevAttributes.VendorID == V_ID && DevAttributes.ProductID == P_ID)
79             if (DevAttributes.VendorID == UVID && DevAttributes.ProductID == UPID)
80             {
81                 bSuccess = true;
82                 CString str;
83                 GetDlgItemTextW(IDC_INFO, str);
84                 buf.Format(_T("Find specified Usb Hid device.\r\nVID = 0x%x, PID = 0x%x\r\n"), DevAttributes.VendorID, DevAttributes.ProductID);
85                 str += buf;
86                 SetDlgItemTextW(IDC_INFO, str);
87                 break;
88             }
89             else
90             {
91                 CloseHandle(DevHandle);
92                 DevHandle = INVALID_HANDLE_VALUE;
93             }
94         }
95
96     }
97
98     SetupDiDestroyDeviceInfoList(DevInfo);
99     return bSuccess;

WriteFile

 1 BOOL CUsbHidDlg::DeviceWriteFile()
 2 {
 3     CString buf;
 4     CString temp;
 5     BOOL bRet;
 6     byte buffer[8] = { 0 };
 7     UINT len = 8;
 8     DWORD dRet;
 9     int ErrorCode;
10
11     wchar_t * wbuf = NULL;
12     byte ReportID;
13     GetDlgItemTextW(IDC_OUTID, buf);
14     ReportID = wcstol(buf, &wbuf, 16);
15
16     //ReportID = _ttoi(buf); Cstring to int
17     buffer[0] = ReportID; /* Out Report ID */
18
19     /* ok */
20     bRet = WriteFile(DevHandle, buffer, len, &dRet, NULL);
21
22     ErrorCode = GetLastError();
23
24     if (bRet){
25         buf.Format(_T("WriteFile Successful, check LED 3 !! \r\n"));
26         temp = buf;
27         SetDlgItemTextW(IDC_INFO, temp);
28     }
29     else{
30         buf.Format(_T("WriteFile Fail !!!\r\n"));
31         temp = buf;
32         SetDlgItemTextW(IDC_INFO, temp);
33     }
34
35     CString strMsg;
36     LPVOID lpMsgBuf;
37     FormatMessage(
38         FORMAT_MESSAGE_ALLOCATE_BUFFER |
39         FORMAT_MESSAGE_FROM_SYSTEM |
40         FORMAT_MESSAGE_IGNORE_INSERTS,
41         NULL,
42         ErrorCode,
43         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
44         (LPTSTR)&lpMsgBuf,
45         0,
46         NULL);
47     strMsg.Format(_T("\r\n錯誤訊息:%s\n錯誤代碼:0x%x\r\n"), lpMsgBuf, GetLastError());
48     buf += strMsg;
49     SetDlgItemTextW(IDC_INFO, buf);
50     LocalFree(lpMsgBuf); // 記得 free 掉空間
51     return bRet;
52 }

ReadFile

 1 BOOL CUsbHidDlg::DeviceReadFile()
 2 {
 3     CString temp, buf;
 4     BOOL bRet;
 5     byte buffer[8] = { 0 };
 6     UINT len = 8;
 7     DWORD dRet = 0;
 8     buffer[0] = 0x01;
 9
10     wchar_t * wbuf = NULL;
11     byte ReportID;
12     GetDlgItemTextW(IDC_INID, buf);
13     ReportID = wcstol(buf, &wbuf, 16);
14
15
16     buffer[0] = ReportID; /* Out Report ID */
17     //buffer[1] = 0x02;
18     //WriteFile(DevHandle, buffer, 8, &dRet, NULL);
19
20     bRet = ReadFile(DevHandle, &buffer[0], 8, &dRet, NULL);
21     int ErrorCode = GetLastError();
22
23     if (bRet){
24         buf.Format(_T("ReadFile Successful, check LED 4 !!! \r\nReadFile data = "));
25         temp = buf;
26
27         for (int i = 0; i < 8; i++){
28             buf.Format(_T("%.2x "), buffer[i]);
29             temp += buf;
30         }
31         temp += _T(".\r\n");
32
33         SetDlgItemTextW(IDC_INFO, temp);
34     }
35     else
36     {
37         temp.Format(_T("ReadFile Fail !!!\r\n"));
38         SetDlgItemTextW(IDC_INFO, temp);
39     }
40
41     CString strMsg;
42     LPVOID lpMsgBuf;
43     FormatMessage(
44         FORMAT_MESSAGE_ALLOCATE_BUFFER |
45         FORMAT_MESSAGE_FROM_SYSTEM |
46         FORMAT_MESSAGE_IGNORE_INSERTS,
47         NULL,
48         ErrorCode,
49         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
50         (LPTSTR)&lpMsgBuf,
51         0,
52         NULL);
53     strMsg.Format(_T("\r\n錯誤訊息:%s\n錯誤代碼:0x%x\r\n"), lpMsgBuf, GetLastError());
54     temp += strMsg;
55     SetDlgItemTextW(IDC_INFO, temp);
56     LocalFree(lpMsgBuf); // 記得 free 掉空間
57
58
59     return bRet;
60 }

OutReport

 1 BOOL CUsbHidDlg::OutReport()
 2 {
 3     BOOL bRet;
 4     CString buf;
 5     CString temp;
 6     byte buffer[8] = { 0 };
 7
 8     UINT len = 8;
 9     DWORD dRet;
10
11     wchar_t * wbuf = NULL;
12     byte ReportID;
13     GetDlgItemTextW(IDC_OUTID, buf);
14     ReportID = wcstol(buf, &wbuf, 16);
15
16     buffer[0] = ReportID; /* Out Report ID*/
17     buffer[1] = 0x02;
18     /* ok */
19     bRet = HidD_SetOutputReport(DevHandle, buffer, len);
20
21     if (bRet){
22         buf.Format(_T("Send Out Report Successful, check LED 5 !!! \r\n"));
23         temp = buf;
24         SetDlgItemTextW(IDC_INFO, temp);
25     }
26     else{
27         buf.Format(_T("Send Out Report Fail !!!\r\n"));
28         temp = buf;
29         SetDlgItemTextW(IDC_INFO, temp);
30     }
31
32     /* error message print */
33     CString strMsg;
34     LPVOID lpMsgBuf;
35     FormatMessage(
36         FORMAT_MESSAGE_ALLOCATE_BUFFER |
37         FORMAT_MESSAGE_FROM_SYSTEM |
38         FORMAT_MESSAGE_IGNORE_INSERTS,
39         NULL,
40         GetLastError(),
41         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
42         (LPTSTR)&lpMsgBuf,
43         0,
44         NULL);
45     strMsg.Format(_T("\r\n錯誤訊息:%s\n錯誤代碼:0x%x\r\n"), lpMsgBuf, GetLastError());
46     buf += strMsg;
47     SetDlgItemTextW(IDC_INFO, buf);
48     LocalFree(lpMsgBuf); // 記得 free 掉空間
49     /* error message print */
50
51     return bRet;
52 }

InReprot

 1 BOOL CUsbHidDlg::InReport()
 2 {
 3     BOOL bRet;
 4     CString temp, buf;
 5     byte buffer[8] = { 0 };
 6     DWORD dRet;
 7     UINT len = 8;
 8
 9     wchar_t * wbuf = NULL;
10     byte ReportID;
11     GetDlgItemTextW(IDC_INID, buf);
12     ReportID = wcstol(buf, &wbuf, 16);
13
14     buffer[0] = ReportID; /* IN Report ID*/
15
16     /* ok */
17     bRet = HidD_GetInputReport(DevHandle, buffer, len);
18     if (bRet){
19         buf.Format(_T("Get In Report Successful, check LED 6 !!! \r\n"));
20         temp = buf;
21         SetDlgItemTextW(IDC_INFO, temp);
22     }
23     else
24     {
25         buf.Format(_T("Get In Report Fail !!! \r\n"));
26         temp = buf;
27         SetDlgItemTextW(IDC_INFO, temp);
28     }
29
30     /* error message print */
31     CString strMsg;
32     LPVOID lpMsgBuf;
33     FormatMessage(
34         FORMAT_MESSAGE_ALLOCATE_BUFFER |
35         FORMAT_MESSAGE_FROM_SYSTEM |
36         FORMAT_MESSAGE_IGNORE_INSERTS,
37         NULL,
38         GetLastError(),
39         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
40         (LPTSTR)&lpMsgBuf,
41         0,
42         NULL);
43     strMsg.Format(_T("\r\n錯誤訊息:%s\n錯誤代碼:0x%x\r\n"), lpMsgBuf, GetLastError());
44     buf += strMsg;
45     SetDlgItemTextW(IDC_INFO, buf);
46     LocalFree(lpMsgBuf); // 記得 free 掉空間
47     /* error message print */
48     return bRet;
49 }

原文地址:https://www.cnblogs.com/ollie-lin/p/10222913.html

时间: 2024-11-19 05:28:25

(USB HID) VC++ 使用 SetupAPI 操作 USB HID Device的相关文章

VC++ 6.0 C8051F340 USB 通信 CAN 数据解析

// HelloWorld.cpp : Defines the entry point for the console application. // /***************************************************************************** * VC++ 6.0 C8051F340 USB 通信 CAN 数据解析 * 声明: * 1. 这是在<VC++ 6.0 C8051F340 USB PC侧通信 Demo>的基础上的代码:

VC++ 6.0 C8051F340 USB PC侧通信 Demo

// HelloWorld.cpp : Defines the entry point for the console application. // /*************************************************************************** * VC++ 6.0 C8051F340 USB 通信 Demo * 声明: * 1. 本程序另外需要C8051F340单片机程序配合: * 2. 本程序是在拥有SiUSBXp.h.SiUSBX

写了一个DELPHI操作USB摄像头类分享给大家

最近在使用Usb摄像头做了个项目,其中写了一个操作usb摄像头类分享给大家 {*******************************************************} { } { 操作USB摄像头类 } { } { 作者:lqen } { 日期:2015.05.18 } { } {*******************************************************} unit untUsbCamera; interface uses Window

【转】Arduino 控制USB设备(5)解析USB键盘的例子

下面是一个获得 USB 键盘数据的例子[参考1].原理上说,是将键盘切换为 Boot Protocol 这样就避免了需要具体解析HID的麻烦. 001 /* MAX3421E USB Host controller LCD/keyboard demonstration */ 002 //#include <Spi.h> 003 #include "Max3421e.h" 004 #include "Usb.h" 005   006 /* keyboard

USB系列之二:读取USB设备的描述符

在前面的文章中,我们已经给出了USB协议的链接地址,从这篇文章起,我们会涉及到许多USB 1.1的内容,我们的指导思想是先从熟悉USB 1.1协议入手,先使用现成的HCD和USBD,直接面对客户端驱动编程,尽快看到成果,使读者对USB的开发充满信心,进而去研究USBD和HCD的编程方法.请读者自行阅读协议,文章中有关协议的详细情况,由于会涉及非常多的文字,恕不能过多解释.1.USB系统主机端的软件结构    一般来说,教科书或者协议上都会把USB主机端的软件说成有三层,第一层叫主机控制器驱动程序

Linux USB驱动开发(一)—— USB设备基础概念

在终端用户看来,USB设备为主机提供了多种多样的附加功能,如文件传输,声音播放等,但对USB主机来说,它与所有USB设备的接口都是一致的.一个USB设备由3个功能模块组成:USB总线接口.USB逻辑设备和功能单元: a -- 这里的USB总线接口指的是USB设备中的串行接口引擎(SIE): b -- USB逻辑设备被USB系统软件看作是一个端点的集合: c -- 功能单元被客户软件看作是一个接口的集合.SIE.端点和接口都是USB设备的组成单元: 为了更好地描述USB设备的特征,USB提出了设备

你的USB设备还安全吗?USB的安全性已从根本上被打破!

前言: USB设备使用方便,但也可能被用来携带恶意软件.病毒,感染计算机系统.通过禁用自动播放功能.杀毒软件查杀.不定期的对设备进行格式化等操作可以确保它是干净的.但它存在的安全问题要比我们想象的更深,问题不仅在于它携带了什么,还在于通过它的工作方式就能产生安全隐患. USB隐藏的危险: 安全研究员Karsten Nohl 和Jakob Lell 发现了从根本上颠覆USB安全性的方法.他们创建的恶意软件,暂且称为BadUSB,可以被安装到USB设备中完全控制PC,无形中修改内存中的文件,甚至重定

Linux USB 驱动开发(一)—— USB设备基础概念【转】

本文转载自:http://blog.csdn.net/zqixiao_09/article/details/50984074 在终端用户看来,USB设备为主机提供了多种多样的附加功能,如文件传输,声音播放等,但对USB主机来说,它与所有USB设备的接口都是一致的.一个USB设备由3个功能模块组成:USB总线接口.USB逻辑设备和功能单元: a -- 这里的USB总线接口指的是USB设备中的串行接口引擎(SIE): b -- USB逻辑设备被USB系统软件看作是一个端点的集合: c -- 功能单元

供应虚拟机没有usb端口和无法识别映射usb解决方案

USB Server 是硬件的USB设备远程连接解决方案,USB Server采用1.2GHz的arm SO供一个千光网络接口和28个USB 2.0接口,满足高速应用需求.USB Server对电源做了特别确保28个USB端口均提供750mA的电流供应. 系统对国内应用得比较多的USB加密狗提供了完善的支持,有很好的兼容性.提供行业软件ukey共享,虚拟环境识别ukey解决方案,外网远程识别usb服务扫描仪共享,短信猫等.利用独有的专利技术,使得用户可以利用单一产品方案即可方便地在空间受限的环境