Componentes.Terceros.jvcl/official/3.32/common/Hid.pas

2390 lines
116 KiB
ObjectPascal
Raw Blame History

{******************************************************************}
{ }
{ Borland Delphi Runtime Library }
{ Public Definitions of HID functions from HID.DLL }
{ }
{ Portions created by Microsoft are }
{ Copyright (C) 1995-1999 Microsoft Corporation. }
{ All Rights Reserved. }
{ }
{ The original file are: hidsdi.h, hidpi.h, released March 1999. }
{ The original Pascal code is: Hid.pas, released 29 Jan 2000. }
{ The initial developer of the Pascal code is Robert Marquardt }
{ (robert_marquardt att gmx dott de) }
{ }
{ Portions created by Robert Marquardt are }
{ Copyright (C) 1999, 2000 Robert Marquardt. }
{ }
{ Contributor(s): Marcel van Brakel (brakelm att bart dott nl) }
{ }
{ Obtained through: }
{ Joint Endeavour of Delphi Innovators (Project JEDI) }
{ }
{ You may retrieve the latest version of this file at the Project }
{ JEDI home page, located at http://delphi-jedi.org }
{ }
{ The contents of this file are used with permission, subject to }
{ the Mozilla Public License Version 1.1 (the "License"); you may }
{ not use this file except in compliance with the License. You may }
{ obtain a copy of the License at }
{ http://www.mozilla.org/NPL/NPL-1_1Final.html }
{ }
{ Software distributed under the License is distributed on an }
{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or }
{ implied. See the License for the specific language governing }
{ rights and limitations under the License. }
{ }
{******************************************************************}
unit Hid;
interface
{$WEAKPACKAGEUNIT}
// (rom) loads HID.DLL dynamically
{$DEFINE HID_LINKONREQUEST}
// (rom) enable for functions only in HID.DLL of Windows 98 SE or better
{ $ DEFINE WIN2000}
// (rom) enable for functions only in HID.DLL of Windows XP
{ $ DEFINE WINXP}
{$IFDEF WINXP}
{$DEFINE WIN2000}
{$ENDIF WINXP}
uses
Windows;
{$ALIGN ON}
type
// (rom) moved from HidUsage.pas
PUsage = ^TUsage;
TUsage = Word;
// (rom) from WINNT.H
NTSTATUS = Longint;
{$EXTERNALSYM NTSTATUS}
// FACILITY_HID_ERROR_CODE defined in ntstatus.h
const
FACILITY_HID_ERROR_CODE = $11;
{$EXTERNALSYM FACILITY_HID_ERROR_CODE}
//
// Define NT Status codes with Facility Code of FACILITY_HID_ERROR_CODE
// (rom) vv
HIDP_STATUS_SUCCESS = NTSTATUS($00110000);
HIDP_STATUS_NULL = NTSTATUS($80110001);
HIDP_STATUS_INVALID_PREPARSED_DATA = NTSTATUS($C0110001);
HIDP_STATUS_INVALID_REPORT_TYPE = NTSTATUS($C0110002);
HIDP_STATUS_INVALID_REPORT_LENGTH = NTSTATUS($C0110003);
HIDP_STATUS_USAGE_NOT_FOUND = NTSTATUS($C0110004);
HIDP_STATUS_VALUE_OUT_OF_RANGE = NTSTATUS($C0110005);
HIDP_STATUS_BAD_LOG_PHY_VALUES = NTSTATUS($C0110006);
HIDP_STATUS_BUFFER_TOO_SMALL = NTSTATUS($C0110007);
HIDP_STATUS_INTERNAL_ERROR = NTSTATUS($C0110008);
HIDP_STATUS_I8042_TRANS_UNKNOWN = NTSTATUS($C0110009);
HIDP_STATUS_INCOMPATIBLE_REPORT_ID = NTSTATUS($C011000A);
HIDP_STATUS_NOT_VALUE_ARRAY = NTSTATUS($C011000B);
HIDP_STATUS_IS_VALUE_ARRAY = NTSTATUS($C011000C);
HIDP_STATUS_DATA_INDEX_NOT_FOUND = NTSTATUS($C011000D);
HIDP_STATUS_DATA_INDEX_OUT_OF_RANGE = NTSTATUS($C011000E);
HIDP_STATUS_BUTTON_NOT_PRESSED = NTSTATUS($C011000F);
HIDP_STATUS_REPORT_DOES_NOT_EXIST = NTSTATUS($C0110010);
HIDP_STATUS_NOT_IMPLEMENTED = NTSTATUS($C0110020);
//
// We blundered this status code.
//
HIDP_STATUS_I8242_TRANS_UNKNOWN = HIDP_STATUS_I8042_TRANS_UNKNOWN;
// Special Link collection values for using the query functions
//
// Root collection references the collection at the base of the link
// collection tree.
// Unspecifies, references all collections in the link collection tree.
HIDP_LINK_COLLECTION_ROOT = -1;
HIDP_LINK_COLLECTION_UNSPECIFIED = 0;
// A bitmap of the current shift state of the keyboard when using the
// below keyboard usages to i8042 translation function.
const
// (rom) values for the bits of THIDPKeyboardModifierState
kmsLeftControl = $0001;
kmsLeftShift = $0002;
kmsLeftAlt = $0004;
kmsLeftGUI = $0008;
kmsRightControl = $0010;
kmsRightShift = $0020;
kmsRightAlt = $0040;
kmsRightGUI = $0080;
kmsCapsLock = $0100;
kmsScollLock = $0200;
kmsNumLock = $0400;
type
THIDPKeyboardModifierState = DWORD;
// (rom) bit value to check IsAlias of THIDPLinkCollectionNode
const
lcnIsAlias = 1;
type
// (rom) to represent the union names
THIDVariantFlags = (Range, NotRange);
PHIDDConfiguration = ^THIDDConfiguration;
HIDD_CONFIGURATION = record
cookie: Pointer;
size: ULONG;
RingBufferSize: ULONG;
end;
THIDDConfiguration = HIDD_CONFIGURATION;
PHIDDAttributes = ^THIDDAttributes;
HIDD_ATTRIBUTES = record
Size: ULONG; // size of structure (set before call)
VendorID: Word;
ProductID: Word;
VersionNumber: Word;
//
// Additional fields will be added to the end of this structure.
//
end;
THIDDAttributes = HIDD_ATTRIBUTES;
PHIDPPreparsedData = Pointer;
const
HidP_Input = 0;
HidP_Output = 1;
HidP_Feature = 2;
type
PHIDPReportType = ^THIDPReportType;
THIDPReportType = DWORD;
const
// Produce Make or Break Codes
HidP_Keyboard_Break = 0;
HidP_Keyboard_Make = 1;
type
PHIDPKeyboardDirection = ^THIDPKeyboardDirection;
THIDPKeyboardDirection = DWORD;
PUsageAndPage = ^TUsageAndPage;
USAGE_AND_PAGE = record
Usage: TUsage;
UsagePage: TUsage;
end;
TUsageAndPage = USAGE_AND_PAGE;
PHIDPButtonCaps = ^THIDPButtonCaps;
HIDP_BUTTON_CAPS = record
UsagePage: TUsage;
ReportID: BYTE;
IsAlias: ByteBool;
BitField: Word;
LinkCollection: Word; // A unique internal index pointer
LinkUsage: TUsage;
LinkUsagePage: TUsage;
IsRange: ByteBool;
IsStringRange: ByteBool;
IsDesignatorRange: ByteBool;
IsAbsolute: ByteBool;
Reserved: array [0..9] of ULONG;
case THIDVariantFlags of
Range:
( UsageMin, UsageMax: TUsage;
StringMin, StringMax,
DesignatorMin, DesignatorMax,
DataIndexMin, DataIndexMax: Word );
NotRange:
( Usage, Reserved1: TUsage;
StringIndex, Reserved2,
DesignatorIndex, Reserved3,
DataIndex, Reserved4: Word );
end;
THIDPButtonCaps = HIDP_BUTTON_CAPS;
PHIDPValueCaps = ^THIDPValueCaps;
HIDP_VALUE_CAPS = record
UsagePage: TUsage;
ReportID: BYTE;
IsAlias: ByteBool;
BitField: Word;
LinkCollection: Word; // A unique internal index pointer
LinkUsage: TUsage;
LinkUsagePage: TUsage;
IsRange: ByteBool;
IsStringRange: ByteBool;
IsDesignatorRange: ByteBool;
IsAbsolute: ByteBool;
HasNull: ByteBool; // Does this channel have a null report union
Reserved: BYTE;
BitSize: Word; // How many bits are devoted to this value?
ReportCount: Word; // See Note below. Usually set to 1.
Reserved_: array [0..4] of Word;
// (rom) name change Reserved2 gives name clash in Pascal
UnitsExp: ULONG;
Units: ULONG;
LogicalMin: Integer;
LogicalMax: Integer;
PhysicalMin: Integer;
PhysicalMax: Integer;
case THIDVariantFlags of
Range:
( UsageMin, UsageMax: TUsage;
StringMin, StringMax,
DesignatorMin, DesignatorMax,
DataIndexMin, DataIndexMax: Word );
NotRange:
( Usage, Reserved1: TUsage;
StringIndex, Reserved2,
DesignatorIndex, Reserved3,
DataIndex, Reserved4: Word );
end;
THIDPValueCaps = HIDP_VALUE_CAPS;
//
// Notes:
//
// ReportCount: When a report descriptor declares an Input, Output, or
// Feature main item with fewer usage declarations than the report count, then
// the last usage applies to all remaining unspecified count in that main item.
// (As an example you might have data that required many fields to describe,
// possibly buffered bytes.) In this case, only one value cap structure is
// allocated for these associtated fields, all with the same usage, and Report
// Count reflects the number of fields involved. Normally ReportCount is 1.
// To access all of the fields in such a value structure would require using
// HidP_GetUsageValueArray and HidP_SetUsageValueArray. HidP_GetUsageValue/
// HidP_SetScaledUsageValue will also work, however, these functions will only
// work with the first field of the structure.
//
//
// The link collection tree consists of an array of LINK_COLLECTION_NODES
// where the index into this array is the same as the collection number.
//
// Given a collection A which contains a subcollection B, A is defined to be
// the parent B, and B is defined to be the child.
//
// Given collections A, B, and C where B and C are children of A, and B was
// encountered before C in the report descriptor, B is defined as a sibling of
// C. (This implies, of course, that if B is a sibling of C, then C is NOT a
// sibling of B).
//
// B is defined as the NextSibling of C if and only if there exists NO
// child collection of A, call it D, such that B is a sibling of D and D
// is a sibling of C.
//
// E is defined to be the FirstChild of A if and only if for all children of A,
// F, that are not equivalent to E, F is a sibling of E.
// (This implies, of course, that the does not exist a child of A, call it G,
// where E is a sibling of G). In other words the first sibling is the last
// link collection found in the list.
//
// In other words, if a collection B is defined within the definition of another
// collection A, B becomes a child of A. All collections with the same parent
// are considered siblings. The FirstChild of the parent collection, A, will be
// last collection defined that has A as a parent. The order of sibling pointers
// is similarly determined. When a collection B is defined, it becomes the
// FirstChild of it's parent collection. The previously defined FirstChild of the
// parent collection becomes the NextSibling of the new collection. As new
// collections with the same parent are discovered, the chain of sibling is built.
//
// With that in mind, the following describes conclusively a data structure
// that provides direct traversal up, down, and accross the link collection
// tree.
PHIDPLinkCollectionNode = ^THIDPLinkCollectionNode;
HIDP_LINK_COLLECTION_NODE = record
LinkUsage: TUsage;
LinkUsagePage: TUsage;
Parent: Word;
NumberOfChildren: Word;
NextSibling: Word;
FirstChild: Word;
CollectionType: BYTE; // As defined in 6.2.2.6 of HID spec
IsAlias: BYTE; // This link node is an alias of the next link node.
Reserved: Word; // (rom) bitfields
UserContext: Pointer; // The user can hang his coat here.
end;
THIDPLinkCollectionNode = HIDP_LINK_COLLECTION_NODE;
//
// When a link collection is described by a delimiter, alias link collection
// nodes are created. (One for each usage within the delimiter).
// The parser assigns each capability description listed above only one
// link collection.
//
// If a control is defined within a collection defined by
// delimited usages, then that control is said to be within multiple link
// collections, one for each usage within the open and close delimiter tokens.
// Such multiple link collecions are said to be aliases. The first N-1 such
// collections, listed in the link collection node array, have their IsAlias
// bit set. The last such link collection is the link collection index used
// in the capabilities described above.
// Clients wishing to set a control in an aliased collection, should walk the
// collection array once for each time they see the IsAlias flag set, and use
// the last link collection as the index for the below accessor functions.
//
// NB: if IsAlias is set, then NextSibling should be one more than the current
// link collection node index.
PHIDPReportDescriptor = PChar;
PHIDPCaps = ^THIDPCaps;
HIDP_CAPS = record
Usage: TUsage;
UsagePage: TUsage;
InputReportByteLength: Word;
OutputReportByteLength: Word;
FeatureReportByteLength: Word;
Reserved: array [0..16] of Word;
NumberLinkCollectionNodes: Word;
NumberInputButtonCaps: Word;
NumberInputValueCaps: Word;
NumberInputDataIndices: Word;
NumberOutputButtonCaps: Word;
NumberOutputValueCaps: Word;
NumberOutputDataIndices: Word;
NumberFeatureButtonCaps: Word;
NumberFeatureValueCaps: Word;
NumberFeatureDataIndices: Word;
end;
THIDPCaps = HIDP_CAPS;
PHIDPData = ^THIDPData;
HIDP_DATA = record
DataIndex: Word;
Reserved: Word;
case Integer of
0: (RawValue: ULONG); // for values
1: (On_: ByteBool); // for buttons MUST BE TRUE for buttons.
// (rom) name change On is reserved in Pascal
end;
THIDPData = HIDP_DATA;
// The HIDP_DATA structure is used with HidP_GetData and HidP_SetData
// functions.
//
// The parser contiguously assigns every control (button or value) in a hid
// device a unique data index from zero to NumberXXXDataIndices -1 , inclusive.
// This value is found in the HIDP_BUTTON_CAPS and HIDP_VALUE_CAPS structures.
//
// Most clients will find the Get/Set Buttons / Value accessor functions
// sufficient to their needs, as they will allow the clients to access the
// data known to them while ignoring the other controls.
//
// More complex clients, which actually read the Button / Value Caps, and which
// do a value add service to these routines (EG Direct Input), will need to
// access all the data in the device without interest in the individual usage
// or link collection location. These are the clients that will find
// HidP_Data useful.
PHIDPUnknownToken = ^THIDPUnknownToken;
HIDP_UNKNOWN_TOKEN = record
Token: BYTE;
Reserved: array [0..2] of BYTE;
BitField: DWORD;
end;
THIDPUnknownToken = HIDP_UNKNOWN_TOKEN;
PHIDPExtendedAttributes = ^THIDPExtendedAttributes;
HIDP_EXTENDED_ATTRIBUTES = record
NumGlobalUnknowns: BYTE;
Reserved: array [0..2] of BYTE;
GlobalUnknowns: PHIDPUnknownToken;
// ... Additional attributes
Data: array [0..0] of ULONG; // variableLength DO NOT ACCESS THIS FIELD
end;
THIDPExtendedAttributes = HIDP_EXTENDED_ATTRIBUTES;
// (rom) callback function type for HidP_TranslateUsagesToI8042ScanCodes param
// (rom) maybe calling convention is incorrect
THIDPInsertScanCodes = function(
Context: Pointer; // Some caller supplied context
NewScanCodes: PChar; // A list of i8042 scan codes
Length: ULONG // the length of the scan code list
): Boolean; stdcall;
{$IFNDEF HID_LINKONREQUEST}
// (rom) undocumented easter egg function
// (rom) fills buffer with "Hello\nI hate Jello\n"
// (rom) returns number of bytes filled in == strlen(Buffer)+1 == 20
// (rom) bugs: handing in nil as buffer gives access violation.
// (rom) always returns 20 even if buffer length is less than 20
// (rom) but does not produce buffer overflow
function HidD_Hello(Buffer: PChar; BufferLength: ULONG): ULONG; stdcall;
procedure HidD_GetHidGuid(var HidGuid: TGUID) stdcall;
function HidD_GetPreparsedData(HidDeviceObject: THandle;
var PreparsedData: PHIDPPreparsedData): LongBool; stdcall;
function HidD_FreePreparsedData(PreparsedData: PHIDPPreparsedData): LongBool; stdcall;
// Routine Description:
// Get the configuration information for this Hid device
//
// Arguments:
// HidDeviceObject A handle to a Hid Device Object.
//
// Configuration A configuration structure. HidD_GetConfiguration MUST
// be called before the configuration can be modified and
// set using HidD_SetConfiguration
//
// ConfigurationLength That is ``sizeof (HIDD_CONFIGURATION)''. Using this
// parameter, we can later increase the length of the
// configuration array and not break older apps.
//
// Return Value:
// TRUE if successful
// FALSE otherwise -- Use GetLastError() to get extended error information
function HidD_GetConfiguration(HidDeviceObject: THandle;
var HidConfig: THIDDConfiguration; Size: Integer): LongBool; stdcall;
// Routine Description:
// Set the configuration information for this Hid device...
//
// NOTE: HidD_GetConfiguration must be called to retrieve the current
// configuration information before this information can be modified
// and set.
//
// Arguments:
// HidDeviceObject A handle to a Hid Device Object.
//
// Configuration A configuration structure. HidD_GetConfiguration MUST
// be called before the configuration can be modified and
// set using HidD_SetConfiguration
//
// ConfigurationLength That is ``sizeof (HIDD_CONFIGURATION)''. Using this
// parameter, we can later increase the length of the
// configuration array and not break older apps.
//
// Return Value:
// TRUE if successful
// FALSE otherwise -- Use GetLastError() to get extended error information
function HidD_SetConfiguration(HidDeviceObject: THandle;
const HidConfig: THIDDConfiguration; Size: Integer): LongBool; stdcall;
// Routine Description:
// Flush the input queue for the given HID device.
//
// Arguments:
// HidDeviceObject A handle to a Hid Device that the client obtains using
// a call to CreateFile on a valid Hid device string name.
// The string name can be obtained using standard PnP calls.
//
// Return Value:
// TRUE if successful
// FALSE otherwise -- Use GetLastError() to get extended error information
function HidD_FlushQueue(HidDeviceObject: THandle): LongBool; stdcall;
// Routine Description:
// Retrieve a feature report from a HID device.
//
// Arguments:
// HidDeviceObject A handle to a Hid Device Object.
//
// ReportBuffer The buffer that the feature report should be placed
// into. The first byte of the buffer should be set to
// the report ID of the desired report
//
// ReportBufferLength The size (in bytes) of ReportBuffer. This value
// should be greater than or equal to the
// FeatureReportByteLength field as specified in the
// HIDP_CAPS structure for the device
// Return Value:
// TRUE if successful
// FALSE otherwise -- Use GetLastError() to get extended error information
function HidD_GetFeature(HidDeviceObject: THandle;
var Report; Size: Integer): LongBool; stdcall;
// Routine Description:
// Send a feature report to a HID device.
//
// Arguments:
// HidDeviceObject A handle to a Hid Device Object.
//
// ReportBuffer The buffer of the feature report to send to the device
//
// ReportBufferLength The size (in bytes) of ReportBuffer. This value
// should be greater than or equal to the
// FeatureReportByteLength field as specified in the
// HIDP_CAPS structure for the device
// Return Value:
// TRUE if successful
// FALSE otherwise -- Use GetLastError() to get extended error information
function HidD_SetFeature(HidDeviceObject: THandle;
var Report; Size: Integer): LongBool; stdcall;
// Routine Description:
// This function returns the number of input buffers used by the specified
// file handle to the Hid device. Each file object has a number of buffers
// associated with it to queue reports read from the device but which have
// not yet been read by the user-mode app with a handle to that device.
//
// Arguments:
// HidDeviceObject A handle to a Hid Device Object.
//
// NumberBuffers Number of buffers currently being used for this file
// handle to the Hid device
//
// Return Value:
// TRUE if successful
// FALSE otherwise -- Use GetLastError() to get extended error information
function HidD_GetNumInputBuffers(HidDeviceObject: THandle;
var NumBufs: Integer): LongBool; stdcall;
// Routine Description:
// This function sets the number of input buffers used by the specified
// file handle to the Hid device. Each file object has a number of buffers
// associated with it to queue reports read from the device but which have
// not yet been read by the user-mode app with a handle to that device.
//
// Arguments:
// HidDeviceObject A handle to a Hid Device Object.
//
// NumberBuffers New number of buffers to use for this file handle to
// the Hid device
//
// Return Value:
// TRUE if successful
// FALSE otherwise -- Use GetLastError() to get extended error information
function HidD_SetNumInputBuffers(HidDeviceObject: THandle;
NumBufs: Integer): LongBool; stdcall;
// Routine Description:
// Given a handle to a valid Hid Class Device Object, retrieve the preparsed
// data for the device. This routine will allocate the appropriately
// sized buffer to hold this preparsed data. It is up to client to call
// HidD_FreePreparsedData to free the memory allocated to this structure when
// it is no longer needed.
//
// Arguments:
// HidDeviceObject A handle to a Hid Device that the client obtains using
// a call to CreateFile on a valid Hid device string name.
// The string name can be obtained using standard PnP calls.
//
// PreparsedData An opaque data structure used by other functions in this
// library to retrieve information about a given device.
//
// Return Value:
// TRUE if successful.
// FALSE otherwise -- Use GetLastError() to get extended error information
function HidD_GetAttributes(HidDeviceObject: THandle;
var HidAttrs: THIDDAttributes): LongBool; stdcall;
// Routine Description:
// This function retrieves the manufacturer string from the specified
// Hid device.
//
// Arguments:
// HidDeviceObject A handle to a Hid Device Object.
//
// Buffer Buffer which on return will contain the manufacturer
// string returned from the device. This string is a
// wide-character string
//
// BufferLength Length of Buffer (in bytes)
//
// Return Value:
// TRUE if successful
// FALSE otherwise -- Use GetLastError() to get extended error information
function HidD_GetManufacturerString(HidDeviceObject: THandle;
Buffer: PWideChar; BufferLength: Integer): LongBool; stdcall;
// Routine Description:
// This function retrieves the product string from the specified
// Hid device.
//
// Arguments:
// HidDeviceObject A handle to a Hid Device Object.
//
// Buffer Buffer which on return will contain the product
// string returned from the device. This string is a
// wide-character string
//
// BufferLength Length of Buffer (in bytes)
//
// Return Value:
// TRUE if successful
// FALSE otherwise -- Use GetLastError() to get extended error information
function HidD_GetProductString(HidDeviceObject: THandle;
Buffer: PWideChar; BufferLength: Integer): LongBool; stdcall;
// Routine Description:
// This function retrieves the serial number string from the specified
// Hid device.
//
// Arguments:
// HidDeviceObject A handle to a Hid Device Object.
//
// Buffer Buffer which on return will contain the serial number
// string returned from the device. This string is a
// wide-character string
//
// BufferLength Length of Buffer (in bytes)
//
// Return Value:
// TRUE if successful
// FALSE otherwise -- Use GetLastError() to get extended error information
function HidD_GetSerialNumberString(HidDeviceObject: THandle;
Buffer: PWideChar; BufferLength: Integer): LongBool; stdcall;
// Routine Description:
// This function retrieves the raw physical descriptor for the specified
// Hid device.
//
// Arguments:
// HidDeviceObject A handle to a Hid Device Object.
//
// Buffer Buffer which on return will contain the physical
// descriptor if one exists for the specified device
// handle
//
// BufferLength Length of buffer (in bytes)
//
// Return Value:
// TRUE if successful
// FALSE otherwise -- Use GetLastError() to get extended error information
function HidD_GetPhysicalDescriptor(HidDeviceObject: THandle;
var Buffer; BufferLength: Integer): LongBool; stdcall;
// Routine Description:
// This function retrieves a string from the specified Hid device that is
// specified with a certain string index.
//
// Arguments:
// HidDeviceObject A handle to a Hid Device Object.
//
// StringIndex Index of the string to retrieve
//
// Buffer Buffer which on return will contain the product
// string returned from the device. This string is a
// wide-character string
//
// BufferLength Length of Buffer (in bytes)
//
// Return Value:
// TRUE if successful
// FALSE otherwise -- Use GetLastError() to get extended error information
function HidD_GetIndexedString(HidDeviceObject: THandle;
Index: Integer; Buffer: PWideChar; BufferLength: Integer): LongBool; stdcall;
// Routine Description:
// Returns a list of capabilities of a given hid device as described by its
// preparsed data.
//
// Arguments:
// PreparsedData The preparsed data returned from HIDCLASS.
// Capabilities a HIDP_CAPS structure
//
// Return Value:
// - HIDP_STATUS_SUCCESS
// - HIDP_STATUS_INVALID_PREPARSED_DATA
{$IFDEF WINXP}
// (rom) new XP functions
function HidD_GetInputReport(HidDeviceObject: THandle;
Buffer: Pointer; BufferLength: ULONG): LongBool; stdcall;
function HidD_SetOutputReport(HidDeviceObject: THandle;
Buffer: Pointer; BufferLength: ULONG): LongBool; stdcall;
{$ENDIF WINXP}
function HidP_GetCaps(PreparsedData: PHIDPPreparsedData;
var Capabilities: THIDPCaps): NTSTATUS; stdcall;
// Routine Description:
// Return a list of PHIDP_LINK_COLLECTION_NODEs used to describe the link
// collection tree of this hid device. See the above description of
// struct _HIDP_LINK_COLLECTION_NODE.
//
// Arguments:
// LinkCollectionNodes - a caller allocated array into which
// HidP_GetLinkCollectionNodes will store the information
//
// LinkCollectionNodesLength - the caller sets this value to the length of the
// the array in terms of number of elements.
// HidP_GetLinkCollectionNodes sets this value to the actual
// number of elements set. The total number of nodes required to
// describe this HID device can be found in the
// NumberLinkCollectionNodes field in the HIDP_CAPS structure.
function HidP_GetLinkCollectionNodes(LinkCollectionNodes: PHIDPLinkCollectionNode;
var LinkCollectionNodesLength: ULONG; PreparsedData: PHIDPPreparsedData): NTSTATUS; stdcall;
function HidP_GetSpecificButtonCaps(ReportType: THIDPReportType;
UsagePage: TUsage; LinkCollection: Word; Usage: TUsage; ButtonCaps: PHIDPButtonCaps;
var ButtonCapsLength: Word; PreparsedData: PHIDPPreparsedData): NTSTATUS; stdcall;
function HidP_GetSpecificValueCaps(ReportType: THIDPReportType; UsagePage: TUsage;
LinkCollection: Word; Usage: TUsage; ValueCaps: PHIDPValueCaps;
var ValueCapsLength: Word; PreparsedData: PHIDPPreparsedData): NTSTATUS; stdcall;
// Routine Description:
//
// Please Note: For obvious reasons HidP_SetData and HidP_GetData will not
// access UsageValueArrays.
//
// Parameters:
// ReportType One of HidP_Input, HidP_Output, or HidP_Feature.
//
// DataList Array of HIDP_DATA structures that will receive the data
// values that are set in the given report
//
// DataLength As input, length in array elements of DataList. As output,
// contains the number of data elements that were successfully
// set by HidP_GetData. The maximum size necessary for DataList
// can be determined by calling HidP_MaxDataListLength
//
// PreparasedData Preparsed data structure returned by HIDCLASS
//
// Report Buffer which to set the data into.
//
// ReportLength Length of Report...Report should be at least as long as the
// value indicated in the HIDP_CAPS structure for the device and
// the corresponding ReportType
//
// Return Value
// HidP_GetData returns the following error codes.
//
// - HIDP_STATUS_SUCCESS -- upon successful retrieval of all data
// from the report packet.
// - HIDP_STATUS_INVALID_REPORT_TYPE -- if ReportType is not valid.
// - HIDP_STATUS_INVALID_PREPARSED_DATA -- if PreparsedData is not valid
// - HIDP_STATUS_INVALID_REPORT_LENGTH -- the length of the report packet is not equal
// to the length specified in HIDP_CAPS
// structure for the given ReportType
// - HIDP_STATUS_REPORT_DOES_NOT_EXIST -- if there are no reports on this device
// for the given ReportType
// - HIDP_STATUS_BUFFER_TOO_SMALL -- if there are not enough array entries in
// DataList to store all the indice values
// in the given report. DataLength will
// contain the number of array entries
// required to hold all data
function HidP_GetData(ReportType: THIDPReportType; DataList: PHIDPData;
var DataLength: ULONG; PreparsedData: PHIDPPreparsedData;
var Report; ReportLength: ULONG): NTSTATUS; stdcall;
// Routine Description:
//
// Please Note: Since usage value arrays deal with multiple fields for
// for one usage value, they cannot be used with HidP_SetData
// and HidP_GetData. In this case,
// HIDP_STATUS_IS_USAGE_VALUE_ARRAY will be returned.
//
// Parameters:
//
// ReportType One of HidP_Input, HidP_Output, or HidP_Feature.
//
// DataList Array of HIDP_DATA structures that contains the data values
// that are to be set into the given report
//
// DataLength As input, length in array elements of DataList. As output,
// contains the number of data elements set on successful
// completion or an index into the DataList array to identify
// the faulting HIDP_DATA value if an error code is returned.
//
// PreparasedData Preparsed data structure returned by HIDCLASS
//
// Report Buffer which to set the data into.
//
// ReportLength Length of Report...Report should be at least as long as the
// value indicated in the HIDP_CAPS structure for the device and
// the corresponding ReportType
//
// Return Value
// HidP_SetData returns the following error codes. The report packet will
// have all the data set up until the HIDP_DATA structure that caused the
// error. DataLength, in the error case, will return this problem index.
//
// - HIDP_STATUS_SUCCESS -- upon successful insertion of all data
// into the report packet.
// - HIDP_STATUS_INVALID_REPORT_TYPE -- if ReportType is not valid.
// - HIDP_STATUS_INVALID_PREPARSED_DATA -- if PreparsedData is not valid
// - HIDP_STATUS_DATA_INDEX_NOT_FOUND -- if a HIDP_DATA structure referenced a
// data index that does not exist for this
// device's ReportType
// - HIDP_STATUS_INVALID_REPORT_LENGTH -- the length of the report packet is not equal
// to the length specified in HIDP_CAPS
// structure for the given ReportType
// - HIDP_STATUS_REPORT_DOES_NOT_EXIST -- if there are no reports on this device
// for the given ReportType
// - HIDP_STATUS_IS_USAGE_VALUE_ARRAY -- if one of the HIDP_DATA structures
// references a usage value array.
// DataLength will contain the index into
// the array that was invalid
// - HIDP_STATUS_BUTTON_NOT_PRESSED -- if a HIDP_DATA structure attempted
// to unset a button that was not already
// set in the Report
// - HIDP_STATUS_INCOMPATIBLE_REPORT_ID -- a HIDP_DATA structure was found with
// a valid index value but is contained
// in a different report than the one
// currently being processed
// - HIDP_STATUS_BUFFER_TOO_SMALL -- if there are not enough entries in
// a given Main Array Item to report all
// buttons that have been requested to be
// set
function HidP_SetData(ReportType: THIDPReportType; DataList: PHIDPData;
var DataLength: ULONG; PreparsedData: PHIDPPreparsedData;
var Report; ReportLength: ULONG): NTSTATUS; stdcall;
// Routine Description:
//
// This function returns the maximum length of HIDP_DATA elements that
// HidP_GetData could return for the given report type.
//
// Parameters:
//
// ReportType One of HidP_Input, HidP_Output or HidP_Feature.
//
// PreparsedData Preparsed data structure returned by HIDCLASS
//
// Return Value:
//
// The length of the data list array required for the HidP_GetData function
// call. If an error occurs (either HIDP_STATUS_INVALID_REPORT_TYPE or
// HIDP_STATUS_INVALID_PREPARSED_DATA), this function returns 0.
function HidP_MaxDataListLength(ReportType: THIDPReportType;
PreparsedData: PHIDPPreparsedData): ULONG; stdcall;
// Routine Description:
// This function returns the binary values (buttons) that are set in a HID
// report. Given a report packet of correct length, it searches the report
// packet for each usage for the given usage page and returns them in the
// usage list.
//
// Parameters:
// ReportType One of HidP_Input, HidP_Output or HidP_Feature.
//
// UsagePage All of the usages in the usage list, which HidP_GetUsages will
// retrieve in the report, refer to this same usage page.
// If the client wishes to get usages in a packet for multiple
// usage pages then that client needs to make multiple calls
// to HidP_GetUsages.
//
// LinkCollection An optional value which can limit which usages are returned
// in the UsageList to those usages that exist in a specific
// LinkCollection. A non-zero value indicates the index into
// the HIDP_LINK_COLLECITON_NODE list returned by
// HidP_GetLinkCollectionNodes of the link collection the
// usage should belong to. A value of 0 indicates this
// should value be ignored.
//
// UsageList The usage array that will contain all the usages found in
// the report packet.
//
// UsageLength The length of the given usage array in array elements.
// On input, this value describes the length of the usage list.
// On output, HidP_GetUsages sets this value to the number of
// usages that was found. Use HidP_MaxUsageListLength to
// determine the maximum length needed to return all the usages
// that a given report packet may contain.
//
// PreparsedData Preparsed data structure returned by HIDCLASS
//
// Report The report packet.
//
// ReportLength Length (in bytes) of the given report packet
//
//
// Return Value
// HidP_GetUsages returns the following error codes:
//
// - HIDP_STATUS_SUCCESS -- upon successfully retrieving all the
// usages from the report packet
// - HIDP_STATUS_INVALID_REPORT_TYPE -- if ReportType is not valid.
// - HIDP_STATUS_INVALID_PREPARSED_DATA -- if PreparsedData is not valid
// - HIDP_STATUS_INVALID_REPORT_LENGTH -- the length of the report packet is not
// equal to the length specified in
// the HIDP_CAPS structure for the given
// ReportType
// - HIDP_STATUS_REPORT_DOES_NOT_EXIST -- if there are no reports on this device
// for the given ReportType
// - HIDP_STATUS_BUFFER_TOO_SMALL -- if the UsageList is not big enough to
// hold all the usages found in the report
// packet. If this is returned, the buffer
// will contain UsageLength number of
// usages. Use HidP_MaxUsageListLength to
// find the maximum length needed
// - HIDP_STATUS_INCOMPATIBLE_REPORT_ID -- if no usages were found but usages
// that match the UsagePage and
// LinkCollection specified could be found
// in a report with a different report ID
// - HIDP_STATUS_USAGE_NOT_FOUND -- if there are no usages in a reports for
// the device and ReportType that match the
// UsagePage and LinkCollection that were
// specified
function HidP_GetUsages(ReportType: THIDPReportType; UsagePage: TUsage;
LinkCollection: Word; UsageList: PUsage; var UsageLength: ULONG;
PreparsedData: PHIDPPreparsedData; var Report;
ReportLength: ULONG): NTSTATUS; stdcall;
function HidP_GetButtons(ReportType: THIDPReportType; UsagePage: TUsage;
LinkCollection: Word; UsageList: PUsage; var UsageLength: ULONG;
PreparsedData: PHIDPPreparsedData; var Report;
ReportLength: ULONG): NTSTATUS; stdcall;
// Routine Description:
// This function returns the binary values (buttons) in a HID report.
// Given a report packet of correct length, it searches the report packet
// for all buttons and returns the UsagePage and Usage for each of the buttons
// it finds.
//
// Parameters:
// ReportType One of HidP_Input, HidP_Output or HidP_Feature.
//
// LinkCollection An optional value which can limit which usages are returned
// in the ButtonList to those usages that exist in a specific
// LinkCollection. A non-zero value indicates the index into
// the HIDP_LINK_COLLECITON_NODE list returned by
// HidP_GetLinkCollectionNodes of the link collection the
// usage should belong to. A value of 0 indicates this
// should value be ignored.
//
// ButtonList An array of USAGE_AND_PAGE structures describing all the
// buttons currently ``down'' in the device.
//
// UsageLength The length of the given array in terms of elements.
// On input, this value describes the length of the list. On
// output, HidP_GetUsagesEx sets this value to the number of
// usages that were found. Use HidP_MaxUsageListLength to
// determine the maximum length needed to return all the usages
// that a given report packet may contain.
//
// PreparsedData Preparsed data returned by HIDCLASS
//
// Report The report packet.
//
// ReportLength Length (in bytes) of the given report packet.
//
//
// Return Value
// HidP_GetUsagesEx returns the following error codes:
//
// - HIDP_STATUS_SUCCESS -- upon successfully retrieving all the
// usages from the report packet
// - HIDP_STATUS_INVALID_REPORT_TYPE -- if ReportType is not valid.
// - HIDP_STATUS_INVALID_PREPARSED_DATA -- if PreparsedData is not valid
// - HIDP_STATUS_INVALID_REPORT_LENGTH -- the length of the report packet is not
// equal to the length specified in
// the HIDP_CAPS structure for the given
// ReportType
// - HIDP_STATUS_REPORT_DOES_NOT_EXIST -- if there are no reports on this device
// for the given ReportType
// - HIDP_STATUS_BUFFER_TOO_SMALL -- if ButtonList is not big enough to
// hold all the usages found in the report
// packet. If this is returned, the buffer
// will contain UsageLength number of
// usages. Use HidP_MaxUsageListLength to
// find the maximum length needed
// - HIDP_STATUS_INCOMPATIBLE_REPORT_ID -- if no usages were found but usages
// that match the specified LinkCollection
// exist in report with a different report
// ID.
// - HIDP_STATUS_USAGE_NOT_FOUND -- if there are no usages in any reports that
// match the LinkCollection parameter
function HidP_GetUsagesEx(ReportType: THIDPReportType; LinkCollection: Word;
UsageList: PUsageAndPage; var UsageLength: ULONG;
PreparsedData: PHIDPPreparsedData; var Report;
ReportLength: ULONG): NTSTATUS; stdcall;
function HidP_GetButtonsEx(ReportType: THIDPReportType; LinkCollection: Word;
UsageList: PUsageAndPage; var UsageLength: ULONG;
PreparsedData: PHIDPPreparsedData; var Report;
ReportLength: ULONG): NTSTATUS; stdcall;
// Routine Description:
// This function sets binary values (buttons) in a report. Given an
// initialized packet of correct length, it modifies the report packet so that
// each element in the given list of usages has been set in the report packet.
// For example, in an output report with 5 LED<45>s, each with a given usage,
// an application could turn on any subset of these lights by placing their
// usages in any order into the usage array (UsageList). HidP_SetUsages would,
// in turn, set the appropriate bit or add the corresponding byte into the
// HID Main Array Item.
//
// A properly initialized Report packet is one of the correct byte length,
// and all zeros.
//
// NOTE: A packet that has already been set with a call to a HidP_Set routine
// can also be passed in. This routine then sets processes the UsageList
// in the same fashion but verifies that the ReportID already set in
// Report matches the report ID for the given usages.
//
// Parameters:
// ReportType One of HidP_Input, HidP_Output or HidP_Feature.
//
// UsagePage All of the usages in the usage array, which HidP_SetUsages will
// set in the report, refer to this same usage page.
// If a client wishes to set usages in a report for multiple
// usage pages then that client needs to make multiple calls to
// HidP_SetUsages for each of the usage pages.
//
// UsageList A usage array containing the usages that HidP_SetUsages will set in
// the report packet.
//
// UsageLength The length of the given usage array in array elements.
// The parser will set this value to the position in the usage
// array where it stopped processing. If successful, UsageLength
// will be unchanged. In any error condition, this parameter
// reflects how many of the usages in the usage list have
// actually been set by the parser. This is useful for finding
// the usage in the list which caused the error.
//
// PreparsedData The preparsed data recevied from HIDCLASS
//
// Report The report packet.
//
// ReportLength Length of the given report packet...Must be equal to the
// value reported in the HIDP_CAPS structure for the device
// and corresponding report type.
//
// Return Value
// HidP_SetUsages returns the following error codes. On error, the report packet
// will be correct up until the usage element that caused the error.
//
// - HIDP_STATUS_SUCCESS -- upon successful insertion of all usages
// into the report packet.
// - HIDP_STATUS_INVALID_REPORT_TYPE -- if ReportType is not valid.
// - HIDP_STATUS_INVALID_PREPARSED_DATA -- if PreparsedData is not valid
// - HIDP_STATUS_INVALID_REPORT_LENGTH -- the length of the report packet is not
// equal to the length specified in
// the HIDP_CAPS structure for the given
// ReportType
// - HIDP_STATUS_REPORT_DOES_NOT_EXIST -- if there are no reports on this device
// for the given ReportType
// - HIDP_STATUS_INCOMPATIBLE_REPORT_ID -- if a usage was found that exists in a
// different report. If the report is
// zero-initialized on entry the first
// usage in the list will determine which
// report ID is used. Otherwise, the
// parser will verify that usage matches
// the passed in report's ID
// - HIDP_STATUS_USAGE_NOT_FOUND -- if the usage does not exist for any
// report (no matter what the report ID)
// for the given report type.
// - HIDP_STATUS_BUFFER_TOO_SMALL -- if there are not enough entries in a
// given Main Array Item to list all of
// the given usages. The caller needs
// to split his request into more than
// one call
function HidP_SetUsages(ReportType: THIDPReportType; UsagePage: TUsage;
LinkCollection: Word; UsageList: PUsage; var UsageLength: ULONG;
PreparsedData: PHIDPPreparsedData; var Report;
ReportLength: ULONG): NTSTATUS; stdcall;
function HidP_SetButtons(ReportType: THIDPReportType; UsagePage: TUsage;
LinkCollection: Word; ButtonList: PUsage; var ButtonLength: ULONG;
PreparsedData: PHIDPPreparsedData; var Report;
ReportLength: ULONG): NTSTATUS; stdcall;
// Routine Description:
// This function unsets (turns off) binary values (buttons) in the report. Given
// an initialized packet of correct length, it modifies the report packet so
// that each element in the given list of usages has been unset in the
// report packet.
//
// This function is the "undo" operation for SetUsages. If the given usage
// is not already set in the Report, it will return an error code of
// HIDP_STATUS_BUTTON_NOT_PRESSED. If the button is pressed, HidP_UnsetUsages
// will unset the appropriate bit or remove the corresponding index value from
// the HID Main Array Item.
//
// A properly initialized Report packet is one of the correct byte length,
// and all zeros..
//
// NOTE: A packet that has already been set with a call to a HidP_Set routine
// can also be passed in. This routine then processes the UsageList
// in the same fashion but verifies that the ReportID already set in
// Report matches the report ID for the given usages.
//
// Parameters:
// ReportType One of HidP_Input, HidP_Output or HidP_Feature.
//
// UsagePage All of the usages in the usage array, which HidP_UnsetUsages will
// unset in the report, refer to this same usage page.
// If a client wishes to unset usages in a report for multiple
// usage pages then that client needs to make multiple calls to
// HidP_UnsetUsages for each of the usage pages.
//
// UsageList A usage array containing the usages that HidP_UnsetUsages will
// unset in the report packet.
//
// UsageLength The length of the given usage array in array elements.
// The parser will set this value to the position in the usage
// array where it stopped processing. If successful, UsageLength
// will be unchanged. In any error condition, this parameter
// reflects how many of the usages in the usage list have
// actually been unset by the parser. This is useful for finding
// the usage in the list which caused the error.
//
// PreparsedData The preparsed data recevied from HIDCLASS
//
// Report The report packet.
//
// ReportLength Length of the given report packet...Must be equal to the
// value reported in the HIDP_CAPS structure for the device
// and corresponding report type.
//
// Return Value
// HidP_UnsetUsages returns the following error codes. On error, the report
// packet will be correct up until the usage element that caused the error.
//
// - HIDP_STATUS_SUCCESS -- upon successful "unsetting" of all usages
// in the report packet.
// - HIDP_STATUS_INVALID_REPORT_TYPE -- if ReportType is not valid.
// - HIDP_STATUS_INVALID_PREPARSED_DATA -- if PreparsedData is not valid
// - HIDP_STATUS_INVALID_REPORT_LENGTH -- the length of the report packet is not
// equal to the length specified in
// the HIDP_CAPS structure for the given
// ReportType
// - HIDP_STATUS_REPORT_DOES_NOT_EXIST -- if there are no reports on this device
// for the given ReportType
// - HIDP_STATUS_INCOMPATIBLE_REPORT_ID -- if a usage was found that exists in a
// different report. If the report is
// zero-initialized on entry the first
// usage in the list will determine which
// report ID is used. Otherwise, the
// parser will verify that usage matches
// the passed in report's ID
// - HIDP_STATUS_USAGE_NOT_FOUND -- if the usage does not exist for any
// report (no matter what the report ID)
// for the given report type.
// - HIDP_STATUS_BUTTON_NOT_PRESSED -- if a usage corresponds to a button that
// is not already set in the given report
function HidP_UnsetUsages(ReportType: THIDPReportType; UsagePage: TUsage;
LinkCollection: Word; UsageList: PUsage; var UsageLength: ULONG;
PreparsedData: PHIDPPreparsedData; var Report;
ReportLength: ULONG): NTSTATUS; stdcall;
function HidP_UnsetButtons(ReportType: THIDPReportType; UsagePage: TUsage;
LinkCollection: Word; ButtonList: PUsage; var ButtonLength: ULONG;
PreparsedData: PHIDPPreparsedData; var Report;
ReportLength: ULONG): NTSTATUS; stdcall;
// Routine Description:
// This function returns the maximum number of usages that a call to
// HidP_GetUsages or HidP_GetUsagesEx could return for a given HID report.
// If calling for number of usages returned by HidP_GetUsagesEx, use 0 as
// the UsagePage value.
//
// Parameters:
// ReportType One of HidP_Input, HidP_Output or HidP_Feature.
//
// UsagePage Specifies the optional UsagePage to query for. If 0, will
// return all the maximum number of usage values that could be
// returned for a given ReportType. If non-zero, will return
// the maximum number of usages that would be returned for the
// ReportType with the given UsagePage.
//
// PreparsedData Preparsed data returned from HIDCLASS
//
// Return Value:
// The length of the usage list array required for the HidP_GetUsages or
// HidP_GetUsagesEx function call. If an error occurs (such as
// HIDP_STATUS_INVALID_REPORT_TYPE or HIDP_INVALID_PREPARSED_DATA, this
// returns 0.
function HidP_MaxUsageListLength(ReportType: THIDPReportType; UsagePage: TUsage;
PreparsedData: PHIDPPreparsedData): ULONG; stdcall;
function HidP_MaxButtonListLength(ReportType: THIDPReportType; UsagePage: TUsage;
PreparsedData: PHIDPPreparsedData): ULONG; stdcall;
// Description
// HidP_GetUsageValue retrieves the value from the HID Report for the usage
// specified by the combination of usage page, usage and link collection.
// If a report packet contains two different fields with the same
// Usage and UsagePage, they can be distinguished with the optional
// LinkCollection field value.
//
// Parameters:
//
// ReportType One of HidP_Input or HidP_Feature.
//
// UsagePage The usage page to which the given usage refers.
//
// LinkCollection (Optional) This value can be used to differentiate
// between two fields that may have the same
// UsagePage and Usage but exist in different
// collections. If the link collection value
// is zero, this function will set the first field
// it finds that matches the usage page and
// usage.
//
// Usage The usage whose value HidP_GetUsageValue will retrieve
//
// UsageValue The raw value that is set for the specified field in the report
// buffer. This value will either fall within the logical range
// or if NULL values are allowed, a number outside the range to
// indicate a NULL
//
// PreparsedData The preparsed data returned for HIDCLASS
//
// Report The report packet.
//
// ReportLength Length (in bytes) of the given report packet.
//
//
// Return Value:
// HidP_GetUsageValue returns the following error codes:
//
// - HIDP_STATUS_SUCCESS -- upon successfully retrieving the value
// from the report packet
// - HIDP_STATUS_INVALID_REPORT_TYPE -- if ReportType is not valid.
// - HIDP_STATUS_INVALID_PREPARSED_DATA -- if PreparsedData is not valid
// - HIDP_STATUS_INVALID_REPORT_LENGTH -- the length of the report packet is not
// equal to the length specified in
// the HIDP_CAPS structure for the given
// ReportType
// - HIDP_STATUS_REPORT_DOES_NOT_EXIST -- if there are no reports on this device
// for the given ReportType
// - HIDP_STATUS_INCOMPATIBLE_REPORT_ID -- the specified usage page, usage and
// link collection exist but exists in
// a report with a different report ID
// than the report being passed in. To
// set this value, call HidP_GetUsageValue
// again with a different report packet
// - HIDP_STATUS_USAGE_NOT_FOUND -- if the usage page, usage, and link
// collection combination does not exist
// in any reports for this ReportType
function HidP_GetUsageValue(ReportType: THIDPReportType; UsagePage: TUsage;
LinkCollection: Word; Usage: TUsage; var UsageValue: ULONG;
PreparsedData: PHIDPPreparsedData; var Report;
ReportLength: ULONG): NTSTATUS; stdcall;
// Description
// HidP_GetScaledUsageValue retrieves a UsageValue from the HID report packet
// in the field corresponding to the given usage page and usage. If a report
// packet contains two different fields with the same Usage and UsagePage,
// they can be distinguished with the optional LinkCollection field value.
//
// If the specified field has a defined physical range, this function converts
// the logical value that exists in the report packet to the corresponding
// physical value. If a physical range does not exist, the function will
// return the logical value. This function will check to verify that the
// logical value in the report falls within the declared logical range.
//
// When doing the conversion between logical and physical values, this
// function assumes a linear extrapolation between the physical max/min and
// the logical max/min. (Where logical is the values reported by the device
// and physical is the value returned by this function). If the data field
// size is less than 32 bits, then HidP_GetScaledUsageValue will sign extend
// the value to 32 bits.
//
// If the range checking fails but the field has NULL values, the function
// will set UsageValue to 0 and return HIDP_STATUS_NULL. Otherwise, it
// returns a HIDP_STATUS_OUT_OF_RANGE error.
//
// Parameters:
//
// ReportType One of HidP_Output or HidP_Feature.
//
// UsagePage The usage page to which the given usage refers.
//
// LinkCollection (Optional) This value can be used to differentiate
// between two fields that may have the same
// UsagePage and Usage but exist in different
// collections. If the link collection value
// is zero, this function will retrieve the first
// field it finds that matches the usage page
// and usage.
//
// Usage The usage whose value HidP_GetScaledUsageValue will retrieve
//
// UsageValue The value retrieved from the report buffer. See the routine
// description above for the different interpretations of this
// value
//
// PreparsedData The preparsed data returned from HIDCLASS
//
// Report The report packet.
//
// ReportLength Length (in bytes) of the given report packet.
//
//
// Return Value:
// HidP_GetScaledUsageValue returns the following error codes:
//
// - HIDP_STATUS_SUCCESS -- upon successfully retrieving the value
// from the report packet
// - HIDP_STATUS_NULL -- if the report packet had a NULL value
// set
// - HIDP_STATUS_INVALID_REPORT_TYPE -- if ReportType is not valid.
// - HIDP_STATUS_INVALID_PREPARSED_DATA -- if PreparsedData is not valid
// - HIDP_STATUS_INVALID_REPORT_LENGTH -- the length of the report packet is not
// equal to the length specified in
// the HIDP_CAPS structure for the given
// ReportType
// - HIDP_STATUS_VALUE_OUT_OF_RANGE -- if the value retrieved from the packet
// falls outside the logical range and
// the field does not support NULL values
// - HIDP_STATUS_BAD_LOG_PHY_VALUES -- if the field has a physical range but
// either the logical range is invalid
// (max <= min) or the physical range is
// invalid
// - HIDP_STATUS_INCOMPATIBLE_REPORT_ID -- the specified usage page, usage and
// link collection exist but exists in
// a report with a different report ID
// than the report being passed in. To
// set this value, call
// HidP_GetScaledUsageValue with a
// different report packet
// - HIDP_STATUS_USAGE_NOT_FOUND -- if the usage page, usage, and link
// collection combination does not exist
// in any reports for this ReportType
function HidP_GetScaledUsageValue(ReportType: THIDPReportType; UsagePage: TUsage;
LinkCollection: Word; Usage: TUsage; var UsageValue: Integer;
PreparsedData: PHIDPPreparsedData; var Report;
ReportLength: ULONG): NTSTATUS; stdcall;
// Routine Descripton:
// A usage value array occurs when the last usage in the list of usages
// describing a main item must be repeated because there are less usages defined
// than there are report counts declared for the given main item. In this case
// a single value cap is allocated for that usage and the report count of that
// value cap is set to reflect the number of fields to which that usage refers.
//
// HidP_GetUsageValueArray returns the raw bits for that usage which spans
// more than one field in a report.
//
// NOTE: This function currently does not support value arrays where the
// ReportSize for each of the fields in the array is not a multiple
// of 8 bits.
//
// The UsageValue buffer will have the raw values as they are set
// in the report packet.
//
// Parameters:
//
// ReportType One of HidP_Input, HidP_Output or HidP_Feature.
//
// UsagePage The usage page to which the given usage refers.
//
// LinkCollection (Optional) This value can be used to differentiate
// between two fields that may have the same
// UsagePage and Usage but exist in different
// collections. If the link collection value
// is zero, this function will set the first field
// it finds that matches the usage page and
// usage.
//
// Usage The usage whose value HidP_GetUsageValueArray will retreive.
//
// UsageValue A pointer to an array of characters where the value will be
// placed. The number of BITS required is found by multiplying the
// BitSize and ReportCount fields of the Value Cap for this
// control. The least significant bit of this control found in the
// given report will be placed in the least significant bit location
// of the buffer (little-endian format), regardless of whether
// or not the field is byte aligned or if the BitSize is a multiple
// of sizeof (CHAR).
//
// See note above about current implementation limitations
//
// UsageValueByteLength
// the length of the given UsageValue buffer.
//
// PreparsedData The preparsed data returned by the HIDCLASS
//
// Report The report packet.
//
// ReportLength Length of the given report packet.
//
// Return Value:
//
// - HIDP_STATUS_SUCCESS -- upon successfully retrieving the value
// from the report packet
// - HIDP_STATUS_INVALID_REPORT_TYPE -- if ReportType is not valid.
// - HIDP_STATUS_INVALID_PREPARSED_DATA -- if PreparsedData is not valid
// - HIDP_STATUS_INVALID_REPORT_LENGTH -- the length of the report packet is not
// equal to the length specified in
// the HIDP_CAPS structure for the given
// ReportType
// - HIDP_STATUS_NOT_VALUE_ARRAY -- if the control specified is not a
// value array -- a value array will have
// a ReportCount field in the
// HIDP_VALUE_CAPS structure that is > 1
// Use HidP_GetUsageValue instead
// - HIDP_STATUS_BUFFER_TOO_SMALL -- if the size of the passed in buffer in
// which to return the array is too small
// (ie. has fewer values than the number of
// fields in the array
// - HIDP_STATUS_NOT_IMPLEMENTED -- if the usage value array has field sizes
// that are not multiples of 8 bits, this
// error code is returned since the function
// currently does not handle getting values
// from such arrays.
// - HIDP_STATUS_INCOMPATIBLE_REPORT_ID -- the specified usage page, usage and
// link collection exist but exists in
// a report with a different report ID
// than the report being passed in. To
// set this value, call
// HidP_GetUsageValueArray with a
// different report packet
// - HIDP_STATUS_USAGE_NOT_FOUND -- if the usage page, usage, and link
// collection combination does not exist
// in any reports for this ReportType
function HidP_GetUsageValueArray(ReportType: THIDPReportType; UsagePage: TUsage;
LinkCollection: Word; Usage: TUsage; UsageValue: PChar;
UsageValueByteLength: Word; PreparsedData: PHIDPPreparsedData;
var Report; ReportLength: ULONG): NTSTATUS; stdcall;
// Description:
// HidP_SetUsageValue inserts a value into the HID Report Packet in the field
// corresponding to the given usage page and usage. HidP_SetUsageValue
// casts this value to the appropriate bit length. If a report packet
// contains two different fields with the same Usage and UsagePage,
// they can be distinguished with the optional LinkCollection field value.
// Using this function sets the raw value into the report packet with
// no checking done as to whether it actually falls within the logical
// minimum/logical maximum range. Use HidP_SetScaledUsageValue for this...
//
// NOTE: Although the UsageValue parameter is a ULONG, any casting that is
// done will preserve or sign-extend the value. The value being set
// should be considered a LONG value and will be treated as such by
// this function.
//
// Parameters:
//
// ReportType One of HidP_Output or HidP_Feature.
//
// UsagePage The usage page to which the given usage refers.
//
// LinkCollection (Optional) This value can be used to differentiate
// between two fields that may have the same
// UsagePage and Usage but exist in different
// collections. If the link collection value
// is zero, this function will set the first field
// it finds that matches the usage page and
// usage.
//
// Usage The usage whose value HidP_SetUsageValue will set.
//
// UsageValue The raw value to set in the report buffer. This value must be within
// the logical range or if a NULL value this value should be the
// most negative value that can be represented by the number of bits
// for this field.
//
// PreparsedData The preparsed data returned for HIDCLASS
//
// Report The report packet.
//
// ReportLength Length (in bytes) of the given report packet.
//
//
// Return Value:
// HidP_SetUsageValue returns the following error codes:
//
// - HIDP_STATUS_SUCCESS -- upon successfully setting the value
// in the report packet
// - HIDP_STATUS_INVALID_REPORT_TYPE -- if ReportType is not valid.
// - HIDP_STATUS_INVALID_PREPARSED_DATA -- if PreparsedData is not valid
// - HIDP_STATUS_INVALID_REPORT_LENGTH -- the length of the report packet is not
// equal to the length specified in
// the HIDP_CAPS structure for the given
// ReportType
// - HIDP_STATUS_REPORT_DOES_NOT_EXIST -- if there are no reports on this device
// for the given ReportType
// - HIDP_STATUS_INCOMPATIBLE_REPORT_ID -- the specified usage page, usage and
// link collection exist but exists in
// a report with a different report ID
// than the report being passed in. To
// set this value, call HidP_SetUsageValue
// again with a zero-initizialed report
// packet
// - HIDP_STATUS_USAGE_NOT_FOUND -- if the usage page, usage, and link
// collection combination does not exist
// in any reports for this ReportType
function HidP_SetUsageValue(ReportType: THIDPReportType; UsagePage: TUsage;
LinkCollection: Word; Usage: TUsage; UsageValue: ULONG;
PreparsedData: PHIDPPreparsedData; var Report;
ReportLength: ULONG): NTSTATUS; stdcall;
// Description:
// HidP_SetScaledUsageValue inserts the UsageValue into the HID report packet
// in the field corresponding to the given usage page and usage. If a report
// packet contains two different fields with the same Usage and UsagePage,
// they can be distinguished with the optional LinkCollection field value.
//
// If the specified field has a defined physical range, this function converts
// the physical value specified to the corresponding logical value for the
// report. If a physical value does not exist, the function will verify that
// the value specified falls within the logical range and set according.
//
// If the range checking fails but the field has NULL values, the function will
// set the field to the defined NULL value (most negative number possible) and
// return HIDP_STATUS_NULL. In other words, use this function to set NULL
// values for a given field by passing in a value that falls outside the
// physical range if it is defined or the logical range otherwise.
//
// If the field does not support NULL values, an out of range error will be
// returned instead.
//
// Parameters:
//
// ReportType One of HidP_Output or HidP_Feature.
//
// UsagePage The usage page to which the given usage refers.
//
// LinkCollection (Optional) This value can be used to differentiate
// between two fields that may have the same
// UsagePage and Usage but exist in different
// collections. If the link collection value
// is zero, this function will set the first field
// it finds that matches the usage page and
// usage.
//
// Usage The usage whose value HidP_SetScaledUsageValue will set.
//
// UsageValue The value to set in the report buffer. See the routine
// description above for the different interpretations of this
// value
//
// PreparsedData The preparsed data returned from HIDCLASS
//
// Report The report packet.
//
// ReportLength Length (in bytes) of the given report packet.
//
//
// Return Value:
// HidP_SetScaledUsageValue returns the following error codes:
//
// - HIDP_STATUS_SUCCESS -- upon successfully setting the value
// in the report packet
// - HIDP_STATUS_NULL -- upon successfully setting the value
// in the report packet as a NULL value
// - HIDP_STATUS_INVALID_REPORT_TYPE -- if ReportType is not valid.
// - HIDP_STATUS_INVALID_PREPARSED_DATA -- if PreparsedData is not valid
// - HIDP_STATUS_INVALID_REPORT_LENGTH -- the length of the report packet is not
// equal to the length specified in
// the HIDP_CAPS structure for the given
// ReportType
// - HIDP_STATUS_VALUE_OUT_OF_RANGE -- if the value specified failed to fall
// within the physical range if it exists
// or within the logical range otherwise
// and the field specified by the usage
// does not allow NULL values
// - HIDP_STATUS_BAD_LOG_PHY_VALUES -- if the field has a physical range but
// either the logical range is invalid
// (max <= min) or the physical range is
// invalid
// - HIDP_STATUS_INCOMPATIBLE_REPORT_ID -- the specified usage page, usage and
// link collection exist but exists in
// a report with a different report ID
// than the report being passed in. To
// set this value, call
// HidP_SetScaledUsageValue again with
// a zero-initialized report packet
// - HIDP_STATUS_USAGE_NOT_FOUND -- if the usage page, usage, and link
// collection combination does not exist
// in any reports for this ReportType
function HidP_SetScaledUsageValue(ReportType: THIDPReportType; UsagePage: TUsage;
LinkCollection: Word; Usage: TUsage; UsageValue: Integer;
PreparsedData: PHIDPPreparsedData; var Report;
ReportLength: ULONG): NTSTATUS; stdcall;
// Routine Descripton:
// A usage value array occurs when the last usage in the list of usages
// describing a main item must be repeated because there are less usages defined
// than there are report counts declared for the given main item. In this case
// a single value cap is allocated for that usage and the report count of that
// value cap is set to reflect the number of fields to which that usage refers.
//
// HidP_SetUsageValueArray sets the raw bits for that usage which spans
// more than one field in a report.
//
// NOTE: This function currently does not support value arrays where the
// ReportSize for each of the fields in the array is not a multiple
// of 8 bits.
//
// The UsageValue buffer should have the values set as they would appear
// in the report buffer. If this function supported non 8-bit multiples
// for the ReportSize then caller should format the input buffer so that
// each new value begins at the bit immediately following the last bit
// of the previous value
//
// Parameters:
//
// ReportType One of HidP_Output or HidP_Feature.
//
// UsagePage The usage page to which the given usage refers.
//
// LinkCollection (Optional) This value can be used to differentiate
// between two fields that may have the same
// UsagePage and Usage but exist in different
// collections. If the link collection value
// is zero, this function will set the first field
// it finds that matches the usage page and
// usage.
//
// Usage The usage whose value array HidP_SetUsageValueArray will set.
//
// UsageValue The buffer with the values to set into the value array.
// The number of BITS required is found by multiplying the
// BitSize and ReportCount fields of the Value Cap for this
// control. The least significant bit of this control found in the
// given report will be placed in the least significan bit location
// of the array given (little-endian format), regardless of whether
// or not the field is byte alligned or if the BitSize is a multiple
// of sizeof (CHAR).
//
// See the above note for current implementation limitations.
//
// UsageValueByteLength Length of the UsageValue buffer (in bytes)
//
// PreparsedData The preparsed data returned from HIDCLASS
//
// Report The report packet.
//
// ReportLength Length (in bytes) of the given report packet.
//
//
// Return Value:
// - HIDP_STATUS_SUCCESS -- upon successfully setting the value
// array in the report packet
// - HIDP_STATUS_INVALID_REPORT_TYPE -- if ReportType is not valid.
// - HIDP_STATUS_INVALID_PREPARSED_DATA -- if PreparsedData is not valid
// - HIDP_STATUS_INVALID_REPORT_LENGTH -- the length of the report packet is not
// equal to the length specified in
// the HIDP_CAPS structure for the given
// ReportType
// - HIDP_STATUS_REPORT_DOES_NOT_EXIST -- if there are no reports on this device
// for the given ReportType
// - HIDP_STATUS_NOT_VALUE_ARRAY -- if the control specified is not a
// value array -- a value array will have
// a ReportCount field in the
// HIDP_VALUE_CAPS structure that is > 1
// Use HidP_SetUsageValue instead
// - HIDP_STATUS_BUFFER_TOO_SMALL -- if the size of the passed in buffer with
// the values to set is too small (ie. has
// fewer values than the number of fields in
// the array
// - HIDP_STATUS_NOT_IMPLEMENTED -- if the usage value array has field sizes
// that are not multiples of 8 bits, this
// error code is returned since the function
// currently does not handle setting into
// such arrays.
// - HIDP_STATUS_INCOMPATIBLE_REPORT_ID -- the specified usage page, usage and
// link collection exist but exists in
// a report with a different report ID
// than the report being passed in. To
// set this value, call
// HidP_SetUsageValueArray again with
// a zero-initialized report packet
// - HIDP_STATUS_USAGE_NOT_FOUND -- if the usage page, usage, and link
// collection combination does not exist
// in any reports for this ReportType
function HidP_SetUsageValueArray(ReportType: THIDPReportType; UsagePage: TUsage;
LinkCollection: Word; Usage: TUsage; UsageValue: PChar;
UsageValueByteLength: Word; PreparsedData: PHIDPPreparsedData;
var Report; ReportLength: ULONG): NTSTATUS; stdcall;
// Routine Description:
// This function will return the difference between a two lists of usages
// (as might be returned from HidP_GetUsages), In other words, it will return
// return a list of usages that are in the current list but not the previous
// list as well as a list of usages that are in the previous list but not
// the current list.
//
// Parameters:
//
// PreviousUsageList The list of usages before.
// CurrentUsageList The list of usages now.
// BreakUsageList Previous - Current.
// MakeUsageList Current - Previous.
// UsageListLength Represents the length of the usage lists in array
// elements. If comparing two lists with a differing
// number of array elements, this value should be
// the size of the larger of the two lists. Any
// zero found with a list indicates an early termination
// of the list and any usages found after the first zero
// will be ignored.
function HidP_UsageListDifference(PreviousUsageList: PUsage;
CurrentUsageList: PUsage; BreakUsageList: PUsage;
MakeUsageList: PUsage; UsageListLength: ULONG): NTSTATUS; stdcall;
// (rom) these two functions are prototyped in hidpi.h
// (rom) but are missing in all HID.DLL versions
// function HidP_UsageAndPageListDifference(PreviousUsageList: PUsageAndPage;
// CurrentUsageList: PUsageAndPage; BreakUsageList: PUsageAndPage;
// MakeUsageList: PUsageAndPage; UsageListLength: ULONG):NTSTATUS; stdcall;
// function HidP_TranslateUsageAndPagesToI8042ScanCodes(ChangedUsageList: PUsageAndPage;
// UsageListLength: ULONG; KeyAction: THIDPKeyboardDirection;
// var ModifierState: THIDPKeyboardModifierState;
// InsertCodesProcedure: THIDPInsertScanCodes;
// InsertCodesContext: Pointer): NTSTATUS; stdcall;
function HidP_TranslateUsagesToI8042ScanCodes(ChangedUsageList: PUsage;
UsageListLength: ULONG; KeyAction: THIDPKeyboardDirection;
var ModifierState: THIDPKeyboardModifierState;
InsertCodesProcedure: THIDPInsertScanCodes;
InsertCodesContext: Pointer): NTSTATUS; stdcall;
// Description:
// Given a data index from the value or button capabilities of a given control
// return any extended attributes for the control if any exist.
//
// Parameters:
// ReportType One of HidP_Input, HidP_Output, or HidP_Feature.
//
// DataIndex The data index for the given control, found in the capabilities
// structure for that control
//
// PreparsedData The preparsed data returned from HIDCLASS.
//
// Attributes Pointer to a buffer into which the extended attribute data will
// be copied.
//
// LengthAttributes Length of the given buffer in bytes.
//
// Return Value
// HIDP_STATUS_SUCCESS
// HIDP_STATUS_DATA_INDEX_NOT_FOUND
{$IFDEF WIN2000}
// (rom) This function is not in the HID.DLL of Windows 98
// (rom) never call it unless you have Windows 98 SE or Windows 2000
function HidP_GetExtendedAttributes(ReportType: THIDPReportType;
DataIndex: Word; PreparsedData: PHIDPPreparsedData;
Attributes: PHIDPExtendedAttributes;
var LengthAttributes: ULONG): NTSTATUS; stdcall;
// Routine Description:
//
// Initialize a report based on the given report ID.
//
// Parameters:
//
// ReportType One of HidP_Input, HidP_Output, or HidP_Feature.
//
// PreparsedData Preparsed data structure returned by HIDCLASS
//
// Report Buffer which to set the data into.
//
// ReportLength Length of Report...Report should be at least as long as the
// value indicated in the HIDP_CAPS structure for the device and
// the corresponding ReportType
//
// Return Value
//
// - HIDP_STATUS_INVALID_REPORT_TYPE -- if ReportType is not valid.
// - HIDP_STATUS_INVALID_PREPARSED_DATA -- if PreparsedData is not valid
// - HIDP_STATUS_INVALID_REPORT_LENGTH -- the length of the report packet is not equal
// to the length specified in HIDP_CAPS
// structure for the given ReportType
// - HIDP_STATUS_REPORT_DOES_NOT_EXIST -- if there are no reports on this device
// for the given ReportType
// (rom) This function is not in the HID.DLL of Windows 98
// (rom) never call it unless you have Windows 98 SE or Windows 2000
function HidP_InitializeReportForID(ReportType: THIDPReportType;
ReportID: BYTE; PreparsedData: PHIDPPreparsedData;
var Report; ReportLength: ULONG): NTSTATUS; stdcall;
{$ENDIF WIN2000}
{$ELSE}
THidD_Hello = function(Buffer: PChar; BufferLength: ULONG): ULONG; stdcall;
THidD_GetHidGuid = procedure(var HidGuid: TGUID) stdcall;
THidD_GetPreparsedData = function(HidDeviceObject: THandle;
var PreparsedData: PHIDPPreparsedData): LongBool; stdcall;
THidD_FreePreparsedData = function(PreparsedData: PHIDPPreparsedData): LongBool; stdcall;
THidD_GetConfiguration = function(HidDeviceObject: THandle;
var HidConfig: THIDDConfiguration; Size: Integer): LongBool; stdcall;
THidD_SetConfiguration = function(HidDeviceObject: THandle;
const HidConfig: THIDDConfiguration; Size: Integer): LongBool; stdcall;
THidD_FlushQueue = function(HidDeviceObject: THandle): LongBool; stdcall;
THidD_GetFeature = function(HidDeviceObject: THandle;
var Report; Size: Integer): LongBool; stdcall;
THidD_SetFeature = function(HidDeviceObject: THandle;
var Report; Size: Integer): LongBool; stdcall;
THidD_GetNumInputBuffers = function(HidDeviceObject: THandle;
var NumBufs: Integer): LongBool; stdcall;
THidD_SetNumInputBuffers = function(HidDeviceObject: THandle;
NumBufs: Integer): LongBool; stdcall;
THidD_GetAttributes = function(HidDeviceObject: THandle;
var HidAttrs: THIDDAttributes): LongBool; stdcall;
THidD_GetManufacturerString = function(HidDeviceObject: THandle;
Buffer: PWideChar; BufferLength: Integer): LongBool; stdcall;
THidD_GetProductString = function(HidDeviceObject: THandle;
Buffer: PWideChar; BufferLength: Integer): LongBool; stdcall;
THidD_GetSerialNumberString = function(HidDeviceObject: THandle;
Buffer: PWideChar; BufferLength: Integer): LongBool; stdcall;
THidD_GetPhysicalDescriptor = function(HidDeviceObject: THandle;
var Buffer; BufferLength: Integer): LongBool; stdcall;
THidD_GetIndexedString = function(HidDeviceObject: THandle;
Index: Integer; Buffer: PWideChar; BufferLength: Integer): LongBool; stdcall;
// (rom) new XP functions
THidD_GetInputReport = function(HidDeviceObject: THandle;
Buffer: Pointer; BufferLength: ULONG): LongBool; stdcall;
THidD_SetOutputReport = function(HidDeviceObject: THandle;
Buffer: Pointer; BufferLength: ULONG): LongBool; stdcall;
THidP_GetCaps = function(PreparsedData: PHIDPPreparsedData;
var Capabilities: THIDPCaps): NTSTATUS; stdcall;
THidP_GetLinkCollectionNodes = function(LinkCollectionNodes: PHIDPLinkCollectionNode;
var LinkCollectionNodesLength: ULONG; PreparsedData: PHIDPPreparsedData): NTSTATUS; stdcall;
THidP_GetSpecificButtonCaps = function(ReportType: THIDPReportType;
UsagePage: TUsage; LinkCollection: Word; Usage: TUsage; ButtonCaps: PHIDPButtonCaps;
var ButtonCapsLength: Word; PreparsedData: PHIDPPreparsedData): NTSTATUS; stdcall;
THidP_GetSpecificValueCaps = function(ReportType: THIDPReportType; UsagePage: TUsage;
LinkCollection: Word; Usage: TUsage; ValueCaps: PHIDPValueCaps;
var ValueCapsLength: Word; PreparsedData: PHIDPPreparsedData): NTSTATUS; stdcall;
THidP_GetData = function(ReportType: THIDPReportType; DataList: PHIDPData;
var DataLength: ULONG; PreparsedData: PHIDPPreparsedData;
var Report; ReportLength: ULONG): NTSTATUS; stdcall;
THidP_SetData = function(ReportType: THIDPReportType; DataList: PHIDPData;
var DataLength: ULONG; PreparsedData: PHIDPPreparsedData;
var Report; ReportLength: ULONG): NTSTATUS; stdcall;
THidP_MaxDataListLength = function(ReportType: THIDPReportType;
PreparsedData: PHIDPPreparsedData): ULONG; stdcall;
THidP_GetUsages = function(ReportType: THIDPReportType; UsagePage: TUsage;
LinkCollection: Word; UsageList: PUsage; var UsageLength: ULONG;
PreparsedData: PHIDPPreparsedData; var Report;
ReportLength: ULONG): NTSTATUS; stdcall;
THidP_GetButtons = function(ReportType: THIDPReportType; UsagePage: TUsage;
LinkCollection: Word; UsageList: PUsage; var UsageLength: ULONG;
PreparsedData: PHIDPPreparsedData; var Report;
ReportLength: ULONG): NTSTATUS; stdcall;
THidP_GetUsagesEx = function(ReportType: THIDPReportType; LinkCollection: Word;
UsageList: PUsageAndPage; var UsageLength: ULONG;
PreparsedData: PHIDPPreparsedData; var Report;
ReportLength: ULONG): NTSTATUS; stdcall;
THidP_GetButtonsEx = function(ReportType: THIDPReportType; LinkCollection: Word;
UsageList: PUsageAndPage; var UsageLength: ULONG;
PreparsedData: PHIDPPreparsedData; var Report;
ReportLength: ULONG): NTSTATUS; stdcall;
THidP_SetUsages = function(ReportType: THIDPReportType; UsagePage: TUsage;
LinkCollection: Word; UsageList: PUsage; var UsageLength: ULONG;
PreparsedData: PHIDPPreparsedData; var Report;
ReportLength: ULONG): NTSTATUS; stdcall;
THidP_SetButtons = function(ReportType: THIDPReportType; UsagePage: TUsage;
LinkCollection: Word; ButtonList: PUsage; var ButtonLength: ULONG;
PreparsedData: PHIDPPreparsedData; var Report;
ReportLength: ULONG): NTSTATUS; stdcall;
THidP_UnsetUsages = function(ReportType: THIDPReportType; UsagePage: TUsage;
LinkCollection: Word; UsageList: PUsage; var UsageLength: ULONG;
PreparsedData: PHIDPPreparsedData; var Report;
ReportLength: ULONG): NTSTATUS; stdcall;
THidP_UnsetButtons = function(ReportType: THIDPReportType; UsagePage: TUsage;
LinkCollection: Word; ButtonList: PUsage; var ButtonLength: ULONG;
PreparsedData: PHIDPPreparsedData; var Report;
ReportLength: ULONG): NTSTATUS; stdcall;
THidP_MaxUsageListLength = function(ReportType: THIDPReportType; UsagePage: TUsage;
PreparsedData: PHIDPPreparsedData): ULONG; stdcall;
THidP_MaxButtonListLength = function(ReportType: THIDPReportType; UsagePage: TUsage;
PreparsedData: PHIDPPreparsedData): ULONG; stdcall;
THidP_GetUsageValue = function(ReportType: THIDPReportType; UsagePage: TUsage;
LinkCollection: Word; Usage: TUsage; var UsageValue: ULONG;
PreparsedData: PHIDPPreparsedData; var Report;
ReportLength: ULONG): NTSTATUS; stdcall;
THidP_GetScaledUsageValue = function(ReportType: THIDPReportType; UsagePage: TUsage;
LinkCollection: Word; Usage: TUsage; var UsageValue: Integer;
PreparsedData: PHIDPPreparsedData; var Report;
ReportLength: ULONG): NTSTATUS; stdcall;
THidP_GetUsageValueArray = function(ReportType: THIDPReportType; UsagePage: TUsage;
LinkCollection: Word; Usage: TUsage; UsageValue: PChar;
UsageValueByteLength: Word; PreparsedData: PHIDPPreparsedData;
var Report; ReportLength: ULONG): NTSTATUS; stdcall;
THidP_SetUsageValue = function(ReportType: THIDPReportType; UsagePage: TUsage;
LinkCollection: Word; Usage: TUsage; UsageValue: ULONG;
PreparsedData: PHIDPPreparsedData; var Report;
ReportLength: ULONG): NTSTATUS; stdcall;
THidP_SetScaledUsageValue = function(ReportType: THIDPReportType; UsagePage: TUsage;
LinkCollection: Word; Usage: TUsage; UsageValue: Integer;
PreparsedData: PHIDPPreparsedData; var Report;
ReportLength: ULONG): NTSTATUS; stdcall;
THidP_SetUsageValueArray = function(ReportType: THIDPReportType; UsagePage: TUsage;
LinkCollection: Word; Usage: TUsage; UsageValue: PChar;
UsageValueByteLength: Word; PreparsedData: PHIDPPreparsedData;
var Report; ReportLength: ULONG): NTSTATUS; stdcall;
THidP_UsageListDifference = function(PreviousUsageList: PUsage;
CurrentUsageList: PUsage; BreakUsageList: PUsage;
MakeUsageList: PUsage; UsageListLength: ULONG): NTSTATUS; stdcall;
THidP_TranslateUsagesToI8042ScanCodes = function(ChangedUsageList: PUsage;
UsageListLength: ULONG; KeyAction: THIDPKeyboardDirection;
var ModifierState: THIDPKeyboardModifierState;
InsertCodesProcedure: THIDPInsertScanCodes;
InsertCodesContext: Pointer): NTSTATUS; stdcall;
// (rom) new Win2000 functions
THidP_GetExtendedAttributes = function(ReportType: THIDPReportType;
DataIndex: Word; PreparsedData: PHIDPPreparsedData;
Attributes: PHIDPExtendedAttributes;
var LengthAttributes: ULONG): NTSTATUS; stdcall;
THidP_InitializeReportForID = function(ReportType: THIDPReportType;
ReportID: BYTE; PreparsedData: PHIDPPreparsedData;
var Report; ReportLength: ULONG): NTSTATUS; stdcall;
var
HidD_Hello: THidD_Hello;
HidD_GetHidGuid: THidD_GetHidGuid;
HidD_GetPreparsedData: THidD_GetPreparsedData;
HidD_FreePreparsedData: THidD_FreePreparsedData;
HidD_GetConfiguration: THidD_GetConfiguration;
HidD_SetConfiguration: THidD_SetConfiguration;
HidD_FlushQueue: THidD_FlushQueue;
HidD_GetFeature: THidD_GetFeature;
HidD_SetFeature: THidD_SetFeature;
HidD_GetNumInputBuffers: THidD_GetNumInputBuffers;
HidD_SetNumInputBuffers: THidD_SetNumInputBuffers;
HidD_GetAttributes: THidD_GetAttributes;
HidD_GetManufacturerString: THidD_GetManufacturerString;
HidD_GetProductString: THidD_GetProductString;
HidD_GetSerialNumberString: THidD_GetSerialNumberString;
HidD_GetPhysicalDescriptor: THidD_GetPhysicalDescriptor;
HidD_GetIndexedString: THidD_GetIndexedString;
// (rom) new XP functions
HidD_GetInputReport: THidD_GetInputReport;
HidD_SetOutputReport: THidD_SetOutputReport;
HidP_GetCaps: THidP_GetCaps;
HidP_GetLinkCollectionNodes: THidP_GetLinkCollectionNodes;
HidP_GetSpecificButtonCaps: THidP_GetSpecificButtonCaps;
HidP_GetSpecificValueCaps: THidP_GetSpecificValueCaps;
HidP_GetData: THidP_GetData;
HidP_SetData: THidP_SetData;
HidP_MaxDataListLength: THidP_MaxDataListLength;
HidP_GetUsages: THidP_GetUsages;
HidP_GetButtons: THidP_GetButtons;
HidP_GetUsagesEx: THidP_GetUsagesEx;
HidP_GetButtonsEx: THidP_GetButtonsEx;
HidP_SetUsages: THidP_SetUsages;
HidP_SetButtons: THidP_SetButtons;
HidP_UnsetUsages: THidP_UnsetUsages;
HidP_UnsetButtons: THidP_UnsetButtons;
HidP_MaxUsageListLength: THidP_MaxUsageListLength;
HidP_MaxButtonListLength: THidP_MaxButtonListLength;
HidP_GetUsageValue: THidP_GetUsageValue;
HidP_GetScaledUsageValue: THidP_GetScaledUsageValue;
HidP_GetUsageValueArray: THidP_GetUsageValueArray;
HidP_SetUsageValue: THidP_SetUsageValue;
HidP_SetScaledUsageValue: THidP_SetScaledUsageValue;
HidP_SetUsageValueArray: THidP_SetUsageValueArray;
HidP_UsageListDifference: THidP_UsageListDifference;
HidP_TranslateUsagesToI8042ScanCodes: THidP_TranslateUsagesToI8042ScanCodes;
// (rom) new XP functions
HidP_GetExtendedAttributes: THidP_GetExtendedAttributes;
HidP_InitializeReportForID: THidP_InitializeReportForID;
{$ENDIF HID_LINKONREQUEST}
// Description:
// HidP_GetButtonCaps returns all the buttons (binary values) that are a part
// of the given report type for the Hid device represented by the given
// preparsed data.
//
// Parameters:
// ReportType One of HidP_Input, HidP_Output, or HidP_Feature.
//
// UsagePage A usage page value used to limit the button caps returned to
// those on a given usage page. If set to 0, this parameter is
// ignored. Can be used with LinkCollection and Usage parameters
// to further limit the number of button caps structures returned.
//
// LinkCollection HIDP_LINK_COLLECTION node array index used to limit the
// button caps returned to those buttons in a given link
// collection. If set to 0, this parameter is
// ignored. Can be used with UsagePage and Usage parameters
// to further limit the number of button caps structures
// returned.
//
// Usage A usage value used to limit the button caps returned to those
// with the specified usage value. If set to 0, this parameter
// is ignored. Can be used with LinkCollection and UsagePage
// parameters to further limit the number of button caps
// structures returned.
//
// ButtonCaps A _HIDP_BUTTON_CAPS array containing information about all the
// binary values in the given report. This buffer is provided by
// the caller.
//
// ButtonLength As input, this parameter specifies the length of the
// ButtonCaps parameter (array) in number of array elements.
// As output, this value is set to indicate how many of those
// array elements were filled in by the function. The maximum number of
// button caps that can be returned is found in the HIDP_CAPS
// structure. If HIDP_STATUS_BUFFER_TOO_SMALL is returned,
// this value contains the number of array elements needed to
// successfully complete the request.
//
// PreparsedData The preparsed data returned from HIDCLASS.
//
//
// Return Value
// HidP_GetSpecificButtonCaps returns the following error codes:
// - HIDP_STATUS_SUCCESS.
// - HIDP_STATUS_INVALID_REPORT_TYPE
// - HIDP_STATUS_INVALID_PREPARSED_DATA
// - HIDP_STATUS_BUFFER_TOO_SMALL (all given entries however have been filled in)
// - HIDP_STATUS_USAGE_NOT_FOUND
// (rom) this function is a macro and cannot be implemented with the original name
function HidP_GetButtonCaps_(ReportType: THIDPReportType; ButtonCaps: PHIDPButtonCaps;
var ButtonCapsLength: Word; PreparsedData: PHIDPPreparsedData): NTSTATUS;
// Description:
// HidP_GetValueCaps returns all the values (non-binary) that are a part
// of the given report type for the Hid device represented by the given
// preparsed data.
//
// Parameters:
// ReportType One of HidP_Input, HidP_Output, or HidP_Feature.
//
// UsagePage A usage page value used to limit the value caps returned to
// those on a given usage page. If set to 0, this parameter is
// ignored. Can be used with LinkCollection and Usage parameters
// to further limit the number of value caps structures returned.
//
// LinkCollection HIDP_LINK_COLLECTION node array index used to limit the
// value caps returned to those buttons in a given link
// collection. If set to 0, this parameter is
// ignored. Can be used with UsagePage and Usage parameters
// to further limit the number of value caps structures
// returned.
//
// Usage A usage value used to limit the value caps returned to those
// with the specified usage value. If set to 0, this parameter
// is ignored. Can be used with LinkCollection and UsagePage
// parameters to further limit the number of value caps
// structures returned.
//
// ValueCaps A _HIDP_VALUE_CAPS array containing information about all the
// non-binary values in the given report. This buffer is provided
// by the caller.
//
// ValueLength As input, this parameter specifies the length of the ValueCaps
// parameter (array) in number of array elements. As output,
// this value is set to indicate how many of those array elements
// were filled in by the function. The maximum number of
// value caps that can be returned is found in the HIDP_CAPS
// structure. If HIDP_STATUS_BUFFER_TOO_SMALL is returned,
// this value contains the number of array elements needed to
// successfully complete the request.
//
// PreparsedData The preparsed data returned from HIDCLASS.
//
//
// Return Value
// HidP_GetValueCaps returns the following error codes:
// - HIDP_STATUS_SUCCESS.
// - HIDP_STATUS_INVALID_REPORT_TYPE
// - HIDP_STATUS_INVALID_PREPARSED_DATA
// - HIDP_STATUS_BUFFER_TOO_SMALL (all given entries however have been filled in)
// - HIDP_STATUS_USAGE_NOT_FOUND
// (rom) this function is a macro and cannot be implemented with the original name
function HidP_GetValueCaps_(ReportType: THIDPReportType; ValueCaps: PHIDPValueCaps;
var ValueCapsLength: Word; PreparsedData: PHIDPPreparsedData): NTSTATUS;
function HidP_IsSameUsageAndPage_(u1, u2: TUsageAndPage): Boolean;
function IsHidLoaded: Boolean;
function LoadHid: Boolean;
procedure UnloadHid;
const
HidModuleName = 'HID.dll';
implementation
uses
SysUtils,
ModuleLoader;
{$IFDEF HID_LINKONREQUEST}
var
HidLib: TModuleHandle = INVALID_MODULEHANDLE_VALUE;
{$ENDIF HID_LINKONREQUEST}
// (rom) this function is a macro and cannot be implemented with the original name
// (rom) simply adds three 0 params on call
function HidP_GetButtonCaps_(ReportType: THIDPReportType;
ButtonCaps: PHIDPButtonCaps; var ButtonCapsLength: Word;
PreparsedData: PHIDPPreparsedData): NTSTATUS;
begin
Result :=
HidP_GetSpecificButtonCaps(ReportType, 0, 0, 0, ButtonCaps,
ButtonCapsLength, PreparsedData);
end;
// (rom) this function is a macro and cannot be implemented with the original name
// (rom) simply adds three 0 params on call
function HidP_GetValueCaps_(ReportType: THIDPReportType;
ValueCaps: PHIDPValueCaps; var ValueCapsLength: Word;
PreparsedData: PHIDPPreparsedData): NTSTATUS;
begin
Result :=
HidP_GetSpecificValueCaps(ReportType, 0, 0, 0, ValueCaps,
ValueCapsLength, PreparsedData);
end;
// (rom) implements HidP_IsSameUsageAndPage macro
// (rom) the original macro is a really dirty trick
function HidP_IsSameUsageAndPage_(u1, u2: TUsageAndPage): Boolean;
begin
Result := (u1.Usage = u2.Usage) and (u1.UsagePage = u2.UsagePage);
end;
function IsHidLoaded: Boolean;
begin
{$IFDEF HID_LINKONREQUEST}
Result := HidLib <> INVALID_MODULEHANDLE_VALUE;
{$ELSE}
Result := True;
{$ENDIF HID_LINKONREQUEST}
end;
function LoadHid: Boolean;
begin
{$IFDEF HID_LINKONREQUEST}
Result := LoadModule(HidLib, HidModuleName);
if Result then
begin
@HidD_Hello := GetModuleSymbolEx(HidLib, 'HidD_Hello', Result);
@HidD_GetHidGuid := GetModuleSymbolEx(HidLib, 'HidD_GetHidGuid', Result);
@HidD_GetPreparsedData := GetModuleSymbolEx(HidLib, 'HidD_GetPreparsedData', Result);
@HidD_FreePreparsedData := GetModuleSymbolEx(HidLib, 'HidD_FreePreparsedData', Result);
@HidD_GetConfiguration := GetModuleSymbolEx(HidLib, 'HidD_GetConfiguration', Result);
@HidD_SetConfiguration := GetModuleSymbolEx(HidLib, 'HidD_SetConfiguration', Result);
@HidD_FlushQueue := GetModuleSymbolEx(HidLib, 'HidD_FlushQueue', Result);
@HidD_GetFeature := GetModuleSymbolEx(HidLib, 'HidD_GetFeature', Result);
@HidD_SetFeature := GetModuleSymbolEx(HidLib, 'HidD_SetFeature', Result);
@HidD_GetNumInputBuffers := GetModuleSymbolEx(HidLib, 'HidD_GetNumInputBuffers', Result);
@HidD_SetNumInputBuffers := GetModuleSymbolEx(HidLib, 'HidD_SetNumInputBuffers', Result);
@HidD_GetAttributes := GetModuleSymbolEx(HidLib, 'HidD_GetAttributes', Result);
@HidD_GetManufacturerString := GetModuleSymbolEx(HidLib, 'HidD_GetManufacturerString', Result);
@HidD_GetProductString := GetModuleSymbolEx(HidLib, 'HidD_GetProductString', Result);
@HidD_GetSerialNumberString := GetModuleSymbolEx(HidLib, 'HidD_GetSerialNumberString', Result);
@HidD_GetPhysicalDescriptor := GetModuleSymbolEx(HidLib, 'HidD_GetPhysicalDescriptor', Result);
@HidD_GetIndexedString := GetModuleSymbolEx(HidLib, 'HidD_GetIndexedString', Result);
if (Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion >= 5) and (Win32MinorVersion >= 1) then
begin
@HidD_GetInputReport := GetModuleSymbolEx(HidLib, 'HidD_GetInputReport', Result);
@HidD_SetOutputReport := GetModuleSymbolEx(HidLib, 'HidD_SetOutputReport', Result);
end;
@HidP_GetCaps := GetModuleSymbolEx(HidLib, 'HidP_GetCaps', Result);
@HidP_GetLinkCollectionNodes := GetModuleSymbolEx(HidLib, 'HidP_GetLinkCollectionNodes', Result);
@HidP_GetSpecificButtonCaps := GetModuleSymbolEx(HidLib, 'HidP_GetSpecificButtonCaps', Result);
@HidP_GetSpecificValueCaps := GetModuleSymbolEx(HidLib, 'HidP_GetSpecificValueCaps', Result);
@HidP_GetData := GetModuleSymbolEx(HidLib, 'HidP_GetData', Result);
@HidP_SetData := GetModuleSymbolEx(HidLib, 'HidP_SetData', Result);
@HidP_MaxDataListLength := GetModuleSymbolEx(HidLib, 'HidP_MaxDataListLength', Result);
@HidP_GetUsages := GetModuleSymbolEx(HidLib, 'HidP_GetUsages', Result);
@HidP_GetButtons := GetModuleSymbolEx(HidLib, 'HidP_GetUsages', Result);
@HidP_GetUsagesEx := GetModuleSymbolEx(HidLib, 'HidP_GetUsagesEx', Result);
@HidP_GetButtonsEx := GetModuleSymbolEx(HidLib, 'HidP_GetUsagesEx', Result);
@HidP_SetUsages := GetModuleSymbolEx(HidLib, 'HidP_SetUsages', Result);
@HidP_SetButtons := GetModuleSymbolEx(HidLib, 'HidP_SetUsages', Result);
@HidP_UnsetUsages := GetModuleSymbolEx(HidLib, 'HidP_UnsetUsages', Result);
@HidP_UnsetButtons := GetModuleSymbolEx(HidLib, 'HidP_UnsetUsages', Result);
@HidP_MaxUsageListLength := GetModuleSymbolEx(HidLib, 'HidP_MaxUsageListLength', Result);
@HidP_MaxButtonListLength := GetModuleSymbolEx(HidLib, 'HidP_MaxUsageListLength', Result);
@HidP_GetUsageValue := GetModuleSymbolEx(HidLib, 'HidP_GetUsageValue', Result);
@HidP_GetScaledUsageValue := GetModuleSymbolEx(HidLib, 'HidP_GetScaledUsageValue', Result);
@HidP_GetUsageValueArray := GetModuleSymbolEx(HidLib, 'HidP_GetUsageValueArray', Result);
@HidP_SetUsageValue := GetModuleSymbolEx(HidLib, 'HidP_SetUsageValue', Result);
@HidP_SetScaledUsageValue := GetModuleSymbolEx(HidLib, 'HidP_SetScaledUsageValue', Result);
@HidP_SetUsageValueArray := GetModuleSymbolEx(HidLib, 'HidP_SetUsageValueArray', Result);
@HidP_UsageListDifference := GetModuleSymbolEx(HidLib, 'HidP_UsageListDifference', Result);
@HidP_TranslateUsagesToI8042ScanCodes := GetModuleSymbolEx(HidLib, 'HidP_TranslateUsagesToI8042ScanCodes', Result);
if (Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion >= 5) then
begin
@HidP_GetExtendedAttributes := GetModuleSymbolEx(HidLib, 'HidP_GetExtendedAttributes', Result);
@HidP_InitializeReportForID := GetModuleSymbolEx(HidLib, 'HidP_InitializeReportForID', Result);
end;
if not Result then
UnloadHid;
end;
{$ELSE}
Result := True;
{$ENDIF HID_LINKONREQUEST}
end;
procedure UnloadHid;
begin
{$IFDEF HID_LINKONREQUEST}
UnloadModule(HidLib);
@HidD_Hello := nil;
@HidD_GetHidGuid := nil;
@HidD_GetPreparsedData := nil;
@HidD_FreePreparsedData := nil;
@HidD_GetConfiguration := nil;
@HidD_SetConfiguration := nil;
@HidD_FlushQueue := nil;
@HidD_SetFeature := nil;
@HidD_GetNumInputBuffers := nil;
@HidD_SetNumInputBuffers := nil;
@HidD_GetAttributes := nil;
@HidD_GetManufacturerString := nil;
@HidD_GetProductString := nil;
@HidD_GetSerialNumberString := nil;
@HidD_GetPhysicalDescriptor := nil;
@HidD_GetIndexedString := nil;
@HidD_GetInputReport := nil;
@HidD_SetOutputReport := nil;
@HidP_GetLinkCollectionNodes := nil;
@HidP_GetSpecificButtonCaps := nil;
@HidP_GetSpecificValueCaps := nil;
@HidP_GetData := nil;
@HidP_SetData := nil;
@HidP_MaxDataListLength := nil;
@HidP_GetUsages := nil;
@HidP_GetButtons := nil;
@HidP_GetUsagesEx := nil;
@HidP_GetButtonsEx := nil;
@HidP_SetUsages := nil;
@HidP_SetButtons := nil;
@HidP_UnsetUsages := nil;
@HidP_UnsetButtons := nil;
@HidP_MaxUsageListLength := nil;
@HidP_MaxButtonListLength := nil;
@HidP_GetUsageValue := nil;
@HidP_GetScaledUsageValue := nil;
@HidP_GetUsageValueArray := nil;
@HidP_SetUsageValue := nil;
@HidP_SetScaledUsageValue := nil;
@HidP_SetUsageValueArray := nil;
@HidP_UsageListDifference := nil;
@HidP_TranslateUsagesToI8042ScanCodes := nil;
@HidP_GetExtendedAttributes := nil;
@HidP_InitializeReportForID := nil;
{$ENDIF HID_LINKONREQUEST}
end;
{$IFNDEF HID_LINKONREQUEST}
function HidD_Hello; external HidModuleName name 'HidD_Hello';
procedure HidD_GetHidGuid; external HidModuleName name 'HidD_GetHidGuid';
function HidD_GetPreparsedData; external HidModuleName name 'HidD_GetPreparsedData';
function HidD_FreePreparsedData; external HidModuleName name 'HidD_FreePreparsedData';
function HidD_GetConfiguration; external HidModuleName name 'HidD_GetConfiguration';
function HidD_SetConfiguration; external HidModuleName name 'HidD_SetConfiguration';
function HidD_FlushQueue; external HidModuleName name 'HidD_FlushQueue';
function HidD_GetFeature; external HidModuleName name 'HidD_GetFeature';
function HidD_SetFeature; external HidModuleName name 'HidD_SetFeature';
function HidD_GetNumInputBuffers; external HidModuleName name 'HidD_GetNumInputBuffers';
function HidD_SetNumInputBuffers; external HidModuleName name 'HidD_SetNumInputBuffers';
function HidD_GetAttributes; external HidModuleName name 'HidD_GetAttributes';
function HidD_GetManufacturerString; external HidModuleName name 'HidD_GetManufacturerString';
function HidD_GetProductString; external HidModuleName name 'HidD_GetProductString';
function HidD_GetSerialNumberString; external HidModuleName name 'HidD_GetSerialNumberString';
function HidD_GetPhysicalDescriptor; external HidModuleName name 'HidD_GetPhysicalDescriptor';
function HidD_GetIndexedString; external HidModuleName name 'HidD_GetIndexedString';
{$IFDEF WINXP}
function HidD_GetInputReport; external HidModuleName name 'HidD_GetInputReport';
function HidD_SetOutputReport; external HidModuleName name 'HidD_SetOutputReport';
{$ENDIF WINXP}
function HidP_GetCaps; external HidModuleName name 'HidP_GetCaps';
function HidP_GetLinkCollectionNodes; external HidModuleName name 'HidP_GetLinkCollectionNodes';
function HidP_GetSpecificButtonCaps; external HidModuleName name 'HidP_GetSpecificButtonCaps';
function HidP_GetSpecificValueCaps; external HidModuleName name 'HidP_GetSpecificValueCaps';
function HidP_GetData; external HidModuleName name 'HidP_GetData';
function HidP_SetData; external HidModuleName name 'HidP_SetData';
function HidP_MaxDataListLength; external HidModuleName name 'HidP_MaxDataListLength';
function HidP_GetUsages; external HidModuleName name 'HidP_GetUsages';
function HidP_GetButtons; external HidModuleName name 'HidP_GetUsages';
function HidP_GetUsagesEx; external HidModuleName name 'HidP_GetUsagesEx';
function HidP_GetButtonsEx; external HidModuleName name 'HidP_GetUsagesEx';
function HidP_SetUsages; external HidModuleName name 'HidP_SetUsages';
function HidP_SetButtons; external HidModuleName name 'HidP_SetUsages';
function HidP_UnsetUsages; external HidModuleName name 'HidP_UnsetUsages';
function HidP_UnsetButtons; external HidModuleName name 'HidP_UnsetUsages';
function HidP_MaxUsageListLength; external HidModuleName name 'HidP_MaxUsageListLength';
function HidP_MaxButtonListLength; external HidModuleName name 'HidP_MaxUsageListLength';
function HidP_GetUsageValue; external HidModuleName name 'HidP_GetUsageValue';
function HidP_GetScaledUsageValue; external HidModuleName name 'HidP_GetScaledUsageValue';
function HidP_GetUsageValueArray; external HidModuleName name 'HidP_GetUsageValueArray';
function HidP_SetUsageValue; external HidModuleName name 'HidP_SetUsageValue';
function HidP_SetScaledUsageValue; external HidModuleName name 'HidP_SetScaledUsageValue';
function HidP_SetUsageValueArray; external HidModuleName name 'HidP_SetUsageValueArray';
function HidP_UsageListDifference; external HidModuleName name 'HidP_UsageListDifference';
function HidP_TranslateUsagesToI8042ScanCodes; external HidModuleName name 'HidP_TranslateUsagesToI8042ScanCodes';
// function HidP_UsageAndPageListDifference; external HidModuleName name 'function HidP_UsageAndPageListDifference';
// function HidP_TranslateUsageAndPagesToI8042ScanCodes; external HidModuleName name 'HidP_TranslateUsageAndPagesToI8042ScanCodes';
{$IFDEF WIN2000}
function HidP_GetExtendedAttributes; external HidModuleName name 'HidP_GetExtendedAttributes';
function HidP_InitializeReportForID; external HidModuleName name 'HidP_InitializeReportForID';
{$ENDIF WIN2000}
{$ENDIF HID_LINKONREQUEST}
end.