4 * Copyright (C) 2006 Kevin Koltzau
5 * Copyright (C) 2015 Aric Stewart
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
25 #include "wine/debug.h"
27 #define WIN32_NO_STATUS
35 #include "ddk/hidclass.h"
36 #include "ddk/hidsdi.h"
38 WINE_DEFAULT_DEBUG_CHANNEL(hid
);
40 static BOOL
sync_ioctl(HANDLE file
, DWORD code
, void *in_buf
, DWORD in_len
, void *out_buf
, DWORD out_len
)
46 ovl
.hEvent
= CreateEventW(NULL
, TRUE
, FALSE
, NULL
);
47 ret
= DeviceIoControl(file
, code
, in_buf
, in_len
, out_buf
, out_len
, &ret_len
, &ovl
);
48 if (!ret
&& GetLastError() == ERROR_IO_PENDING
)
49 ret
= GetOverlappedResult(file
, &ovl
, &ret_len
, TRUE
);
50 CloseHandle(ovl
.hEvent
);
54 BOOLEAN WINAPI
HidD_FreePreparsedData(PHIDP_PREPARSED_DATA PreparsedData
)
56 TRACE("(%p)\n", PreparsedData
);
57 HeapFree(GetProcessHeap(), 0, PreparsedData
);
61 BOOLEAN WINAPI
HidD_GetAttributes(HANDLE HidDeviceObject
, PHIDD_ATTRIBUTES Attr
)
63 HID_COLLECTION_INFORMATION info
;
66 TRACE("(%p %p)\n", HidDeviceObject
, Attr
);
68 ret
= sync_ioctl(HidDeviceObject
, IOCTL_HID_GET_COLLECTION_INFORMATION
, NULL
, 0, &info
, sizeof(HID_COLLECTION_INFORMATION
));
72 Attr
->Size
= sizeof(HIDD_ATTRIBUTES
);
73 Attr
->VendorID
= info
.VendorID
;
74 Attr
->ProductID
= info
.ProductID
;
75 Attr
->VersionNumber
= info
.VersionNumber
;
80 BOOLEAN WINAPI
HidD_GetFeature(HANDLE HidDeviceObject
, PVOID ReportBuffer
, ULONG ReportBufferLength
)
82 TRACE("(%p %p %u)\n", HidDeviceObject
, ReportBuffer
, ReportBufferLength
);
83 return sync_ioctl(HidDeviceObject
, IOCTL_HID_GET_FEATURE
, NULL
, 0, ReportBuffer
, ReportBufferLength
);
86 void WINAPI
HidD_GetHidGuid(LPGUID guid
)
88 TRACE("(%p)\n", guid
);
89 *guid
= GUID_DEVINTERFACE_HID
;
92 BOOLEAN WINAPI
HidD_GetInputReport(HANDLE HidDeviceObject
, PVOID ReportBuffer
, ULONG ReportBufferLength
)
94 TRACE("(%p %p %u)\n", HidDeviceObject
, ReportBuffer
, ReportBufferLength
);
95 return sync_ioctl(HidDeviceObject
, IOCTL_HID_GET_INPUT_REPORT
, NULL
, 0, ReportBuffer
, ReportBufferLength
);
98 BOOLEAN WINAPI
HidD_GetManufacturerString(HANDLE HidDeviceObject
, PVOID Buffer
, ULONG BufferLength
)
100 TRACE("(%p %p %u)\n", HidDeviceObject
, Buffer
, BufferLength
);
101 return sync_ioctl(HidDeviceObject
, IOCTL_HID_GET_MANUFACTURER_STRING
, NULL
, 0, Buffer
, BufferLength
);
104 BOOLEAN WINAPI
HidD_GetNumInputBuffers(HANDLE HidDeviceObject
, ULONG
*NumberBuffers
)
106 TRACE("(%p %p)\n", HidDeviceObject
, NumberBuffers
);
107 return sync_ioctl(HidDeviceObject
, IOCTL_GET_NUM_DEVICE_INPUT_BUFFERS
, NULL
, 0, NumberBuffers
, sizeof(*NumberBuffers
));
110 BOOLEAN WINAPI
HidD_SetFeature(HANDLE HidDeviceObject
, PVOID ReportBuffer
, ULONG ReportBufferLength
)
112 TRACE("(%p %p %u)\n", HidDeviceObject
, ReportBuffer
, ReportBufferLength
);
113 return sync_ioctl(HidDeviceObject
, IOCTL_HID_SET_FEATURE
, ReportBuffer
, ReportBufferLength
, NULL
, 0);
116 BOOLEAN WINAPI
HidD_SetNumInputBuffers(HANDLE HidDeviceObject
, ULONG NumberBuffers
)
118 TRACE("(%p %i)\n", HidDeviceObject
, NumberBuffers
);
119 return sync_ioctl(HidDeviceObject
, IOCTL_SET_NUM_DEVICE_INPUT_BUFFERS
, &NumberBuffers
, sizeof(NumberBuffers
), NULL
, 0);
122 BOOLEAN WINAPI
HidD_GetProductString(HANDLE HidDeviceObject
, PVOID Buffer
, ULONG BufferLength
)
124 TRACE("(%p %p %u)\n", HidDeviceObject
, Buffer
, BufferLength
);
125 return sync_ioctl(HidDeviceObject
, IOCTL_HID_GET_PRODUCT_STRING
, NULL
, 0, Buffer
, BufferLength
);
128 BOOLEAN WINAPI
HidD_GetSerialNumberString(HANDLE HidDeviceObject
, PVOID Buffer
, ULONG BufferLength
)
130 TRACE("(%p %p %u)\n", HidDeviceObject
, Buffer
, BufferLength
);
131 return sync_ioctl(HidDeviceObject
, IOCTL_HID_GET_SERIALNUMBER_STRING
, NULL
, 0, Buffer
, BufferLength
);
134 BOOLEAN WINAPI
HidD_GetPreparsedData(HANDLE HidDeviceObject
, PHIDP_PREPARSED_DATA
*PreparsedData
)
136 HID_COLLECTION_INFORMATION info
;
137 PHIDP_PREPARSED_DATA data
;
139 TRACE("(%p %p)\n", HidDeviceObject
, PreparsedData
);
141 if (!sync_ioctl(HidDeviceObject
, IOCTL_HID_GET_COLLECTION_INFORMATION
, NULL
, 0, &info
, sizeof(info
)))
144 if (!(data
= HeapAlloc(GetProcessHeap(), 0, info
.DescriptorSize
))) return FALSE
;
146 if (!sync_ioctl(HidDeviceObject
, IOCTL_HID_GET_COLLECTION_DESCRIPTOR
, NULL
, 0, data
, info
.DescriptorSize
))
148 HeapFree( GetProcessHeap(), 0, data
);
151 *PreparsedData
= data
;
155 BOOLEAN WINAPI
HidD_SetOutputReport(HANDLE HidDeviceObject
, void *ReportBuffer
, ULONG ReportBufferLength
)
157 TRACE("(%p %p %u)\n", HidDeviceObject
, ReportBuffer
, ReportBufferLength
);
158 return sync_ioctl(HidDeviceObject
, IOCTL_HID_SET_OUTPUT_REPORT
, ReportBuffer
, ReportBufferLength
, NULL
, 0);
161 BOOLEAN WINAPI
HidD_GetIndexedString(HANDLE file
, ULONG index
, void *buffer
, ULONG length
)
163 TRACE("file %p, index %u, buffer %p, length %u.\n", file
, index
, buffer
, length
);
164 return sync_ioctl(file
, IOCTL_HID_GET_INDEXED_STRING
, &index
, sizeof(index
), buffer
, length
);
167 BOOLEAN WINAPI
HidD_FlushQueue(HANDLE file
)
169 TRACE("file %p.\n", file
);
170 return sync_ioctl(file
, IOCTL_HID_FLUSH_QUEUE
, NULL
, 0, NULL
, 0);