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

221 lines
4.7 KiB
C

/*++
Copyright (c) 1996, 1997 Microsoft Corporation
Module Name:
hidir.h
--*/
#ifndef __HIDIR_H__
#define __HIDIR_H__
#include <hidusage.h>
//
// Declarations of HID descriptor formats
//
#include <PSHPACK1.H>
typedef UCHAR HID_REPORT_DESCRIPTOR, *PHID_REPORT_DESCRIPTOR;
typedef UCHAR HID_PHYSICAL_DESCRIPTOR, *PHID_PHYSICAL_DESCRIPTOR;
typedef struct _HIDIR_DESCRIPTOR
{
UCHAR bLength;
UCHAR bDescriptorType;
USHORT bcdHID;
UCHAR bCountry;
UCHAR bNumDescriptors;
/*
* This is an array of one OR MORE descriptors.
*/
struct _HIDIR_DESCRIPTOR_DESC_LIST {
UCHAR bDescriptorType;
USHORT wDescriptorLength;
} DescriptorList [1];
} HIDIR_DESCRIPTOR, * PHIDIR_DESCRIPTOR;
#include <POPPACK.H>
// Pool
#define HIDIR_POOL_TAG 'IdiH'
#define ALLOCATEPOOL(poolType, size) ExAllocatePoolWithTag((poolType), (size), HIDIR_POOL_TAG)
//
// Device Extension
//
// This data structure is hooked onto HIDCLASS' device extension, so both drivers can
// have their own private data on each device object.
//
#define HIDIR_REPORT_SIZE sizeof(ULONG)
#define HIDIR_TABLE_ENTRY_SIZE(rl) (sizeof(ULONG) + (((rl)+0x00000003)&(~0x00000003)))
typedef struct _USAGE_TABLE_ENTRY {
ULONG IRString;
UCHAR UsageString[1];
} USAGE_TABLE_ENTRY, *PUSAGE_TABLE_ENTRY;
typedef struct _HIDIR_EXTENSION
{
// What state has pnp got me in?
ULONG DeviceState;
// Ref counting
LONG NumPendingRequests;
KEVENT AllRequestsCompleteEvent;
// My hid bth device object.
PDEVICE_OBJECT DeviceObject;
// Descriptors: HID, report, and physical
HIDIR_DESCRIPTOR HidDescriptor;
PHID_REPORT_DESCRIPTOR ReportDescriptor;
ULONG ReportLength;
BOOLEAN QueryRemove;
// VID, PID, and version
USHORT VendorID;
USHORT ProductID;
USHORT VersionNumber;
ULONG NumUsages;
PUCHAR MappingTable;
USAGE_TABLE_ENTRY PreviousButton;
BOOLEAN ValidUsageSentLastTime[3];
BOOLEAN KeyboardReportIdValid;
UCHAR KeyboardReportId;
BOOLEAN StandbyReportIdValid;
UCHAR StandbyReportId;
DEVICE_POWER_STATE DevicePowerState;
KTIMER IgnoreStandbyTimer;
} HIDIR_EXTENSION, *PHIDIR_EXTENSION;
#define DEVICE_STATE_NONE 0
#define DEVICE_STATE_STARTING 1
#define DEVICE_STATE_RUNNING 2
#define DEVICE_STATE_STOPPING 3
#define DEVICE_STATE_STOPPED 4
#define DEVICE_STATE_REMOVING 5
//
// Device Extension Macros
//
#define GET_MINIDRIVER_HIDIR_EXTENSION(DO) ((PHIDIR_EXTENSION) (((PHID_DEVICE_EXTENSION)(DO)->DeviceExtension)->MiniDeviceExtension))
#define GET_NEXT_DEVICE_OBJECT(DO) (((PHID_DEVICE_EXTENSION)(DO)->DeviceExtension)->NextDeviceObject)
//
// Turn on debug printing and breaking, if appropriate
//
#if DBG
#define DBGPrint(arg) DbgPrint arg
#define DBGBREAK DbgBreakPoint()
#else
#define DBGPrint(arg)
#define DBGBREAK
#endif
//
// Function prototypes
//
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING registryPath
);
NTSTATUS
HidIrIoctl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
HidIrPnP(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
HidIrPower(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
HidIrAddDevice(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT FunctionalDeviceObject
);
VOID
HidIrUnload(
IN PDRIVER_OBJECT DriverObject
);
NTSTATUS
HidIrGetDeviceAttributes(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
HidIrGetHidDescriptor(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN USHORT DescriptorType
);
NTSTATUS
HidIrReadReport(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
OUT BOOLEAN *NeedsCompletion
);
NTSTATUS
HidIrIncrementPendingRequestCount(
IN PHIDIR_EXTENSION DeviceExtension
);
VOID
HidIrDecrementPendingRequestCount(
IN PHIDIR_EXTENSION DeviceExtension
);
NTSTATUS
HidIrSystemControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
HidIrSynchronousCompletion(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
NTSTATUS
HidIrCallDriverSynchronous(
PDEVICE_OBJECT DeviceObject,
PIRP Irp
);
extern ULONG RunningMediaCenter;
#endif // _HIDIR_H__