windows-nt/Source/XPSP1/NT/drivers/wdm/input/hidparse/hidparse.h
2020-09-26 16:20:57 +08:00

259 lines
7.8 KiB
C

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
HIDPARSE.H
Abstract:
This module contains the PRIVATE (driver-only) definitions for the
code that implements the usbd driver.
Environment:
Kernel & user mode
Revision History:
Aug-96 : created by Kenneth Ray
--*/
#ifndef _HIDPARSE_H
#define _HIDPARSE_H
#include "hidtoken.h"
#define HIDP_POOL_TAG (ULONG) 'PdiH'
#undef ExAllocatePool
#define ExAllocatePool(type, size) \
ExAllocatePoolWithTag (type, size, HIDP_POOL_TAG);
// ExAllocatePool is only called in the descript.c and hidparse.c code.
// all other modules are linked into the user DLL. They cannot allocate any
// memory.
#pragma warning(error:4100) // Unreferenced formal parameter
#pragma warning(error:4705) // Statement has no effect
#define DEFAULT_DBG_LEVEL 1 // errors AND warnings
#if DBG
#define HidP_KdPrint(_level_,_x_) \
if (DEFAULT_DBG_LEVEL <= _level_) { \
DbgPrint ("'HidParse.SYS: "); \
DbgPrint _x_; \
}
#define TRAP() DbgBreakPoint()
#else
#define HidP_KdPrint(_level_,_x_)
#define TRAP()
#endif
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#define MAX(a,b) (((a) < (b)) ? (b) : (a))
#define HIDP_ISCONST(x) ((BOOLEAN) (( (x) & 0x01) ? TRUE : FALSE))
#define HIDP_ISARRAY(x) ((BOOLEAN) ((!((x) & 0x02)) ? TRUE : FALSE))
#define HIDP_ISABSOLUTE(x) ((BOOLEAN) ((!((x) & 0x04)) ? TRUE : FALSE))
#define HIDP_HASNULL(x) ((BOOLEAN) (( (x) & 0x40) ? TRUE : FALSE))
#define HIDP_MAX_UNKNOWN_ITEMS 4
typedef struct _HIDP_CHANNEL_DESC
{
USHORT UsagePage;
UCHAR ReportID;
UCHAR BitOffset; // 0 to 8 value describing bit alignment
USHORT ReportSize; // HID defined report size
USHORT ReportCount; // HID defined report count
USHORT ByteOffset; // byte position of start of field in report packet
USHORT BitLength; // total bit length of this channel
ULONG BitField; // The 8 (plus extra) bits associated with a main item
USHORT ByteEnd; // First byte not containing bits of this channel.
USHORT LinkCollection; // A unique internal index pointer
USHORT LinkUsagePage;
USHORT LinkUsage;
ULONG MoreChannels: 1; // Are there more channel desc associated with
// this array. This happens if there is a
// several usages for one main item.
ULONG IsConst: 1; // Does this channel represent filler
ULONG IsButton: 1; // Is this a channel of binary usages, not value usages.
ULONG IsAbsolute: 1; // As apposed to relative
ULONG IsRange: 1;
ULONG IsAlias: 1; // a usage described in a delimiter
ULONG IsStringRange: 1;
ULONG IsDesignatorRange: 1;
ULONG Reserved: 20;
ULONG NumGlobalUnknowns: 4;
struct _HIDP_UNKNOWN_TOKEN GlobalUnknowns [HIDP_MAX_UNKNOWN_ITEMS];
union {
struct {
USHORT UsageMin, UsageMax;
USHORT StringMin, StringMax;
USHORT DesignatorMin, DesignatorMax;
USHORT DataIndexMin, DataIndexMax;
} Range;
struct {
USHORT Usage, Reserved1;
USHORT StringIndex, Reserved2;
USHORT DesignatorIndex, Reserved3;
USHORT DataIndex, Reserved4;
} NotRange;
};
union {
struct {
LONG LogicalMin, LogicalMax;
} button;
struct {
BOOLEAN HasNull; // Does this channel have a null report
UCHAR Reserved[3];
LONG LogicalMin, LogicalMax;
LONG PhysicalMin, PhysicalMax;
} Data;
};
ULONG Units;
ULONG UnitExp;
} HIDP_CHANNEL_DESC, *PHIDP_CHANNEL_DESC;
struct _CHANNEL_REPORT_HEADER
{
USHORT Offset; // Position in the _CHANNEL_ITEM array
USHORT Size; // Length in said array
USHORT Index;
USHORT ByteLen; // The length of the data including reportID.
// This is the longest such report that might be received
// for the given collection.
};
#define HIDP_PREPARSED_DATA_SIGNATURE1 'PdiH'
#define HIDP_PREPARSED_DATA_SIGNATURE2 'RDK '
typedef struct _HIDP_SYS_POWER_INFO {
ULONG PowerButtonMask;
} HIDP_SYS_POWER_INFO, *PHIDP_SYS_POWER_INFO;
typedef struct _HIDP_PREPARSED_DATA
{
LONG Signature1, Signature2;
USHORT Usage;
USHORT UsagePage;
HIDP_SYS_POWER_INFO;
// The following channel report headers point to data within
// the Data field below using array indices.
struct _CHANNEL_REPORT_HEADER Input;
struct _CHANNEL_REPORT_HEADER Output;
struct _CHANNEL_REPORT_HEADER Feature;
// After the CANNEL_DESC array the follows a LinkCollection array nodes.
// LinkCollectionArrayOffset is the index given to RawBytes to find
// the first location of the _HIDP_LINK_COLLECTION_NODE structure array
// (index zero) and LinkCollectionArrayLength is the number of array
// elements in that array.
USHORT LinkCollectionArrayOffset;
USHORT LinkCollectionArrayLength;
union {
HIDP_CHANNEL_DESC Data[];
UCHAR RawBytes[];
};
} HIDP_PREPARSED_DATA;
typedef struct _HIDP_PRIVATE_LINK_COLLECTION_NODE
{
USAGE LinkUsage;
USAGE LinkUsagePage;
USHORT Parent;
USHORT NumberOfChildren;
USHORT NextSibling;
USHORT FirstChild;
ULONG CollectionType: 8; // As defined in 6.2.2.6 of HID spec
ULONG IsAlias : 1; // This link node is an allias of the next link node.
ULONG Reserved: 23;
} HIDP_PRIVATE_LINK_COLLECTION_NODE, *PHIDP_PRIVATE_LINK_COLLECTION_NODE;
// +++++++++++++++++++++++++++++++++++
// The ITEMS supported by this Parser
// +++++++++++++++++++++++++++++++++++
typedef UCHAR HIDP_ITEM;
//
// Power buttons supported by this parser
//
#define HIDP_USAGE_SYSCTL_PAGE HID_USAGE_PAGE_GENERIC
#define HIDP_USAGE_SYSCTL_POWER HID_USAGE_GENERIC_SYSCTL_POWER
#define HIDP_USAGE_SYSCTL_SLEEP HID_USAGE_GENERIC_SYSCTL_SLEEP
#define HIDP_USAGE_SYSCTL_WAKE HID_USAGE_GENERIC_SYSCTL_WAKE
//
//
// Keyboard Translation
// translation tables from usages to i8042 scan codes.
//
typedef ULONG HIDP_LOOKUP_TABLE_PROC (
IN PULONG Table,
IN ULONG Usage
);
typedef HIDP_LOOKUP_TABLE_PROC * PHIDP_LOOKUP_TABLE_PROC;
typedef BOOLEAN HIDP_SCANCODE_SUBTRANSLATION (
IN ULONG * Table,
IN UCHAR Index,
IN PHIDP_INSERT_SCANCODES Insert,
IN PVOID Context,
IN HIDP_KEYBOARD_DIRECTION KeyAction,
IN OUT PHIDP_KEYBOARD_MODIFIER_STATE ModifierState
);
typedef HIDP_SCANCODE_SUBTRANSLATION * PHIDP_SCANCODE_SUBTRANSLATION;
typedef struct _HIDP_SCANCODE_SUBTABLE {
PHIDP_SCANCODE_SUBTRANSLATION ScanCodeFcn;
PULONG Table;
} HIDP_SCANCODE_SUBTABLE, *PHIDP_SCANCODE_SUBTABLE;
NTSTATUS HidP_TranslateUsage (
USAGE Usage,
HIDP_KEYBOARD_DIRECTION KeyAction,
PHIDP_KEYBOARD_MODIFIER_STATE ModifierState,
PHIDP_LOOKUP_TABLE_PROC LookupTableProc,
PULONG TranslationTable,
PHIDP_SCANCODE_SUBTABLE SubTranslationTable,
PHIDP_INSERT_SCANCODES InsertCodesProcedure,
PVOID InsertCodesContext
);
HIDP_LOOKUP_TABLE_PROC HidP_StraightLookup;
HIDP_LOOKUP_TABLE_PROC HidP_AssociativeLookup;
HIDP_SCANCODE_SUBTRANSLATION HidP_KeyboardKeypadCode;
HIDP_SCANCODE_SUBTRANSLATION HidP_ModifierCode;
HIDP_SCANCODE_SUBTRANSLATION HidP_VendorBreakCodesAsMakeCodes;
HIDP_SCANCODE_SUBTRANSLATION HidP_PrintScreenCode;
#endif