#include <windows.h>
#include <setupapi.h>
extern "C" {
#include <hidsdi.h>
#include <hidpi.h>
}
#include "usbcalls.h"
EXTERN_C HANDLE usbOpenDevice(int n, USHORT vendor, LPCSTR vendorName, USHORT product, LPCSTR productName) {
HANDLE h;
GUID hidGuid;
HidD_GetHidGuid(&hidGuid);
HDEVINFO InfoList = SetupDiGetClassDevs(&hidGuid,NULL,NULL,DIGCF_PRESENT|DIGCF_INTERFACEDEVICE);
n++;
SP_DEVICE_INTERFACE_DATA Info;
Info.cbSize = sizeof(Info);
for (int i=0;n;i++){
if (!SetupDiEnumDeviceInterfaces(InfoList,0,&hidGuid,i,&Info)) break;
struct{
SP_DEVICE_INTERFACE_DETAIL_DATA h;
TCHAR Path[MAX_PATH-1];
}Details;
DWORD size=sizeof(Details);
Details.h.cbSize = sizeof(Details.h);
SetupDiGetDeviceInterfaceDetail(InfoList,&Info,&Details.h,size,&size,NULL);
h=CreateFile(Details.Path,GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
if (h==INVALID_HANDLE_VALUE) h=0;
if (h) {
HIDD_ATTRIBUTES Attributes;
Attributes.Size = sizeof(Attributes);
if (HidD_GetAttributes(h,&Attributes)
&& Attributes.VendorID == vendor
&& Attributes.ProductID == product) {
TCHAR buf[256];
if ((!vendorName
|| HidD_GetManufacturerString(h,buf,sizeof(buf))
&& !lstrcmp(buf,vendorName)
)&&( !productName
|| HidD_GetProductString(h,buf,sizeof(buf))
&& !lstrcmp(buf,productName))) n--;
}
if (n) CloseHandle(h);
}
}
SetupDiDestroyDeviceInfoList(InfoList);
return n?0:h;
}
#if 0
int usbSetReport(usbDevice_t *device, int reportType, char *buffer, int len)
HANDLE handle = (HANDLE)device;
BOOLEAN rval = 0;
DWORD bytesWritten;
switch(reportType){
case USB_HID_REPORT_TYPE_INPUT: break;
case USB_HID_REPORT_TYPE_OUTPUT:
rval = WriteFile(handle, buffer, len, &bytesWritten, NULL);
break;
case USB_HID_REPORT_TYPE_FEATURE:
rval = HidD_SetFeature(handle, buffer, len);
break;
}
return rval == 0 ? USB_ERROR_IO : 0;
}
/* ------------------------------------------------------------------------ */
int usbGetReport(usbDevice_t *device, int reportType, int reportNumber, char *buffer, int *len)
{
HANDLE handle = (HANDLE)device;
BOOLEAN rval = 0;
DWORD bytesRead;
switch(reportType){
case USB_HID_REPORT_TYPE_INPUT:
buffer[0] = reportNumber;
rval = ReadFile(handle, buffer, *len, &bytesRead, NULL);
if(rval) *len = bytesRead;
break;
case USB_HID_REPORT_TYPE_OUTPUT: break;
case USB_HID_REPORT_TYPE_FEATURE:
buffer[0] = reportNumber;
rval = HidD_GetFeature(handle, buffer, *len);
break;
}
return rval == 0 ? USB_ERROR_IO : 0;
}
#endif
Vorgefundene Kodierung: ASCII (7 bit) | 2
|