Source file: /~heha/Mikrocontroller/Sternhimmel/PC.zip/usb-windows.cpp

#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

Detected encoding: UTF-80