2 * Copyright 2015 Aric Stewart
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 #define WIN32_NO_STATUS
27 #include "ddk/hidport.h"
28 #include "ddk/hidclass.h"
29 #include "ddk/hidpi.h"
31 #include "wine/list.h"
34 #define DEFAULT_POLL_INTERVAL 200
35 #define MAX_POLL_INTERVAL_MSEC 10000
37 typedef NTSTATUS (WINAPI
*pAddDevice
)(DRIVER_OBJECT
*DriverObject
, DEVICE_OBJECT
*PhysicalDeviceObject
);
39 /* Ring buffer functions */
40 struct ReportRingBuffer
;
42 typedef struct _BASE_DEVICE_EXTENSION
{
43 HID_DEVICE_EXTENSION deviceExtension
;
45 HID_COLLECTION_INFORMATION information
;
46 WINE_HIDP_PREPARSED_DATA
*preparseData
;
51 WCHAR device_id
[MAX_DEVICE_ID_LEN
];
52 WCHAR instance_id
[MAX_DEVICE_ID_LEN
];
53 struct ReportRingBuffer
*ring_buffer
;
59 /* Minidriver Specific stuff will end up here */
60 } BASE_DEVICE_EXTENSION
;
62 void RingBuffer_Write(struct ReportRingBuffer
*buffer
, void *data
) DECLSPEC_HIDDEN
;
63 UINT
RingBuffer_AddPointer(struct ReportRingBuffer
*buffer
) DECLSPEC_HIDDEN
;
64 void RingBuffer_RemovePointer(struct ReportRingBuffer
*ring
, UINT index
) DECLSPEC_HIDDEN
;
65 void RingBuffer_Read(struct ReportRingBuffer
*ring
, UINT index
, void *output
, UINT
*size
) DECLSPEC_HIDDEN
;
66 void RingBuffer_ReadNew(struct ReportRingBuffer
*buffer
, UINT index
, void *output
, UINT
*size
) DECLSPEC_HIDDEN
;
67 UINT
RingBuffer_GetBufferSize(struct ReportRingBuffer
*buffer
) DECLSPEC_HIDDEN
;
68 UINT
RingBuffer_GetSize(struct ReportRingBuffer
*buffer
) DECLSPEC_HIDDEN
;
69 void RingBuffer_Destroy(struct ReportRingBuffer
*buffer
) DECLSPEC_HIDDEN
;
70 struct ReportRingBuffer
* RingBuffer_Create(UINT buffer_size
) DECLSPEC_HIDDEN
;
71 NTSTATUS
RingBuffer_SetSize(struct ReportRingBuffer
*buffer
, UINT size
) DECLSPEC_HIDDEN
;
73 typedef struct _minidriver
77 HID_MINIDRIVER_REGISTRATION minidriver
;
79 PDRIVER_UNLOAD DriverUnload
;
82 PDRIVER_DISPATCH PNPDispatch
;
85 NTSTATUS
call_minidriver(ULONG code
, DEVICE_OBJECT
*device
, void *in_buff
, ULONG in_size
, void *out_buff
, ULONG out_size
) DECLSPEC_HIDDEN
;
86 minidriver
* find_minidriver(DRIVER_OBJECT
* driver
) DECLSPEC_HIDDEN
;
88 /* Internal device functions */
89 NTSTATUS
HID_CreateDevice(DEVICE_OBJECT
*native_device
, HID_MINIDRIVER_REGISTRATION
*driver
, DEVICE_OBJECT
**device
) DECLSPEC_HIDDEN
;
90 NTSTATUS
HID_LinkDevice(DEVICE_OBJECT
*device
) DECLSPEC_HIDDEN
;
91 void HID_DeleteDevice(HID_MINIDRIVER_REGISTRATION
*driver
, DEVICE_OBJECT
*device
) DECLSPEC_HIDDEN
;
92 void HID_StartDeviceThread(DEVICE_OBJECT
*device
) DECLSPEC_HIDDEN
;
94 NTSTATUS WINAPI
HID_Device_ioctl(DEVICE_OBJECT
*device
, IRP
*irp
) DECLSPEC_HIDDEN
;
95 NTSTATUS WINAPI
HID_Device_read(DEVICE_OBJECT
*device
, IRP
*irp
) DECLSPEC_HIDDEN
;
96 NTSTATUS WINAPI
HID_Device_write(DEVICE_OBJECT
*device
, IRP
*irp
) DECLSPEC_HIDDEN
;
97 NTSTATUS WINAPI
HID_Device_create(DEVICE_OBJECT
*device
, IRP
*irp
) DECLSPEC_HIDDEN
;
98 NTSTATUS WINAPI
HID_Device_close(DEVICE_OBJECT
*device
, IRP
*irp
) DECLSPEC_HIDDEN
;
99 NTSTATUS WINAPI
HID_PNP_Dispatch(DEVICE_OBJECT
*device
, IRP
*irp
) DECLSPEC_HIDDEN
;
101 /* Pseudo-Plug and Play support*/
102 NTSTATUS WINAPI
PNP_AddDevice(DRIVER_OBJECT
*driver
, DEVICE_OBJECT
* PDO
) DECLSPEC_HIDDEN
;
104 /* Parsing HID Report Descriptors into preparsed data */
105 WINE_HIDP_PREPARSED_DATA
* ParseDescriptor(BYTE
*descriptor
, unsigned int length
) DECLSPEC_HIDDEN
;