/* ************************************************************************* * File: HID1394.H * * Module: HID1394.SYS * HID (Human Input Device) minidriver for IEEE 1394 devices. * * * Author: ervinp * ************************************************************************* */ // // Device Class Constants for HID // #define HID_GET_REPORT 0x01 #define HID_GET_IDLE 0x02 #define HID_GET_PROTOCOL 0x03 #define HID_SET_REPORT 0x09 #define HID_SET_IDLE 0x0A #define HID_SET_PROTOCOL 0x0B /* * This device extension resides in memory immediately after * HIDCLASS' extension. */ typedef struct _DEVICE_EXTENSION { ULONG DeviceState; // BUGBUG PUSB_DEVICE_DESCRIPTOR DeviceDescriptor; // BUGBUG PUSBD_INTERFACE_INFORMATION Interface; // BUGBUG USBD_CONFIGURATION_HANDLE ConfigurationHandle; CONFIG_ROM configROM; ULONG NumPendingRequests; KEVENT AllRequestsCompleteEvent; ULONG DeviceFlags; PWORK_QUEUE_ITEM ResetWorkItem; // BUGBUG USB_HID_DESCRIPTOR HidDescriptor; } DEVICE_EXTENSION, *PDEVICE_EXTENSION; /* * This structure is used to pass information to the * resetWorkItem callback. */ typedef struct tag_resetWorkItemContext { WORK_QUEUE_ITEM workItem; PDEVICE_OBJECT deviceObject; PIRP irpToComplete; BOOLEAN irpWasCancelled; struct tag_resetWorkItemContext *next; #if DBG #define RESET_WORK_ITEM_CONTEXT_SIG 'IWSR' ULONG sig; #endif } resetWorkItemContext; #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 #define DEVICE_STATE_START_FAILED 6 #define DEVICE_FLAGS_HID_1_0_D3_COMPAT_DEVICE 0x00000001 // // Interface slection options // #define HUM_SELECT_DEFAULT_INTERFACE 0 #define HUM_SELECT_SPECIFIED_INTERFACE 1 // // Device Extension Macros // #define GET_MINIDRIVER_DEVICE_EXTENSION(DO) ((PDEVICE_EXTENSION) (((PHID_DEVICE_EXTENSION)(DO)->DeviceExtension)->MiniDeviceExtension)) #define GET_HIDCLASS_DEVICE_EXTENSION(DO) ((PHID_DEVICE_EXTENSION)(DO)->DeviceExtension) #define GET_NEXT_DEVICE_OBJECT(DO) (((PHID_DEVICE_EXTENSION)(DO)->DeviceExtension)->NextDeviceObject) /* * HID1394 signature tag for memory allocations */ #define HID1394_TAG (ULONG)'TdiH' // // Function prototypes // NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING registryPath); NTSTATUS HIDT_AbortPendingRequests(IN PDEVICE_OBJECT DeviceObject); NTSTATUS HIDT_CreateClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); NTSTATUS HIDT_InternalIoctl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); NTSTATUS HIDT_PnP(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); NTSTATUS HIDT_Power(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); NTSTATUS HIDT_CreateDevice(IN PDRIVER_OBJECT DriverObject, IN OUT PDEVICE_OBJECT *DeviceObject); NTSTATUS HIDT_AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT FunctionalDeviceObject); NTSTATUS HIDT_StartDevice(IN PDEVICE_OBJECT DeviceObject); NTSTATUS HIDT_PnpCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context); NTSTATUS HIDT_InitDevice(IN PDEVICE_OBJECT DeviceObject); NTSTATUS HIDT_StopDevice(IN PDEVICE_OBJECT DeviceObject); NTSTATUS HIDT_RemoveDevice(IN PDEVICE_OBJECT DeviceObject); VOID HIDT_Unload(IN PDRIVER_OBJECT DriverObject); NTSTATUS HIDT_GetHidDescriptor(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); NTSTATUS HIDT_GetReportDescriptor(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); NTSTATUS HIDT_ReadReport(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, OUT BOOLEAN *NeedsCompletion); NTSTATUS HIDT_ReadCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context); NTSTATUS HIDT_WriteReport(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, OUT BOOLEAN *NeedsCompletion); NTSTATUS HIDT_GetFeature(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, OUT BOOLEAN *NeedsCompletion); NTSTATUS HIDT_SetFeature(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, OUT BOOLEAN *NeedsCompletion); NTSTATUS HIDT_WriteCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context); NTSTATUS HIDT_GetString(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, OUT BOOLEAN *NeedsCompletion); NTSTATUS HIDT_GetDeviceAttributes(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, OUT BOOLEAN *NeedsCompletion); NTSTATUS HIDT_GetDescriptorRequest(IN PDEVICE_OBJECT DeviceObject, IN ULONG DescriptorType, IN OUT PVOID *Descriptor, IN OUT ULONG *DescSize, IN ULONG TypeSize, IN ULONG Index, IN ULONG LangID, IN ULONG ShortTransferOk); NTSTATUS HIDT_GetDescriptorEndpoint(IN PDEVICE_OBJECT DeviceObject, IN ULONG DescriptorType, IN OUT PVOID *Descriptor, IN OUT ULONG *DescSize, IN ULONG TypeSize, IN ULONG Index, IN ULONG LangID); NTSTATUS HIDT_GetDescriptorInterface(IN PDEVICE_OBJECT DeviceObject, IN ULONG DescriptorType, IN OUT PVOID *Descriptor, IN OUT ULONG *DescSize, IN ULONG TypeSize, IN ULONG Index, IN ULONG LangID); NTSTATUS HIDT_SetIdle(IN PDEVICE_OBJECT DeviceObject); NTSTATUS HIDT_SelectConfiguration(IN PDEVICE_OBJECT DeviceObject); NTSTATUS HIDT_ParseHidInterface(IN PDEVICE_EXTENSION DeviceExtension, IN ULONG InterfaceLength); NTSTATUS HIDT_GetDeviceDescriptor(IN PDEVICE_OBJECT, IN PDEVICE_EXTENSION); NTSTATUS HIDT_GetConfigDescriptor(IN PDEVICE_OBJECT DeviceObject, OUT PULONG ConfigurationDescLength); NTSTATUS HIDT_GetHidInfo(IN PDEVICE_OBJECT DeviceObject, IN ULONG DescriptorLength); NTSTATUS DumpConfigDescriptor(IN ULONG DescriptorLength); VOID HIDT_DecrementPendingRequestCount(IN PDEVICE_EXTENSION DeviceExtension); NTSTATUS HIDT_IncrementPendingRequestCount(IN PDEVICE_EXTENSION DeviceExtension); NTSTATUS HIDT_ResetWorkItem(IN PVOID Context); NTSTATUS HIDT_EnableParentPort(IN PDEVICE_OBJECT DeviceObject); NTSTATUS HIDT_GetPortStatus(IN PDEVICE_OBJECT DeviceObject, IN PULONG PortStatus); NTSTATUS HIDT_ResetInterruptPipe(IN PDEVICE_OBJECT DeviceObject); NTSTATUS HIDT_SystemControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); NTSTATUS HIDT_GetStringDescriptor(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); NTSTATUS HIDT_GetPhysicalDescriptor(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, BOOLEAN *NeedsCompletion); extern KSPIN_LOCK resetWorkItemsListSpinLock;