// Licensed under the Apache License, Version 2.0 // or the MIT license // , at your option. // All files in the project carrying such notice may not be copied, modified, or distributed // except according to those terms. use shared::hidusage::{PUSAGE, USAGE}; use shared::minwindef::{PUCHAR, PULONG, PUSHORT, UCHAR, ULONG, USHORT}; use shared::ntdef::NTSTATUS; use shared::ntstatus::FACILITY_HID_ERROR_CODE; use um::winnt::{BOOLEAN, LONG, PCHAR, PLONG, PVOID}; pub const HIDP_LINK_COLLECTION_ROOT: USHORT = -1i16 as u16; pub const HIDP_LINK_COLLECTION_UNSPECIFIED: USHORT = 0; ENUM!{enum HIDP_REPORT_TYPE { HidP_Input, HidP_Output, HidP_Feature, }} STRUCT!{struct USAGE_AND_PAGE { Usage: USAGE, UsagePage: USAGE, }} pub type PUSAGE_AND_PAGE = *mut USAGE_AND_PAGE; // HidP_IsSameUsageAndPage STRUCT!{struct HIDP_CAPS_Range { UsageMin: USAGE, UsageMax: USAGE, StringMin: USHORT, StringMax: USHORT, DesignatorMin: USHORT, DesignatorMax: USHORT, DataIndexMin: USHORT, DataIndexMax: USHORT, }} STRUCT!{struct HIDP_CAPS_NotRange { Usage: USAGE, Reserved1: USAGE, StringIndex: USHORT, Reserved2: USHORT, DesignatorIndex: USHORT, Reserved3: USHORT, DataIndex: USHORT, Reserved4: USHORT, }} UNION!{union HIDP_CAPS_u { [u16; 8], Range Range_mut: HIDP_CAPS_Range, NotRange NotRange_mut: HIDP_CAPS_NotRange, }} STRUCT!{struct HIDP_BUTTON_CAPS { UsagePage: USAGE, ReportID: UCHAR, IsAlias: BOOLEAN, BitField: USHORT, LinkCollection: USHORT, LinkUsage: USAGE, LinkUsagePage: USAGE, IsRange: BOOLEAN, IsStringRange: BOOLEAN, IsDesignatorRange: BOOLEAN, IsAbsolute: BOOLEAN, Reserved: [ULONG; 10], u: HIDP_CAPS_u, }} pub type PHIDP_BUTTON_CAPS = *mut HIDP_BUTTON_CAPS; STRUCT!{struct HIDP_VALUE_CAPS { UsagePage: USAGE, ReportID: UCHAR, IsAlias: BOOLEAN, BitField: USHORT, LinkCollection: USHORT, LinkUsage: USAGE, LinkUsagePage: USAGE, IsRange: BOOLEAN, IsStringRange: BOOLEAN, IsDesignatorRange: BOOLEAN, IsAbsolute: BOOLEAN, HasNull: BOOLEAN, Reserved: UCHAR, BitSize: USHORT, ReportCount: USHORT, Reserved2: [USHORT; 5], UnitsExp: ULONG, Units: ULONG, LogicalMin: LONG, LogicalMax: LONG, PhysicalMin: LONG, PhysicalMax: LONG, u: HIDP_CAPS_u, }} pub type PHIDP_VALUE_CAPS = *mut HIDP_VALUE_CAPS; STRUCT!{struct HIDP_LINK_COLLECTION_NODE { LinkUsage: USAGE, LinkUsagePage: USAGE, Parent: USHORT, NumberOfChildren: USHORT, NextSibling: USHORT, FirstChild: USHORT, bit_fields: ULONG, UserContext: PVOID, }} BITFIELD!{HIDP_LINK_COLLECTION_NODE bit_fields: ULONG [ CollectionType set_CollectionType[0..8], IsAlias set_IsAlias[8..9], ]} pub type PHIDP_LINK_COLLECTION_NODE = *mut HIDP_LINK_COLLECTION_NODE; pub type PHIDP_REPORT_DESCRIPTOR = PUCHAR; pub enum HIDP_PREPARSED_DATA {} pub type PHIDP_PREPARSED_DATA = *mut HIDP_PREPARSED_DATA; STRUCT!{struct HIDP_CAPS { Usage: USAGE, UsagePage: USAGE, InputReportByteLength: USHORT, OutputReportByteLength: USHORT, FeatureReportByteLength: USHORT, Reserved: [USHORT; 17], NumberLinkCollectionNodes: USHORT, NumberInputButtonCaps: USHORT, NumberInputValueCaps: USHORT, NumberInputDataIndices: USHORT, NumberOutputButtonCaps: USHORT, NumberOutputValueCaps: USHORT, NumberOutputDataIndices: USHORT, NumberFeatureButtonCaps: USHORT, NumberFeatureValueCaps: USHORT, NumberFeatureDataIndices: USHORT, }} pub type PHIDP_CAPS = *mut HIDP_CAPS; UNION!{union HIDP_DATA_u { [u32; 1], RawValue RawValue_mut: ULONG, On On_mut: BOOLEAN, }} STRUCT!{struct HIDP_DATA { DataIndex: USHORT, Reserved: USHORT, u: HIDP_DATA_u, }} pub type PHIDP_DATA = *mut HIDP_DATA; STRUCT!{struct HIDP_UNKNOWN_TOKEN { Token: UCHAR, Reserved: [UCHAR; 3], BitField: ULONG, }} pub type PHIDP_UNKNOWN_TOKEN = *mut HIDP_UNKNOWN_TOKEN; STRUCT!{struct HIDP_EXTENDED_ATTRIBUTES { NumGlobalUnknowns: UCHAR, Reserved: [UCHAR; 3], GlobalUnknowns: PHIDP_UNKNOWN_TOKEN, Data: [ULONG; 1], }} pub type PHIDP_EXTENDED_ATTRIBUTES = *mut HIDP_EXTENDED_ATTRIBUTES; extern "system" { pub fn HidP_GetCaps( PreparsedData: PHIDP_PREPARSED_DATA, Capabilities: PHIDP_CAPS, ) -> NTSTATUS; pub fn HidP_GetLinkCollectionNodes( LinkCollectionNodes: PHIDP_LINK_COLLECTION_NODE, LinkCollectionNodesLength: PULONG, PreparsedData: PHIDP_PREPARSED_DATA, ) -> NTSTATUS; pub fn HidP_GetSpecificButtonCaps( ReportType: HIDP_REPORT_TYPE, UsagePage: USAGE, LinkCollection: USHORT, Usage: USAGE, ButtonCaps: PHIDP_BUTTON_CAPS, ButtonCapsLength: PUSHORT, PreparsedData: PHIDP_PREPARSED_DATA, ) -> NTSTATUS; pub fn HidP_GetButtonCaps( ReportType: HIDP_REPORT_TYPE, ButtonCaps: PHIDP_BUTTON_CAPS, ButtonCapsLength: PUSHORT, PreparsedData: PHIDP_PREPARSED_DATA, ) -> NTSTATUS; pub fn HidP_GetSpecificValueCaps( ReportType: HIDP_REPORT_TYPE, UsagePage: USAGE, LinkCollection: USHORT, Usage: USAGE, ValueCaps: PHIDP_VALUE_CAPS, ValueCapsLength: PUSHORT, PreparsedData: PHIDP_PREPARSED_DATA, ) -> NTSTATUS; pub fn HidP_GetValueCaps( ReportType: HIDP_REPORT_TYPE, ValueCaps: PHIDP_VALUE_CAPS, ValueCapsLength: PUSHORT, PreparsedData: PHIDP_PREPARSED_DATA, ) -> NTSTATUS; pub fn HidP_GetExtendedAttributes( ReportType: HIDP_REPORT_TYPE, DataIndex: USHORT, PreparsedData: PHIDP_PREPARSED_DATA, Attributes: PHIDP_EXTENDED_ATTRIBUTES, LengthAttributes: PULONG, ) -> NTSTATUS; pub fn HidP_InitializeReportForID( ReportType: HIDP_REPORT_TYPE, ReportID: UCHAR, PreparsedData: PHIDP_PREPARSED_DATA, Report: PCHAR, ReportLength: ULONG, ) -> NTSTATUS; pub fn HidP_SetData( ReportType: HIDP_REPORT_TYPE, DataList: PHIDP_DATA, DataLength: PULONG, PreparsedData: PHIDP_PREPARSED_DATA, Report: PCHAR, ReportLength: ULONG, ) -> NTSTATUS; pub fn HidP_GetData( ReportType: HIDP_REPORT_TYPE, DataList: PHIDP_DATA, DataLength: PULONG, PreparsedData: PHIDP_PREPARSED_DATA, Report: PCHAR, ReportLength: ULONG, ) -> NTSTATUS; pub fn HidP_MaxDataListLength( ReportType: HIDP_REPORT_TYPE, PreparsedData: PHIDP_PREPARSED_DATA, ) -> ULONG; pub fn HidP_SetUsages( ReportType: HIDP_REPORT_TYPE, UsagePage: USAGE, LinkCollection: USHORT, UsageList: PUSAGE, UsageLength: PULONG, PreparsedData: PHIDP_PREPARSED_DATA, Report: PCHAR, ReportLength: ULONG, ) -> NTSTATUS; pub fn HidP_UnsetUsages( ReportType: HIDP_REPORT_TYPE, UsagePage: USAGE, LinkCollection: USHORT, UsageList: PUSAGE, UsageLength: PULONG, PreparsedData: PHIDP_PREPARSED_DATA, Report: PCHAR, ReportLength: ULONG, ) -> NTSTATUS; pub fn HidP_GetUsages( ReportType: HIDP_REPORT_TYPE, UsagePage: USAGE, LinkCollection: USHORT, UsageList: PUSAGE, UsageLength: PULONG, PreparsedData: PHIDP_PREPARSED_DATA, Report: PCHAR, ReportLength: ULONG, ) -> NTSTATUS; pub fn HidP_GetUsagesEx( ReportType: HIDP_REPORT_TYPE, LinkCollection: USHORT, ButtonList: PUSAGE_AND_PAGE, UsageLength: *mut ULONG, PreparsedData: PHIDP_PREPARSED_DATA, Report: PCHAR, ReportLength: ULONG, ) -> NTSTATUS; pub fn HidP_MaxUsageListLength( ReportType: HIDP_REPORT_TYPE, UsagePage: USAGE, PreparsedData: PHIDP_PREPARSED_DATA, ) -> ULONG; pub fn HidP_SetUsageValue( ReportType: HIDP_REPORT_TYPE, UsagePage: USAGE, LinkCollection: USHORT, Usage: USAGE, UsageValue: ULONG, PreparsedData: PHIDP_PREPARSED_DATA, Report: PCHAR, ReportLength: ULONG, ) -> NTSTATUS; pub fn HidP_SetScaledUsageValue( ReportType: HIDP_REPORT_TYPE, UsagePage: USAGE, LinkCollection: USHORT, Usage: USAGE, UsageValue: LONG, PreparsedData: PHIDP_PREPARSED_DATA, Report: PCHAR, ReportLength: ULONG, ) -> NTSTATUS; pub fn HidP_SetUsageValueArray( ReportType: HIDP_REPORT_TYPE, UsagePage: USAGE, LinkCollection: USHORT, Usage: USAGE, UsageValue: PCHAR, UsageValueByteLength: USHORT, PreparsedData: PHIDP_PREPARSED_DATA, Report: PCHAR, ReportLength: ULONG, ) -> NTSTATUS; pub fn HidP_GetUsageValue( ReportType: HIDP_REPORT_TYPE, UsagePage: USAGE, LinkCollection: USHORT, Usage: USAGE, UsageValue: PULONG, PreparsedData: PHIDP_PREPARSED_DATA, Report: PCHAR, ReportLength: ULONG, ) -> NTSTATUS; pub fn HidP_GetScaledUsageValue( ReportType: HIDP_REPORT_TYPE, UsagePage: USAGE, LinkCollection: USHORT, Usage: USAGE, UsageValue: PLONG, PreparsedData: PHIDP_PREPARSED_DATA, Report: PCHAR, ReportLength: ULONG, ) -> NTSTATUS; pub fn HidP_GetUsageValueArray( ReportType: HIDP_REPORT_TYPE, UsagePage: USAGE, LinkCollection: USHORT, Usage: USAGE, UsageValue: PCHAR, UsageValueByteLength: USHORT, PreparsedData: PHIDP_PREPARSED_DATA, Report: PCHAR, ReportLength: ULONG, ) -> NTSTATUS; pub fn HidP_UsageListDifference( PreviousUsageList: PUSAGE, CurrentUsageList: PUSAGE, BreakUsageList: PUSAGE, MakeUsageList: PUSAGE, UsageListLength: ULONG, ) -> NTSTATUS; pub fn HidP_TranslateUsagesToI8042ScanCodes( ChangedUsageList: PUSAGE, UsageListLength: ULONG, KeyAction: HIDP_KEYBOARD_DIRECTION, ModifierState: PHIDP_KEYBOARD_MODIFIER_STATE, InsertCodesProcedure: PHIDP_INSERT_SCANCODES, InsertCodesContext: PVOID, ) -> NTSTATUS; } ENUM!{enum HIDP_KEYBOARD_DIRECTION { HidP_Keyboard_Break, HidP_Keyboard_Make, }} STRUCT!{struct HIDP_KEYBOARD_MODIFIER_STATE { ul: ULONG, }} BITFIELD!{HIDP_KEYBOARD_MODIFIER_STATE ul: ULONG [ LeftControl set_LeftControl[0..1], LeftShift set_LeftShift[1..2], LeftAlt set_LeftAlt[2..3], LeftGUI set_LeftGUI[3..4], RightControl set_RightControl[4..5], RightShift set_RightShift[5..6], RightAlt set_RightAlt[6..7], RigthGUI set_RigthGUI[7..8], CapsLock set_CapsLock[8..9], ScollLock set_ScollLock[9..10], NumLock set_NumLock[10..11], ]} pub type PHIDP_KEYBOARD_MODIFIER_STATE = *mut HIDP_KEYBOARD_MODIFIER_STATE; FN!{stdcall PHIDP_INSERT_SCANCODES( Context: PVOID, NewScanCodes: PCHAR, Length: ULONG, ) -> BOOLEAN} pub const HIDP_STATUS_SUCCESS: NTSTATUS = HIDP_ERROR_CODES!(0x0, 0); pub const HIDP_STATUS_NULL: NTSTATUS = HIDP_ERROR_CODES!(0x8, 1); pub const HIDP_STATUS_INVALID_PREPARSED_DATA: NTSTATUS = HIDP_ERROR_CODES!(0xC, 1); pub const HIDP_STATUS_INVALID_REPORT_TYPE: NTSTATUS = HIDP_ERROR_CODES!(0xC, 2); pub const HIDP_STATUS_INVALID_REPORT_LENGTH: NTSTATUS = HIDP_ERROR_CODES!(0xC, 3); pub const HIDP_STATUS_USAGE_NOT_FOUND: NTSTATUS = HIDP_ERROR_CODES!(0xC, 4); pub const HIDP_STATUS_VALUE_OUT_OF_RANGE: NTSTATUS = HIDP_ERROR_CODES!(0xC, 5); pub const HIDP_STATUS_BAD_LOG_PHY_VALUES: NTSTATUS = HIDP_ERROR_CODES!(0xC, 6); pub const HIDP_STATUS_BUFFER_TOO_SMALL: NTSTATUS = HIDP_ERROR_CODES!(0xC, 7); pub const HIDP_STATUS_INTERNAL_ERROR: NTSTATUS = HIDP_ERROR_CODES!(0xC, 8); pub const HIDP_STATUS_I8042_TRANS_UNKNOWN: NTSTATUS = HIDP_ERROR_CODES!(0xC, 9); pub const HIDP_STATUS_INCOMPATIBLE_REPORT_ID: NTSTATUS = HIDP_ERROR_CODES!(0xC, 0xA); pub const HIDP_STATUS_NOT_VALUE_ARRAY: NTSTATUS = HIDP_ERROR_CODES!(0xC, 0xB); pub const HIDP_STATUS_IS_VALUE_ARRAY: NTSTATUS = HIDP_ERROR_CODES!(0xC, 0xC); pub const HIDP_STATUS_DATA_INDEX_NOT_FOUND: NTSTATUS = HIDP_ERROR_CODES!(0xC, 0xD); pub const HIDP_STATUS_DATA_INDEX_OUT_OF_RANGE: NTSTATUS = HIDP_ERROR_CODES!(0xC, 0xE); pub const HIDP_STATUS_BUTTON_NOT_PRESSED: NTSTATUS = HIDP_ERROR_CODES!(0xC, 0xF); pub const HIDP_STATUS_REPORT_DOES_NOT_EXIST: NTSTATUS = HIDP_ERROR_CODES!(0xC, 0x10); pub const HIDP_STATUS_NOT_IMPLEMENTED: NTSTATUS = HIDP_ERROR_CODES!(0xC, 0x20); pub const HIDP_STATUS_I8242_TRANS_UNKNOWN: NTSTATUS = HIDP_STATUS_I8042_TRANS_UNKNOWN;