2 * ReactOS Hid User Library
3 * Copyright (C) 2004-2005 ReactOS Team
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 * PROJECT: ReactOS Hid User Library
23 * PURPOSE: ReactOS Hid User Library
24 * PROGRAMMER: Thomas Weidenmueller <w3seek@reactos.com>
31 HINSTANCE hDllInstance
;
33 /* device interface GUID for HIDClass devices */
34 const GUID HidClassGuid
= {0x4D1E55B2, 0xF16F, 0x11CF, {0x88,0xCB,0x00,0x11,0x11,0x00,0x00,0x30}};
37 DllMain(HINSTANCE hinstDLL
,
43 case DLL_PROCESS_ATTACH
:
44 hDllInstance
= hinstDLL
;
47 case DLL_THREAD_ATTACH
:
50 case DLL_THREAD_DETACH
:
53 case DLL_PROCESS_DETACH
:
61 * HidD_FlushQueue EXPORTED
67 HidD_FlushQueue(IN HANDLE HidDeviceObject
)
70 return DeviceIoControl(HidDeviceObject
, IOCTL_HID_FLUSH_QUEUE
,
78 * HidD_FreePreparsedData EXPORTED
84 HidD_FreePreparsedData(IN PHIDP_PREPARSED_DATA PreparsedData
)
86 return (LocalFree((HLOCAL
)PreparsedData
) == NULL
);
91 * HidD_GetAttributes EXPORTED
97 HidD_GetAttributes(IN HANDLE HidDeviceObject
,
98 OUT PHIDD_ATTRIBUTES Attributes
)
100 HID_COLLECTION_INFORMATION hci
;
103 if(!DeviceIoControl(HidDeviceObject
, IOCTL_HID_GET_COLLECTION_INFORMATION
,
105 &hci
, sizeof(HID_COLLECTION_INFORMATION
),
111 /* copy the fields */
112 Attributes
->Size
= sizeof(HIDD_ATTRIBUTES
);
113 Attributes
->VendorID
= hci
.VendorID
;
114 Attributes
->ProductID
= hci
.ProductID
;
115 Attributes
->VersionNumber
= hci
.VersionNumber
;
122 * HidP_GetButtonCaps EXPORTED
128 HidP_GetButtonCaps(IN HIDP_REPORT_TYPE ReportType
,
129 OUT PHIDP_BUTTON_CAPS ButtonCaps
,
130 IN OUT PULONG ButtonCapsLength
,
131 IN PHIDP_PREPARSED_DATA PreparsedData
)
133 return HidP_GetSpecificButtonCaps(ReportType
, 0, 0, 0, ButtonCaps
,
134 ButtonCapsLength
, PreparsedData
);
139 * HidD_GetFeature EXPORTED
145 HidD_GetFeature(IN HANDLE HidDeviceObject
,
146 OUT PVOID ReportBuffer
,
147 IN ULONG ReportBufferLength
)
150 return DeviceIoControl(HidDeviceObject
, IOCTL_HID_GET_FEATURE
,
152 ReportBuffer
, ReportBufferLength
,
158 * HidD_GetHidGuid EXPORTED
164 HidD_GetHidGuid(OUT LPGUID HidGuid
)
166 *HidGuid
= HidClassGuid
;
171 * HidD_GetInputReport EXPORTED
177 HidD_GetInputReport(IN HANDLE HidDeviceObject
,
178 IN OUT PVOID ReportBuffer
,
179 IN ULONG ReportBufferLength
)
182 return DeviceIoControl(HidDeviceObject
, IOCTL_HID_GET_INPUT_REPORT
,
184 ReportBuffer
, ReportBufferLength
,
190 * HidD_GetManufacturerString EXPORTED
196 HidD_GetManufacturerString(IN HANDLE HidDeviceObject
,
198 IN ULONG BufferLength
)
201 return DeviceIoControl(HidDeviceObject
, IOCTL_HID_GET_MANUFACTURER_STRING
,
203 Buffer
, BufferLength
,
209 * HidD_GetNumInputBuffers EXPORTED
215 HidD_GetNumInputBuffers(IN HANDLE HidDeviceObject
,
216 OUT PULONG NumberBuffers
)
219 return DeviceIoControl(HidDeviceObject
, IOCTL_GET_NUM_DEVICE_INPUT_BUFFERS
,
221 NumberBuffers
, sizeof(ULONG
),
227 * HidD_GetPhysicalDescriptor EXPORTED
233 HidD_GetPhysicalDescriptor(IN HANDLE HidDeviceObject
,
235 IN ULONG BufferLength
)
238 return DeviceIoControl(HidDeviceObject
, IOCTL_GET_PHYSICAL_DESCRIPTOR
,
240 Buffer
, BufferLength
,
246 * HidD_GetPreparsedData EXPORTED
252 HidD_GetPreparsedData(IN HANDLE HidDeviceObject
,
253 OUT PHIDP_PREPARSED_DATA
*PreparsedData
)
255 HID_COLLECTION_INFORMATION hci
;
259 if(PreparsedData
== NULL
)
264 if(!DeviceIoControl(HidDeviceObject
, IOCTL_HID_GET_COLLECTION_INFORMATION
,
266 &hci
, sizeof(HID_COLLECTION_INFORMATION
),
272 *PreparsedData
= LocalAlloc(LHND
, hci
.DescriptorSize
);
273 if(*PreparsedData
== NULL
)
275 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
279 Ret
= DeviceIoControl(HidDeviceObject
, IOCTL_HID_GET_COLLECTION_DESCRIPTOR
,
281 *PreparsedData
, hci
.DescriptorSize
,
286 /* FIXME - Free the buffer in case we failed to get the descriptor? */
287 LocalFree((HLOCAL
)*PreparsedData
);
292 /* should we truncate the memory in case RetLen < hci.DescriptorSize? */
301 * HidD_GetProductString EXPORTED
307 HidD_GetProductString(IN HANDLE HidDeviceObject
,
309 IN ULONG BufferLength
)
312 return DeviceIoControl(HidDeviceObject
, IOCTL_HID_GET_PRODUCT_STRING
,
314 Buffer
, BufferLength
,
320 * HidD_GetSerialNumberString EXPORTED
326 HidD_GetSerialNumberString(IN HANDLE HidDeviceObject
,
328 IN ULONG BufferLength
)
331 return DeviceIoControl(HidDeviceObject
, IOCTL_HID_GET_SERIALNUMBER_STRING
,
333 Buffer
, BufferLength
,
339 * HidP_GetValueCaps EXPORTED
345 HidP_GetValueCaps(IN HIDP_REPORT_TYPE ReportType
,
346 OUT PHIDP_VALUE_CAPS ValueCaps
,
347 IN OUT PULONG ValueCapsLength
,
348 IN PHIDP_PREPARSED_DATA PreparsedData
)
350 return HidP_GetSpecificValueCaps(ReportType
, 0, 0, 0, ValueCaps
,
351 ValueCapsLength
, PreparsedData
);
356 * HidD_Hello EXPORTED
358 * Undocumented easter egg function. It fills the buffer with "Hello\n"
359 * and returns number of bytes filled in (lstrlen(Buffer) + 1 == 7)
361 * Bugs: - doesn't check Buffer for NULL
362 * - always returns 7 even if BufferLength < 7 but doesn't produce a buffer overflow
368 HidD_Hello(OUT PCHAR Buffer
,
369 IN ULONG BufferLength
)
371 const CHAR HelloString
[] = "Hello\n";
375 memcpy(Buffer
, HelloString
, min(sizeof(HelloString
), BufferLength
));
378 return sizeof(HelloString
);
383 * HidD_SetFeature EXPORTED
389 HidD_SetFeature(IN HANDLE HidDeviceObject
,
390 IN PVOID ReportBuffer
,
391 IN ULONG ReportBufferLength
)
394 return DeviceIoControl(HidDeviceObject
, IOCTL_HID_SET_FEATURE
,
395 ReportBuffer
, ReportBufferLength
,
402 * HidD_SetNumInputBuffers EXPORTED
408 HidD_SetNumInputBuffers(IN HANDLE HidDeviceObject
,
409 IN ULONG NumberBuffers
)
412 return DeviceIoControl(HidDeviceObject
, IOCTL_SET_NUM_DEVICE_INPUT_BUFFERS
,
413 &NumberBuffers
, sizeof(ULONG
),
420 * HidD_SetOutputReport EXPORTED
426 HidD_SetOutputReport(IN HANDLE HidDeviceObject
,
427 IN PVOID ReportBuffer
,
428 IN ULONG ReportBufferLength
)
431 return DeviceIoControl(HidDeviceObject
, IOCTL_HID_SET_OUTPUT_REPORT
,
432 ReportBuffer
, ReportBufferLength
,
438 * HidD_GetIndexedString EXPORTED
444 HidD_GetIndexedString(IN HANDLE HidDeviceObject
,
445 IN ULONG StringIndex
,
447 IN ULONG BufferLength
)
450 return DeviceIoControl(HidDeviceObject
, IOCTL_HID_GET_INDEXED_STRING
,
451 &StringIndex
, sizeof(ULONG
),
452 Buffer
, BufferLength
,
457 * HidD_GetMsGenreDescriptor EXPORTED
463 HidD_GetMsGenreDescriptor(IN HANDLE HidDeviceObject
,
465 IN ULONG BufferLength
)
468 return DeviceIoControl(HidDeviceObject
, IOCTL_HID_GET_MS_GENRE_DESCRIPTOR
,
470 Buffer
, BufferLength
,
475 * HidD_GetConfiguration EXPORTED
481 HidD_GetConfiguration(IN HANDLE HidDeviceObject
,
482 OUT PHIDD_CONFIGURATION Configuration
,
483 IN ULONG ConfigurationLength
)
487 Configuration
->cookie
= (PVOID
)HidD_GetConfiguration
;
489 return DeviceIoControl(HidDeviceObject
, IOCTL_HID_GET_DRIVER_CONFIG
,
491 &Configuration
->size
, ConfigurationLength
- sizeof(ULONG
),
492 (PULONG
)&Configuration
->cookie
, NULL
) != 0;
496 * HidD_SetConfiguration EXPORTED
502 HidD_SetConfiguration(IN HANDLE HidDeviceObject
,
503 IN PHIDD_CONFIGURATION Configuration
,
504 IN ULONG ConfigurationLength
)
508 if (Configuration
->cookie
== (PVOID
)HidD_GetConfiguration
)
510 Ret
= DeviceIoControl(HidDeviceObject
, IOCTL_HID_SET_DRIVER_CONFIG
,
512 (PVOID
)&Configuration
->size
, ConfigurationLength
- sizeof(ULONG
),
513 (PULONG
)&Configuration
->cookie
, NULL
) != 0;
517 SetLastError(ERROR_INVALID_PARAMETER
);
524 * HidP_GetUsagesEx EXPORTED
530 HidP_GetUsagesEx(IN HIDP_REPORT_TYPE ReportType
,
531 IN USHORT LinkCollection
,
532 OUT PUSAGE_AND_PAGE ButtonList
,
533 IN OUT ULONG
*UsageLength
,
534 IN PHIDP_PREPARSED_DATA PreparsedData
,
536 IN ULONG ReportLength
)
538 return HidP_GetUsages(ReportType
, ButtonList
->UsagePage
, LinkCollection
, &ButtonList
->Usage
, UsageLength
, PreparsedData
, Report
, ReportLength
);