|
|
/*++
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
|