(USB HID) VC++ 使用 SetupAPI 操作 USB HID Device
在VC裡頭使用 Api必須include 跟加入 lib,加入之後就可以在VC裡頭任意使用api了
暫時先貼上程式碼...等待有空時候在更新說明
extern "C"
{
#include <hidsdi.h>
#include <SetupAPI.h>
}

Dialog head file
// CUsbHidDlg dialog
class CUsbHidDlg : public CDialogEx
{
// Construction
public:
CUsbHidDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data
enum { IDD = IDD_USBHID_DIALOG }; protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
public:
GUID HidGuid;
HDEVINFO DevInfo;
HIDD_ATTRIBUTES DevAttributes;
SP_DEVICE_INTERFACE_DATA DevData;
PSP_DEVICE_INTERFACE_DETAIL_DATA DevDetail;
PHIDP_PREPARSED_DATA PreparsedData;
HIDP_CAPS Capabilities;
ULONG Length;
int Index;
BOOL ok;
HANDLE DevHandle;
HANDLE RdHandle;
int DevCount = ; CEdit m_VID;
CEdit m_PID;
CEdit m_OutID;
CEdit m_InID; // Implementation
protected:
HICON m_hIcon; // Generated message map functions
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedOk(); public:
BOOL FindHID();
BOOL DeviceWriteFile();
BOOL DeviceReadFile();
BOOL OutReport();
BOOL InReport();
afx_msg void OnBnClickedWritefile();
afx_msg void OnBnClickedReadfile();
afx_msg void OnBnClickedGetreport();
afx_msg void OnBnClickedSetreport();
};
FindHid
uint16_t UVID;
uint16_t UPID; BOOL bSuccess;
CString buf;
int index = -;
CloseHandle(DevHandle);
DevHandle = INVALID_HANDLE_VALUE;
HidD_GetHidGuid(&HidGuid); wchar_t * wbuf = NULL;
byte ReportID;
GetDlgItemTextW(IDC_VID, buf);
UVID = wcstol(buf, &wbuf, );
GetDlgItemTextW(IDC_PID, buf);
UPID = wcstol(buf, &wbuf, ); buf.Format(_T("%08x-%04x-%04x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x\r\n"),
HidGuid.Data1, HidGuid.Data2, HidGuid.Data3,
HidGuid.Data4[],
HidGuid.Data4[],
HidGuid.Data4[],
HidGuid.Data4[],
HidGuid.Data4[],
HidGuid.Data4[],
HidGuid.Data4[],
HidGuid.Data4[]);
SetDlgItemText(IDC_INFO, buf.MakeUpper());
ULONG predictedLength = ;
ULONG requiredLength = ; DevInfo = SetupDiGetClassDevs(&HidGuid, NULL, NULL, (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE));
DevDetail = NULL;
DevData.cbSize = sizeof(SP_INTERFACE_DEVICE_DATA); for (int i = ; i < ; i++)
{
bSuccess = SetupDiEnumDeviceInterfaces(DevInfo, , &HidGuid, i, &DevData); if (!bSuccess) continue;
bSuccess = SetupDiGetDeviceInterfaceDetail(DevInfo, &DevData, NULL, , &predictedLength, NULL);
DevDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(predictedLength);
DevDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
bSuccess = SetupDiGetDeviceInterfaceDetail(DevInfo, &DevData, DevDetail, predictedLength, &requiredLength, NULL);
if (!bSuccess)
{
free(DevDetail);
DevDetail = NULL;
continue;
}
// origianl
DevHandle = CreateFile(DevDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING, , NULL); if (DevHandle == INVALID_HANDLE_VALUE)
{
free(DevDetail);
DevDetail = NULL;
continue;
} if (DevHandle != INVALID_HANDLE_VALUE)
{
HidD_GetAttributes(DevHandle, &DevAttributes); if (!HidD_GetPreparsedData(DevHandle, &PreparsedData))
{
CloseHandle(DevHandle);
return ;
} if (!HidP_GetCaps(PreparsedData, &Capabilities))
{
CloseHandle(DevHandle);
return ;
} //if (DevAttributes.VendorID == V_ID && DevAttributes.ProductID == P_ID)
if (DevAttributes.VendorID == UVID && DevAttributes.ProductID == UPID)
{
bSuccess = true;
CString str;
GetDlgItemTextW(IDC_INFO, str);
buf.Format(_T("Find specified Usb Hid device.\r\nVID = 0x%x, PID = 0x%x\r\n"), DevAttributes.VendorID, DevAttributes.ProductID);
str += buf;
SetDlgItemTextW(IDC_INFO, str);
break;
}
else
{
CloseHandle(DevHandle);
DevHandle = INVALID_HANDLE_VALUE;
}
} } SetupDiDestroyDeviceInfoList(DevInfo);
return bSuccess;
WriteFile
BOOL CUsbHidDlg::DeviceWriteFile()
{
CString buf;
CString temp;
BOOL bRet;
byte buffer[] = { };
UINT len = ;
DWORD dRet;
int ErrorCode; wchar_t * wbuf = NULL;
byte ReportID;
GetDlgItemTextW(IDC_OUTID, buf);
ReportID = wcstol(buf, &wbuf, ); //ReportID = _ttoi(buf); Cstring to int
buffer[] = ReportID; /* Out Report ID */ /* ok */
bRet = WriteFile(DevHandle, buffer, len, &dRet, NULL); ErrorCode = GetLastError(); if (bRet){
buf.Format(_T("WriteFile Successful, check LED 3 !! \r\n"));
temp = buf;
SetDlgItemTextW(IDC_INFO, temp);
}
else{
buf.Format(_T("WriteFile Fail !!!\r\n"));
temp = buf;
SetDlgItemTextW(IDC_INFO, temp);
} CString strMsg;
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
ErrorCode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf,
,
NULL);
strMsg.Format(_T("\r\n錯誤訊息:%s\n錯誤代碼:0x%x\r\n"), lpMsgBuf, GetLastError());
buf += strMsg;
SetDlgItemTextW(IDC_INFO, buf);
LocalFree(lpMsgBuf); // 記得 free 掉空間
return bRet;
}
ReadFile
BOOL CUsbHidDlg::DeviceReadFile()
{
CString temp, buf;
BOOL bRet;
byte buffer[] = { };
UINT len = ;
DWORD dRet = ;
buffer[] = 0x01; wchar_t * wbuf = NULL;
byte ReportID;
GetDlgItemTextW(IDC_INID, buf);
ReportID = wcstol(buf, &wbuf, ); buffer[] = ReportID; /* Out Report ID */
//buffer[1] = 0x02;
//WriteFile(DevHandle, buffer, 8, &dRet, NULL); bRet = ReadFile(DevHandle, &buffer[], , &dRet, NULL);
int ErrorCode = GetLastError(); if (bRet){
buf.Format(_T("ReadFile Successful, check LED 4 !!! \r\nReadFile data = "));
temp = buf; for (int i = ; i < ; i++){
buf.Format(_T("%.2x "), buffer[i]);
temp += buf;
}
temp += _T(".\r\n"); SetDlgItemTextW(IDC_INFO, temp);
}
else
{
temp.Format(_T("ReadFile Fail !!!\r\n"));
SetDlgItemTextW(IDC_INFO, temp);
} CString strMsg;
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
ErrorCode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf,
,
NULL);
strMsg.Format(_T("\r\n錯誤訊息:%s\n錯誤代碼:0x%x\r\n"), lpMsgBuf, GetLastError());
temp += strMsg;
SetDlgItemTextW(IDC_INFO, temp);
LocalFree(lpMsgBuf); // 記得 free 掉空間 return bRet;
}
OutReport
BOOL CUsbHidDlg::OutReport()
{
BOOL bRet;
CString buf;
CString temp;
byte buffer[] = { }; UINT len = ;
DWORD dRet; wchar_t * wbuf = NULL;
byte ReportID;
GetDlgItemTextW(IDC_OUTID, buf);
ReportID = wcstol(buf, &wbuf, ); buffer[] = ReportID; /* Out Report ID*/
buffer[] = 0x02;
/* ok */
bRet = HidD_SetOutputReport(DevHandle, buffer, len); if (bRet){
buf.Format(_T("Send Out Report Successful, check LED 5 !!! \r\n"));
temp = buf;
SetDlgItemTextW(IDC_INFO, temp);
}
else{
buf.Format(_T("Send Out Report Fail !!!\r\n"));
temp = buf;
SetDlgItemTextW(IDC_INFO, temp);
} /* error message print */
CString strMsg;
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf,
,
NULL);
strMsg.Format(_T("\r\n錯誤訊息:%s\n錯誤代碼:0x%x\r\n"), lpMsgBuf, GetLastError());
buf += strMsg;
SetDlgItemTextW(IDC_INFO, buf);
LocalFree(lpMsgBuf); // 記得 free 掉空間
/* error message print */ return bRet;
}
InReprot
BOOL CUsbHidDlg::InReport()
{
BOOL bRet;
CString temp, buf;
byte buffer[] = { };
DWORD dRet;
UINT len = ; wchar_t * wbuf = NULL;
byte ReportID;
GetDlgItemTextW(IDC_INID, buf);
ReportID = wcstol(buf, &wbuf, ); buffer[] = ReportID; /* IN Report ID*/ /* ok */
bRet = HidD_GetInputReport(DevHandle, buffer, len);
if (bRet){
buf.Format(_T("Get In Report Successful, check LED 6 !!! \r\n"));
temp = buf;
SetDlgItemTextW(IDC_INFO, temp);
}
else
{
buf.Format(_T("Get In Report Fail !!! \r\n"));
temp = buf;
SetDlgItemTextW(IDC_INFO, temp);
} /* error message print */
CString strMsg;
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf,
,
NULL);
strMsg.Format(_T("\r\n錯誤訊息:%s\n錯誤代碼:0x%x\r\n"), lpMsgBuf, GetLastError());
buf += strMsg;
SetDlgItemTextW(IDC_INFO, buf);
LocalFree(lpMsgBuf); // 記得 free 掉空間
/* error message print */
return bRet;
}
(USB HID) VC++ 使用 SetupAPI 操作 USB HID Device的更多相关文章
- 一个DELPHI操作USB摄像头类
最近在使用Usb摄像头做了个项目,其中写了一个操作usb摄像头类分享给大家 {*******************************************************} { } ...
- VC++ 6.0 C8051F340 USB 通信 CAN 数据解析
// HelloWorld.cpp : Defines the entry point for the console application. // /*********************** ...
- VC++ 6.0 C8051F340 USB PC侧通信 Demo
// HelloWorld.cpp : Defines the entry point for the console application. // /*********************** ...
- USB系列之二:读取USB设备的描述符
在前面的文章中,我们已经给出了USB协议的链接地址,从这篇文章起,我们会涉及到许多USB 1.1的内容,我们的指导思想是先从熟悉USB 1.1协议入手,先使用现成的HCD和USBD,直接面对客户端驱动 ...
- Linux usb子系统(一) _写一个usb鼠标驱动
USB总线是一种典型的热插拔的总线标准,由于其优异的性能几乎成为了当下大小设备中的标配. USB的驱动可以分为3类:SoC的USB控制器的驱动,主机端USB设备的驱动,设备上的USB Gadget驱动 ...
- 你的USB设备还安全吗?USB的安全性已从根本上被打破!
前言: USB设备使用方便,但也可能被用来携带恶意软件.病毒,感染计算机系统.通过禁用自动播放功能.杀毒软件查杀.不定期的对设备进行格式化等操作可以确保它是干净的.但它存在的安全问题要比我们想象的更深 ...
- Linux usb子系统(二):USB设备驱动usb-skeleton.c
usb驱动分为通过usbfs操作设备的用户空间驱动,内核空间的内核驱动.两者不能同时进行,否则容易引发对共享资源访问的问题,死锁!使用了内核驱动,就不能在usbfs里驱动该设备. 下面转载的一篇分析u ...
- android的USB MTP && USB CDC/USBnet(ECM, NCM, ACM) && USB gardget
MTP的全称是Media Transfer Protocol(媒体传输协议),它是微软公司提出的一套媒体文件传输协议.早在智能手机普及前,数码相机和MP3播放器等都使用了MTP的前身PTP(Pictu ...
- Linux USB 驱动开发(一)—— USB设备基础概念【转】
本文转载自:http://blog.csdn.net/zqixiao_09/article/details/50984074 在终端用户看来,USB设备为主机提供了多种多样的附加功能,如文件传输,声音 ...
随机推荐
- CloudStack 初始化执行命令流分析
查询路由元素 选择可以使用的路由元素 需要将网络服务提供者的:虚拟路由和安全同时启用 { "createnetworkresponse" : { ...
- cs4.1 编译与安装
cs4.1编译报 https://issues.apache.org/jira/browse/CLOUDSTACK-2913 cs4.1安装报
- ProxyPattern(23种设计模式之一)
设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计模式六大 ...
- Mysql Join语法以及性能优化
引言 内外联结的区别是内联结将去除所有不符合条件的记录,而外联结则保留其中部分.外左联结与外右联结的区别在于如果用A左联结B则A中所有记录都会保留在结果中,此时B中只有符合联结条件的记录,而右联结相反 ...
- [C++] any number to binary (Bit manipulation)
any number to binary (Bit manipulation)
- PollingProvider方法的使用及示例
来自<sencha touch权威指南>第12章,374页开始 ----------------------------------------------------- PollingP ...
- Python原始套接字编程-乾颐堂
在实验中需要自己构造单独的HTTP数据报文,而使用SOCK_STREAM进行发送数据包,需要进行完整的TCP交互. 因此想使用原始套接字进行编程,直接构造数据包,并在IP层进行发送,即采用SOCK_R ...
- 白盒测试实践项目(day2)
到目前为止: 李建文同学大体完成代码复审,并在完善文档,汪鸿同学和杨瑞丰同学都在熟悉各自的任务,胡俊辉同学设计了JUnit测试用例,张颖同学负责维护这几天的博客. 目前小组成员还未碰到不能解决的问题. ...
- PropertiesConfiguration 修改配置文件的信息,不打乱顺序
需引入jar包 <!-- https://mvnrepository.com/artifact/commons-configuration/commons-configuration --> ...
- 手动添加ceph的mds
1.在需要安装的目标机器上创建mds目录 mkdir -p / 2.生成mds的keyring,并将其写入/var/lib/ceph/mds/ceph-0/keyring文件中 ceph auth g ...