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 ; 28 CEdit m_VID; 29 CEdit m_PID; 30 CEdit m_OutID; 31 CEdit m_InID; 33 // Implementation 34 protected : 35 HICON m_hIcon; 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(); 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;
 4     BOOL bSuccess;
 5     CString buf;
 6     int    index = -1;
 7     CloseHandle(DevHandle);
 8     DevHandle = INVALID_HANDLE_VALUE;
 9     HidD_GetHidGuid(&HidGuid);
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);
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;
32     DevInfo = SetupDiGetClassDevs(&HidGuid, NULL, NULL, (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE));
33     DevDetail = NULL;
34     DevData.cbSize = sizeof(SP_INTERFACE_DEVICE_DATA);
36     for (int i = 0; i < 128; i++)
37     {
38         bSuccess = SetupDiEnumDeviceInterfaces(DevInfo, 0, &HidGuid, i, &DevData);
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);
54         if (DevHandle == INVALID_HANDLE_VALUE)
55         {
56             free(DevDetail);
57             DevDetail = NULL;
58             continue;
59         }
61         if (DevHandle != INVALID_HANDLE_VALUE)
62         {
63             HidD_GetAttributes(DevHandle, &DevAttributes);
65             if (!HidD_GetPreparsedData(DevHandle, &PreparsedData))
66             {
67                 CloseHandle(DevHandle);
68                 return 0;
69             }
71             if (!HidP_GetCaps(PreparsedData, &Capabilities))
72             {
73                 CloseHandle(DevHandle);
74                 return 0;
75             }
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         }
96     }
98     SetupDiDestroyDeviceInfoList(DevInfo);
99     return bSuccess;

WriteFile

 1 BOOL CUsbHidDlg::DeviceWriteFile()
 3     CString buf;
 4     CString temp;
 5     BOOL bRet;
 6     byte buffer[8] = { 0 };
 7     UINT len = 8;
 8     DWORD dRet;
 9     int ErrorCode;
11     wchar_t * wbuf = NULL;
12     byte ReportID;
13     GetDlgItemTextW(IDC_OUTID, buf);
14     ReportID = wcstol(buf, &wbuf, 16);
16     //ReportID = _ttoi(buf); Cstring to int
17     buffer[0] = ReportID; /* Out Report ID */
19     /* ok */
20     bRet = WriteFile(DevHandle, buffer, len, &dRet, NULL);
22     ErrorCode = GetLastError();
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     }
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;

ReadFile

 1 BOOL CUsbHidDlg::DeviceReadFile()
 3     CString temp, buf;
 4     BOOL bRet;
 5     byte buffer[8] = { 0 };
 6     UINT len = 8;
 7     DWORD dRet = 0;
 8     buffer[0] = 0x01;
10     wchar_t * wbuf = NULL;
11     byte ReportID;
12     GetDlgItemTextW(IDC_INID, buf);
13     ReportID = wcstol(buf, &wbuf, 16);
16     buffer[0] = ReportID; /* Out Report ID */
17     //buffer[1] = 0x02;
18     //WriteFile(DevHandle, buffer, 8, &dRet, NULL);
20     bRet = ReadFile(DevHandle, &buffer[0], 8, &dRet, NULL);
21     int ErrorCode = GetLastError();
23     if (bRet){
24         buf.Format(_T("ReadFile Successful, check LED 4 !!! \r\nReadFile data = "));
25         temp = buf;
27         for (int i = 0; i < 8; i++){
28             buf.Format(_T("%.2x "), buffer[i]);
29             temp += buf;
30         }
31         temp += _T(".\r\n");
33         SetDlgItemTextW(IDC_INFO, temp);
34     }
35     else
36     {
37         temp.Format(_T("ReadFile Fail !!!\r\n"));
38         SetDlgItemTextW(IDC_INFO, temp);
39     }
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 掉空間
59     return bRet;

OutReport

 1 BOOL CUsbHidDlg::OutReport()
 3     BOOL bRet;
 4     CString buf;
 5     CString temp;
 6     byte buffer[8] = { 0 };
 8     UINT len = 8;
 9     DWORD dRet;
11     wchar_t * wbuf = NULL;
12     byte ReportID;
13     GetDlgItemTextW(IDC_OUTID, buf);
14     ReportID = wcstol(buf, &wbuf, 16);
16     buffer[0] = ReportID; /* Out Report ID*/
17     buffer[1] = 0x02; 
18     /* ok */
19     bRet = HidD_SetOutputReport(DevHandle, buffer, len);
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     }
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 */
51     return bRet;

InReprot

 1 BOOL CUsbHidDlg::InReport()
 3     BOOL bRet;
 4     CString temp, buf;
 5     byte buffer[8] = { 0 };
 6     DWORD dRet;
 7     UINT len = 8;
 9     wchar_t * wbuf = NULL;
10     byte ReportID;
11     GetDlgItemTextW(IDC_INID, buf);
12     ReportID = wcstol(buf, &wbuf, 16);
14     buffer[0] = ReportID; /* IN Report ID*/
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     }
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;