|
|
|
@ -8,7 +8,7 @@ |
|
|
|
|
8/22/2009 |
|
|
|
|
|
|
|
|
|
Copyright 2009, All Rights Reserved. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
At the discretion of the user of this library, |
|
|
|
|
this software may be licensed under the terms of the |
|
|
|
|
GNU General Public License v3, a BSD-Style license, or the |
|
|
|
@ -181,7 +181,7 @@ static void register_error(hid_device *device, const char *op) |
|
|
|
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), |
|
|
|
|
(LPVOID)&msg, 0/*sz*/, |
|
|
|
|
NULL); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Get rid of the CR and LF that FormatMessage() sticks at the
|
|
|
|
|
end of the message. Thanks Microsoft! */ |
|
|
|
|
ptr = msg; |
|
|
|
@ -292,9 +292,9 @@ struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned shor |
|
|
|
|
|
|
|
|
|
/* Get information for all the devices belonging to the HID class. */ |
|
|
|
|
device_info_set = SetupDiGetClassDevsA(&InterfaceClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Iterate over each device in the HID class, looking for the right one. */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (;;) { |
|
|
|
|
HANDLE write_handle = INVALID_HANDLE_VALUE; |
|
|
|
|
DWORD required_size = 0; |
|
|
|
@ -305,7 +305,7 @@ struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned shor |
|
|
|
|
&InterfaceClassGuid, |
|
|
|
|
device_index, |
|
|
|
|
&device_interface_data); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!res) { |
|
|
|
|
/* A return of FALSE from this function means that
|
|
|
|
|
there are no more devices. */ |
|
|
|
@ -377,7 +377,7 @@ struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned shor |
|
|
|
|
/* Unable to open the device. */ |
|
|
|
|
//register_error(dev, "CreateFile");
|
|
|
|
|
goto cont_close; |
|
|
|
|
}
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Get the Vendor ID and Product ID for this device. */ |
|
|
|
@ -421,14 +421,14 @@ struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned shor |
|
|
|
|
|
|
|
|
|
HidD_FreePreparsedData(pp_data); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Fill out the record */ |
|
|
|
|
cur_dev->next = NULL; |
|
|
|
|
str = device_interface_detail_data->DevicePath; |
|
|
|
|
if (str) { |
|
|
|
|
len = strlen(str); |
|
|
|
|
cur_dev->path = (char*) calloc(len+1, sizeof(char)); |
|
|
|
|
strncpy(cur_dev->path, str, len+1); |
|
|
|
|
strncpy(cur_dev->path, str, sizeof(cur_dev->path)); |
|
|
|
|
cur_dev->path[len] = '\0'; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
@ -521,7 +521,7 @@ HID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsi |
|
|
|
|
struct hid_device_info *devs, *cur_dev; |
|
|
|
|
const char *path_to_open = NULL; |
|
|
|
|
hid_device *handle = NULL; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
devs = hid_enumerate(vendor_id, product_id); |
|
|
|
|
cur_dev = devs; |
|
|
|
|
while (cur_dev) { |
|
|
|
@ -547,7 +547,7 @@ HID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsi |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
hid_free_enumeration(devs); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return handle; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -590,7 +590,7 @@ HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path) |
|
|
|
|
} |
|
|
|
|
nt_res = HidP_GetCaps(pp_data, &caps); |
|
|
|
|
if (nt_res != HIDP_STATUS_SUCCESS) { |
|
|
|
|
register_error(dev, "HidP_GetCaps");
|
|
|
|
|
register_error(dev, "HidP_GetCaps"); |
|
|
|
|
goto err_pp_data; |
|
|
|
|
} |
|
|
|
|
dev->output_report_length = caps.OutputReportByteLength; |
|
|
|
@ -603,7 +603,7 @@ HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path) |
|
|
|
|
|
|
|
|
|
err_pp_data: |
|
|
|
|
HidD_FreePreparsedData(pp_data); |
|
|
|
|
err:
|
|
|
|
|
err: |
|
|
|
|
free_hid_device(dev); |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
@ -636,7 +636,7 @@ int HID_API_EXPORT HID_API_CALL hid_write(hid_device *dev, const unsigned char * |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
res = WriteFile(dev->device_handle, buf, length, NULL, &ol); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!res) { |
|
|
|
|
if (GetLastError() != ERROR_IO_PENDING) { |
|
|
|
|
/* WriteFile() failed. Return error. */ |
|
|
|
@ -679,7 +679,7 @@ int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char |
|
|
|
|
memset(dev->read_buf, 0, dev->input_report_length); |
|
|
|
|
ResetEvent(ev); |
|
|
|
|
res = ReadFile(dev->device_handle, dev->read_buf, dev->input_report_length, &bytes_read, &dev->ol); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!res) { |
|
|
|
|
if (GetLastError() != ERROR_IO_PENDING) { |
|
|
|
|
/* ReadFile() has failed.
|
|
|
|
@ -705,7 +705,7 @@ int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char |
|
|
|
|
we are in non-blocking mode. Get the number of bytes read. The actual |
|
|
|
|
data has been copied to the data[] array which was passed to ReadFile(). */ |
|
|
|
|
res = GetOverlappedResult(dev->device_handle, &dev->ol, &bytes_read, TRUE/*wait*/); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Set pending back to false, even if GetOverlappedResult() returned error. */ |
|
|
|
|
dev->read_pending = FALSE; |
|
|
|
|
|
|
|
|
@ -725,13 +725,13 @@ int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char |
|
|
|
|
memcpy(data, dev->read_buf, copy_len); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end_of_function: |
|
|
|
|
if (!res) { |
|
|
|
|
register_error(dev, "GetOverlappedResult"); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return copy_len; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -876,7 +876,7 @@ HID_API_EXPORT const wchar_t * HID_API_CALL hid_error(hid_device *dev) |
|
|
|
|
/*#define PICPGM*/ |
|
|
|
|
/*#define S11*/ |
|
|
|
|
#define P32 |
|
|
|
|
#ifdef S11 |
|
|
|
|
#ifdef S11 |
|
|
|
|
unsigned short VendorID = 0xa0a0; |
|
|
|
|
unsigned short ProductID = 0x0001; |
|
|
|
|
#endif |
|
|
|
@ -906,7 +906,7 @@ int __cdecl main(int argc, char* argv[]) |
|
|
|
|
memset(buf,0x00,sizeof(buf)); |
|
|
|
|
buf[0] = 0; |
|
|
|
|
buf[1] = 0x81; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Open the device. */ |
|
|
|
|
int handle = open(VendorID, ProductID, L"12345"); |
|
|
|
|