From: Aric Stewart Subject: [10/14]hid: Implement HidD_GetPreparsedData and HidD_FreePreparsedData Message-Id: <558C1B3C.6090508@codeweavers.com> Date: Thu, 25 Jun 2015 10:16:12 -0500 --- dlls/hid/hid.spec | 4 ++-- dlls/hid/hidd.c | 25 +++++++++++++++++++++++++ include/ddk/hidclass.h | 9 +++++++++ include/ddk/hidsdi.h | 2 ++ 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/dlls/hid/hid.spec b/dlls/hid/hid.spec index 5659a88..c72b0b8 100644 --- a/dlls/hid/hid.spec +++ b/dlls/hid/hid.spec @@ -1,5 +1,5 @@ @ stub HidD_FlushQueue -@ stub HidD_FreePreparsedData +@ stdcall HidD_FreePreparsedData(ptr) @ stub HidD_GetAttributes @ stub HidD_GetConfiguration @ stdcall HidD_GetFeature(long ptr long) @@ -10,7 +10,7 @@ @ stub HidD_GetMsGenreDescriptor @ stub HidD_GetNumInputBuffers @ stub HidD_GetPhysicalDescriptor -@ stub HidD_GetPreparsedData +@ stdcall HidD_GetPreparsedData(ptr ptr) @ stdcall HidD_GetProductString(long ptr long) @ stub HidD_GetSerialNumberString @ stub HidD_Hello diff --git a/dlls/hid/hidd.c b/dlls/hid/hidd.c index 5d783c0..744ea96 100644 --- a/dlls/hid/hidd.c +++ b/dlls/hid/hidd.c @@ -32,10 +32,19 @@ #include "winioctl.h" #include "ddk/wdm.h" +#include "hidusage.h" #include "ddk/hidclass.h" +#include "ddk/hidpi.h" WINE_DEFAULT_DEBUG_CHANNEL(hid); +BOOLEAN WINAPI HidD_FreePreparsedData(PHIDP_PREPARSED_DATA PreparsedData) +{ + TRACE("(%p)\n", PreparsedData); + HeapFree(GetProcessHeap(), 0, PreparsedData); + return TRUE; +} + BOOLEAN WINAPI HidD_GetFeature(HANDLE HidDeviceObject, PVOID ReportBuffer, ULONG ReportBufferLength) { TRACE("(%p %p %u)\n", HidDeviceObject, ReportBuffer, ReportBufferLength); @@ -65,3 +74,19 @@ BOOLEAN WINAPI HidD_GetProductString(HANDLE HidDeviceObject, PVOID Buffer, ULONG TRACE("(%p %p %u)\n", HidDeviceObject, Buffer, BufferLength); return DeviceIoControl(HidDeviceObject, IOCTL_HID_GET_PRODUCT_STRING, NULL, 0, Buffer, BufferLength, NULL, NULL); } + +BOOLEAN WINAPI HidD_GetPreparsedData(HANDLE HidDeviceObject, PHIDP_PREPARSED_DATA *PreparsedData) +{ + HID_COLLECTION_INFORMATION info; + BOOLEAN ret; + + TRACE("(%p %p)\n", HidDeviceObject, PreparsedData); + + ret = DeviceIoControl(HidDeviceObject, IOCTL_HID_GET_COLLECTION_INFORMATION, NULL, 0, &info, sizeof(HID_COLLECTION_INFORMATION), NULL, NULL); + + if (!ret) return FALSE; + *PreparsedData = HeapAlloc(GetProcessHeap(), 0, info.DescriptorSize); + + ret = DeviceIoControl(HidDeviceObject, IOCTL_HID_GET_COLLECTION_DESCRIPTOR, NULL, 0, *PreparsedData, info.DescriptorSize, NULL, NULL); + return ret; +} diff --git a/include/ddk/hidclass.h b/include/ddk/hidclass.h index 81f892d..09dc467 100644 --- a/include/ddk/hidclass.h +++ b/include/ddk/hidclass.h @@ -56,6 +56,15 @@ DEFINE_GUID (GUID_DEVINTERFACE_HID, \ #define IOCTL_HID_SET_DRIVER_CONFIG HID_BUFFER_CTL_CODE(101) #define IOCTL_HID_GET_MS_GENRE_DESCRIPTOR HID_OUT_CTL_CODE(121) +typedef struct _HID_COLLECTION_INFORMATION { + ULONG DescriptorSize; + BOOLEAN Polled; + UCHAR Reserved1[1]; + USHORT VendorID; + USHORT ProductID; + USHORT VersionNumber; +} HID_COLLECTION_INFORMATION, *PHID_COLLECTION_INFORMATION; + #ifdef __cplusplus } #endif diff --git a/include/ddk/hidsdi.h b/include/ddk/hidsdi.h index 5eb68ff..c8aae28 100644 --- a/include/ddk/hidsdi.h +++ b/include/ddk/hidsdi.h @@ -32,5 +32,7 @@ void WINAPI HidD_GetHidGuid(LPGUID guid); BOOLEAN WINAPI HidD_GetManufacturerString(HANDLE HidDeviceObject, PVOID Buffer, ULONG BufferLength); BOOLEAN WINAPI HidD_GetProductString(HANDLE HidDeviceObject, PVOID Buffer, ULONG BufferLength); BOOLEAN WINAPI HidD_SetFeature(HANDLE HidDeviceObject, PVOID ReportBuffer, ULONG ReportBufferLength); +BOOLEAN WINAPI HidD_GetPreparsedData( HANDLE HidDeviceObject, PHIDP_PREPARSED_DATA *PreparsedData); +BOOLEAN WINAPI HidD_FreePreparsedData(PHIDP_PREPARSED_DATA PreparsedData); #endif /* __WINE_HIDSDI_H */