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
26 #include "wine/debug.h"
28 #define WIN32_NO_STATUS
37 #include "ddk/hidclass.h"
38 #include "ddk/hidsdi.h"
40 WINE_DEFAULT_DEBUG_CHANNEL(hid
);
42 static BOOL
sync_ioctl(HANDLE file
, DWORD code
, void *in_buf
, DWORD in_len
, void *out_buf
, DWORD out_len
)
48 ovl
.hEvent
= CreateEventW(NULL
, TRUE
, FALSE
, NULL
);
49 ret
= DeviceIoControl(file
, code
, in_buf
, in_len
, out_buf
, out_len
, &ret_len
, &ovl
);
50 if (!ret
&& GetLastError() == ERROR_IO_PENDING
)
51 ret
= GetOverlappedResult(file
, &ovl
, &ret_len
, TRUE
);
52 CloseHandle(ovl
.hEvent
);
56 BOOLEAN WINAPI
HidD_FreePreparsedData( PHIDP_PREPARSED_DATA preparsed_data
)
58 TRACE( "preparsed_data %p.\n", preparsed_data
);
59 free( preparsed_data
);
63 BOOLEAN WINAPI
HidD_GetAttributes( HANDLE file
, PHIDD_ATTRIBUTES attributes
)
65 HID_COLLECTION_INFORMATION info
;
68 TRACE( "file %p, attributes %p.\n", file
, attributes
);
70 ret
= sync_ioctl( file
, IOCTL_HID_GET_COLLECTION_INFORMATION
, NULL
, 0, &info
, sizeof(HID_COLLECTION_INFORMATION
) );
74 attributes
->Size
= sizeof(HIDD_ATTRIBUTES
);
75 attributes
->VendorID
= info
.VendorID
;
76 attributes
->ProductID
= info
.ProductID
;
77 attributes
->VersionNumber
= info
.VersionNumber
;
82 BOOLEAN WINAPI
HidD_GetFeature( HANDLE file
, void *report_buf
, ULONG report_len
)
84 TRACE( "file %p, report_buf %p, report_len %lu.\n", file
, report_buf
, report_len
);
85 return sync_ioctl( file
, IOCTL_HID_GET_FEATURE
, NULL
, 0, report_buf
, report_len
);
88 void WINAPI
HidD_GetHidGuid( GUID
*guid
)
90 TRACE( "guid %p.\n", guid
);
91 *guid
= GUID_DEVINTERFACE_HID
;
94 BOOLEAN WINAPI
HidD_GetInputReport( HANDLE file
, void *report_buf
, ULONG report_len
)
96 TRACE( "file %p, report_buf %p, report_len %lu.\n", file
, report_buf
, report_len
);
97 return sync_ioctl( file
, IOCTL_HID_GET_INPUT_REPORT
, NULL
, 0, report_buf
, report_len
);
100 BOOLEAN WINAPI
HidD_GetManufacturerString( HANDLE file
, void *buffer
, ULONG buffer_len
)
102 TRACE( "file %p, buffer %p, buffer_len %lu.\n", file
, buffer
, buffer_len
);
103 return sync_ioctl( file
, IOCTL_HID_GET_MANUFACTURER_STRING
, NULL
, 0, buffer
, buffer_len
);
106 BOOLEAN WINAPI
HidD_GetNumInputBuffers( HANDLE file
, ULONG
*num_buffer
)
108 TRACE( "file %p, num_buffer %p.\n", file
, num_buffer
);
109 return sync_ioctl( file
, IOCTL_GET_NUM_DEVICE_INPUT_BUFFERS
, NULL
, 0, num_buffer
, sizeof(*num_buffer
) );
112 BOOLEAN WINAPI
HidD_SetFeature( HANDLE file
, void *report_buf
, ULONG report_len
)
114 TRACE( "file %p, report_buf %p, report_len %lu.\n", file
, report_buf
, report_len
);
115 return sync_ioctl( file
, IOCTL_HID_SET_FEATURE
, report_buf
, report_len
, NULL
, 0 );
118 BOOLEAN WINAPI
HidD_SetNumInputBuffers( HANDLE file
, ULONG num_buffer
)
120 TRACE( "file %p, num_buffer %lu.\n", file
, num_buffer
);
121 return sync_ioctl( file
, IOCTL_SET_NUM_DEVICE_INPUT_BUFFERS
, &num_buffer
, sizeof(num_buffer
), NULL
, 0 );
124 BOOLEAN WINAPI
HidD_GetPhysicalDescriptor( HANDLE file
, void *buffer
, ULONG buffer_len
)
126 TRACE( "file %p, buffer %p, buffer_len %lu.\n", file
, buffer
, buffer_len
);
127 return sync_ioctl( file
, IOCTL_GET_PHYSICAL_DESCRIPTOR
, NULL
, 0, buffer
, buffer_len
);
130 BOOLEAN WINAPI
HidD_GetProductString( HANDLE file
, void *buffer
, ULONG buffer_len
)
132 TRACE( "file %p, buffer %p, buffer_len %lu.\n", file
, buffer
, buffer_len
);
133 return sync_ioctl( file
, IOCTL_HID_GET_PRODUCT_STRING
, NULL
, 0, buffer
, buffer_len
);
136 BOOLEAN WINAPI
HidD_GetSerialNumberString( HANDLE file
, void *buffer
, ULONG buffer_len
)
138 TRACE( "file %p, buffer %p, buffer_len %lu.\n", file
, buffer
, buffer_len
);
139 return sync_ioctl( file
, IOCTL_HID_GET_SERIALNUMBER_STRING
, NULL
, 0, buffer
, buffer_len
);
142 BOOLEAN WINAPI
HidD_GetPreparsedData( HANDLE file
, PHIDP_PREPARSED_DATA
*preparsed_data
)
144 HID_COLLECTION_INFORMATION info
;
145 PHIDP_PREPARSED_DATA data
;
147 TRACE( "file %p, preparsed_data %p.\n", file
, preparsed_data
);
149 if (!sync_ioctl( file
, IOCTL_HID_GET_COLLECTION_INFORMATION
, NULL
, 0, &info
, sizeof(info
) ))
152 if (!(data
= malloc( info
.DescriptorSize
))) return FALSE
;
154 if (!sync_ioctl( file
, IOCTL_HID_GET_COLLECTION_DESCRIPTOR
, NULL
, 0, data
, info
.DescriptorSize
))
159 *preparsed_data
= data
;
163 BOOLEAN WINAPI
HidD_SetOutputReport( HANDLE file
, void *report_buf
, ULONG report_len
)
165 TRACE( "file %p, report_buf %p, report_len %lu.\n", file
, report_buf
, report_len
);
166 return sync_ioctl( file
, IOCTL_HID_SET_OUTPUT_REPORT
, report_buf
, report_len
, NULL
, 0 );
169 BOOLEAN WINAPI
HidD_GetIndexedString(HANDLE file
, ULONG index
, void *buffer
, ULONG length
)
171 TRACE( "file %p, index %lu, buffer %p, length %lu.\n", file
, index
, buffer
, length
);
172 return sync_ioctl(file
, IOCTL_HID_GET_INDEXED_STRING
, &index
, sizeof(index
), buffer
, length
);
175 BOOLEAN WINAPI
HidD_FlushQueue(HANDLE file
)
177 TRACE("file %p.\n", file
);
178 return sync_ioctl(file
, IOCTL_HID_FLUSH_QUEUE
, NULL
, 0, NULL
, 0);