2 * Copyright (C) 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
22 typedef enum _HIDP_REPORT_TYPE
29 typedef struct _HIDP_BUTTON_CAPS
35 USHORT LinkCollection
;
40 BOOLEAN IsStringRange
;
41 BOOLEAN IsDesignatorRange
;
60 USHORT DesignatorIndex
;
66 } HIDP_BUTTON_CAPS
, *PHIDP_BUTTON_CAPS
;
68 typedef struct _HIDP_VALUE_CAPS
74 USHORT LinkCollection
;
79 BOOLEAN IsStringRange
;
80 BOOLEAN IsDesignatorRange
;
100 USHORT DesignatorMax
;
109 USHORT DesignatorIndex
;
115 } HIDP_VALUE_CAPS
, *PHIDP_VALUE_CAPS
;
117 typedef struct _HIDP_PREPARSED_DATA
* PHIDP_PREPARSED_DATA
;
119 typedef struct _HIDP_CAPS
123 USHORT InputReportByteLength
;
124 USHORT OutputReportByteLength
;
125 USHORT FeatureReportByteLength
;
127 USHORT NumberLinkCollectionNodes
;
128 USHORT NumberInputButtonCaps
;
129 USHORT NumberInputValueCaps
;
130 USHORT NumberInputDataIndices
;
131 USHORT NumberOutputButtonCaps
;
132 USHORT NumberOutputValueCaps
;
133 USHORT NumberOutputDataIndices
;
134 USHORT NumberFeatureButtonCaps
;
135 USHORT NumberFeatureValueCaps
;
136 USHORT NumberFeatureDataIndices
;
137 } HIDP_CAPS
, *PHIDP_CAPS
;
139 typedef enum _HIDP_KEYBOARD_DIRECTION
{
142 } HIDP_KEYBOARD_DIRECTION
;
144 typedef struct _HIDP_KEYBOARD_MODIFIER_STATE
{
147 ULONG LeftControl
: 1;
151 ULONG RightControl
: 1;
162 } HIDP_KEYBOARD_MODIFIER_STATE
, *PHIDP_KEYBOARD_MODIFIER_STATE
;
164 typedef struct _USAGE_AND_PAGE
{
167 } USAGE_AND_PAGE
, *PUSAGE_AND_PAGE
;
169 typedef struct _HIDP_DATA
{
176 } HIDP_DATA
, *PHIDP_DATA
;
178 typedef struct _HIDP_LINK_COLLECTION_NODE
{
182 USHORT NumberOfChildren
;
185 ULONG CollectionType
: 8;
189 } HIDP_LINK_COLLECTION_NODE
, *PHIDP_LINK_COLLECTION_NODE
;
191 typedef BOOLEAN (NTAPI
*PHIDP_INSERT_SCANCODES
) (VOID
*Context
, CHAR
*NewScanCodes
, ULONG Length
);
194 NTSTATUS WINAPI
HidP_GetButtonCaps(HIDP_REPORT_TYPE ReportType
, PHIDP_BUTTON_CAPS ButtonCaps
, PUSHORT ButtonCapsLength
, PHIDP_PREPARSED_DATA PreparsedData
);
195 NTSTATUS WINAPI
HidP_GetCaps(PHIDP_PREPARSED_DATA PreparsedData
, PHIDP_CAPS Capabilities
);
196 NTSTATUS WINAPI
HidP_GetUsages(HIDP_REPORT_TYPE ReportType
, USAGE UsagePage
, USHORT LinkCollection
, PUSAGE UsageList
, PULONG UsageLength
, PHIDP_PREPARSED_DATA PreparsedData
, PCHAR Report
, ULONG ReportLength
);
197 NTSTATUS WINAPI
HidP_GetUsageValue(HIDP_REPORT_TYPE ReportType
, USAGE UsagePage
, USHORT LinkCollection
, USAGE Usage
, PULONG UsageValue
, PHIDP_PREPARSED_DATA PreparsedData
, PCHAR Report
, ULONG ReportLength
);
198 NTSTATUS WINAPI
HidP_GetUsageValueArray(HIDP_REPORT_TYPE ReportType
, USAGE UsagePage
, USHORT LinkCollection
, USAGE Usage
, PCHAR UsageValue
, USHORT UsageValueByteLength
, PHIDP_PREPARSED_DATA PreparsedData
, PCHAR Report
, ULONG ReportLength
);
199 NTSTATUS WINAPI
HidP_GetValueCaps(HIDP_REPORT_TYPE ReportType
, PHIDP_VALUE_CAPS ValueCaps
, PUSHORT ValueCapsLength
, PHIDP_PREPARSED_DATA PreparsedData
);
200 NTSTATUS WINAPI
HidP_InitializeReportForID(HIDP_REPORT_TYPE ReportType
, UCHAR ReportID
, PHIDP_PREPARSED_DATA PreparsedData
, PCHAR Report
, ULONG ReportLength
);
201 ULONG WINAPI
HidP_MaxUsageListLength(HIDP_REPORT_TYPE ReportType
, USAGE UsagePage
, PHIDP_PREPARSED_DATA PreparsedData
);
202 NTSTATUS WINAPI
HidP_GetScaledUsageValue(HIDP_REPORT_TYPE ReportType
, USAGE UsagePage
, USHORT LinkCollection
, USAGE Usage
, PLONG UsageValue
, PHIDP_PREPARSED_DATA PreparsedData
, PCHAR Report
, ULONG ReportLength
);
203 NTSTATUS WINAPI
HidP_SetUsageValue(HIDP_REPORT_TYPE ReportType
, USAGE UsagePage
, USHORT LinkCollection
, USAGE Usage
, ULONG UsageValue
, PHIDP_PREPARSED_DATA PreparsedData
, CHAR
*Report
, ULONG ReportLength
);
204 NTSTATUS WINAPI
HidP_SetUsages(HIDP_REPORT_TYPE ReportType
, USAGE UsagePage
,
205 USHORT LinkCollection
, PUSAGE UsageList
, PULONG UsageLength
,
206 PHIDP_PREPARSED_DATA PreparsedData
, PCHAR Report
, ULONG ReportLength
);
207 NTSTATUS WINAPI
HidP_TranslateUsagesToI8042ScanCodes(USAGE
*ChangedUsageList
, ULONG UsageListLength
, HIDP_KEYBOARD_DIRECTION KeyAction
, HIDP_KEYBOARD_MODIFIER_STATE
*ModifierState
, PHIDP_INSERT_SCANCODES InsertCodesProcedure
, VOID
*InsertCodesContext
);
208 NTSTATUS WINAPI
HidP_GetSpecificButtonCaps(HIDP_REPORT_TYPE ReportType
, USAGE UsagePage
, USHORT LinkCollection
, USAGE Usage
, HIDP_BUTTON_CAPS
*ButtonCaps
, USHORT
*ButtonCapsLength
, PHIDP_PREPARSED_DATA PreparsedData
);
209 NTSTATUS WINAPI
HidP_GetSpecificValueCaps(HIDP_REPORT_TYPE ReportType
, USAGE UsagePage
, USHORT LinkCollection
, USAGE Usage
, HIDP_VALUE_CAPS
*ValueCaps
, USHORT
*ValueCapsLength
, PHIDP_PREPARSED_DATA PreparsedData
);
210 NTSTATUS WINAPI
HidP_GetUsagesEx(HIDP_REPORT_TYPE ReportType
, USHORT LinkCollection
, USAGE_AND_PAGE
*ButtonList
, ULONG
*UsageLength
, PHIDP_PREPARSED_DATA PreparsedData
, CHAR
*Report
, ULONG ReportLength
);
211 ULONG WINAPI
HidP_MaxDataListLength(HIDP_REPORT_TYPE ReportType
, PHIDP_PREPARSED_DATA PreparsedData
);
212 NTSTATUS WINAPI
HidP_GetData(HIDP_REPORT_TYPE ReportType
, HIDP_DATA
*DataList
, ULONG
*DataLength
, PHIDP_PREPARSED_DATA PreparsedData
, CHAR
*Report
, ULONG ReportLength
);
213 NTSTATUS WINAPI
HidP_GetLinkCollectionNodes(HIDP_LINK_COLLECTION_NODE
*LinkCollectionNode
, ULONG
*LinkCollectionNodeLength
, PHIDP_PREPARSED_DATA PreparsedData
);
215 #ifndef FACILITY_HID_ERROR_CODE
216 #define FACILITY_HID_ERROR_CODE 0x11
219 #define HIDP_ERROR_CODES(sev, code) ((NTSTATUS)(((sev) << 28) | (FACILITY_HID_ERROR_CODE << 16) | (code)))
221 #define HIDP_STATUS_SUCCESS (HIDP_ERROR_CODES(0x0u,0x00))
222 #define HIDP_STATUS_NULL (HIDP_ERROR_CODES(0x8u,0x01))
223 #define HIDP_STATUS_INVALID_PREPARSED_DATA (HIDP_ERROR_CODES(0xcu,0x01))
224 #define HIDP_STATUS_INVALID_REPORT_TYPE (HIDP_ERROR_CODES(0xcu,0x02))
225 #define HIDP_STATUS_INVALID_REPORT_LENGTH (HIDP_ERROR_CODES(0xcu,0x03))
226 #define HIDP_STATUS_USAGE_NOT_FOUND (HIDP_ERROR_CODES(0xcu,0x04))
227 #define HIDP_STATUS_VALUE_OUT_OF_RANGE (HIDP_ERROR_CODES(0xcu,0x05))
228 #define HIDP_STATUS_BAD_LOG_PHY_VALUES (HIDP_ERROR_CODES(0xcu,0x06))
229 #define HIDP_STATUS_BUFFER_TOO_SMALL (HIDP_ERROR_CODES(0xcu,0x07))
230 #define HIDP_STATUS_INTERNAL_ERROR (HIDP_ERROR_CODES(0xcu,0x08))
231 #define HIDP_STATUS_I8242_TRANS_UNKNOWN (HIDP_ERROR_CODES(0xcu,0x09))
232 #define HIDP_STATUS_INCOMPATIBLE_REPORT_ID (HIDP_ERROR_CODES(0xcu,0x0a))
233 #define HIDP_STATUS_NOT_VALUE_ARRAY (HIDP_ERROR_CODES(0xcu,0x0b))
234 #define HIDP_STATUS_IS_VALUE_ARRAY (HIDP_ERROR_CODES(0xcu,0x0c))
235 #define HIDP_STATUS_DATA_INDEX_NOT_FOUND (HIDP_ERROR_CODES(0xcu,0x0d))
236 #define HIDP_STATUS_DATA_INDEX_OUT_OF_RANGE (HIDP_ERROR_CODES(0xcu,0x0e))
237 #define HIDP_STATUS_BUTTON_NOT_PRESSED (HIDP_ERROR_CODES(0xcu,0x0f))
238 #define HIDP_STATUS_REPORT_DOES_NOT_EXIST (HIDP_ERROR_CODES(0xcu,0x10))
239 #define HIDP_STATUS_NOT_IMPLEMENTED (HIDP_ERROR_CODES(0xcu,0x20))
241 #endif /* __HIDPI_H__ */