#include "stdafx.h" #define BUFFER_LENGTH 100 void OnError(LPCSTR msg){ printf("%s", msg); exit(0); } int main(){ HANDLE hDevice = INVALID_HANDLE_VALUE; GUID guid; HMODULE hHidLib; //function pointers to HID.DLL addresses void (__stdcall *HidD_GetHidGuid)(OUT LPGUID HidGuid); bool (__stdcall *HidD_GetProductString)(IN HANDLE HidDeviceObject, OUT PVOID Buffer, IN ULONG BufferLength); bool (__stdcall *HidD_GetAttributes)(IN HANDLE HidDeviceObject, OUT void* Attributes); bool (__stdcall *HidD_SetFeature)(IN HANDLE HidDeviceObject, IN PVOID ReportBuffer, IN ULONG ReportBufferLength); bool (__stdcall *HidD_GetFeature)(IN HANDLE HidDeviceObject, OUT PVOID ReportBuffer, IN ULONG ReportBufferLength); bool (__stdcall *HidD_GetInputReport)(IN HANDLE HidDeviceObject, IN OUT PVOID ReportBuffer, IN ULONG ReportBufferLength); hHidLib = LoadLibrary("HID.DLL"); if (!hHidLib) OnError("Failed to load HID.DLL."); (FARPROC&) HidD_GetHidGuid = GetProcAddress(hHidLib, "HidD_GetHidGuid"); (FARPROC&) HidD_GetProductString = GetProcAddress(hHidLib, "HidD_GetProductString"); (FARPROC&) HidD_GetAttributes = GetProcAddress(hHidLib, "HidD_GetAttributes"); (FARPROC&) HidD_SetFeature = GetProcAddress(hHidLib, "HidD_SetFeature"); (FARPROC&) HidD_GetFeature = GetProcAddress(hHidLib, "HidD_GetFeature"); (FARPROC&) HidD_GetInputReport = GetProcAddress(hHidLib, "HidD_GetInputReport"); if ( !HidD_GetInputReport || !HidD_GetHidGuid || !HidD_GetAttributes || !HidD_GetProductString || !HidD_SetFeature || !HidD_GetFeature ){ OnError("Couldn’t find one or more HID entry points."); FreeLibrary(hHidLib); } //get GUID for HID devices (HidD_GetHidGuid)(&guid); HDEVINFO hDevInfo; hDevInfo = SetupDiGetClassDevs( &guid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE); if (hDevInfo == INVALID_HANDLE_VALUE){ FreeLibrary(hHidLib); OnError("Failed to open handle to HID device set."); } //try all HID devices DWORD dwIndex = 0; SP_DEVICE_INTERFACE_DATA devData; PSP_DEVICE_INTERFACE_DETAIL_DATA devDetailData = NULL; devData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); DWORD devDetailDataSize; DWORD ReqSize; while(SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &guid, dwIndex, &devData)){ dwIndex++; //probing for DevicePath helper struct length SetupDiGetDeviceInterfaceDetail(hDevInfo, &devData, NULL, 0, &devDetailDataSize, NULL); devDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA) malloc(devDetailDataSize); devDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); //getting DevicePath if (! SetupDiGetDeviceInterfaceDetail ( hDevInfo, &devData, devDetailData, devDetailDataSize, &ReqSize, NULL)){ SetupDiDestroyDeviceInfoList(hDevInfo); return FALSE; } //test vid and pid to find our device if (NULL != strstr(devDetailData->DevicePath, "vid_099d&pid_ff00")){ //opening handle for a device hDevice = CreateFile(devDetailData->DevicePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); break; }; //free allocated free(devDetailData); }//end of while //delete device information set SetupDiDestroyDeviceInfoList(hDevInfo); if (hDevice == INVALID_HANDLE_VALUE){ FreeLibrary(hHidLib); OnError("Failed to find or open device"); } //------------------- //working with device DWORD dwBytes; unsigned char pBuf[BUFFER_LENGTH]; pBuf[0] = 0; ReadFile(hDevice, pBuf, BUFFER_LENGTH, , &dwBytes, NULL); //another way dwBytes=BUFFER_LENGTH; pBuf[0] = 0 ; (HidD_GetInputReport)(hDevice, pBuf, dwBytes); //------------------- //closing device handle CloseHandle(hDevice); FreeLibrary(hHidLib); return 0; }