+++ /dev/null
-
-#ifndef COMMON_INTERFACES_HPP
-#define COMMON_INTERFACES_HPP
-
-typedef struct _USB_ENDPOINT
-{
- USB_ENDPOINT_DESCRIPTOR EndPointDescriptor;
- UCHAR HubAddress;
- UCHAR HubPort;
- UCHAR DataToggle;
-} USB_ENDPOINT, *PUSB_ENDPOINT;
-
-typedef struct _USB_INTERFACE
-{
- LIST_ENTRY ListEntry;
- PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
- USB_ENDPOINT EndPoints[1];
-} USB_INTERFACE, *PUSB_INTERFACE;
-
-typedef struct
-{
- PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor;
- LIST_ENTRY InterfaceList;
-}USB_CONFIGURATION, *PUSB_CONFIGURATION;
-
-//---------------------------------------------------------------------------
-//
-// Object Hierarchy
-// --------------------------------------------------------------------
-// | IRootHCDController |
-// | IHCDController Intel USB Universal Host Controller - 3A37 |
-// | IHCDController - Intel USB Universal HostController - 3A38 |
-// | IHCDController - Intel USB Universal HostController - 3A38 |
-// |------------------------------------------------------------------|
-//
-//
-// IHCDController Intel USB Universal Host Controller - 3A37
-// IHubController
-// IUSBHardwareDevice
-// IDMAMemoryManager
-// IUSBQueue <- interacts with -> IUSBRequest
-//
-//
-// Each IHCDController creates an IUSBHardwareDevice class upon initialization. The
-// IUSBHardwardeDevice class is used to abstract usb controller specifics. The IHubController
-// manages all attached devices and handles hub control ioctl requests.
-//
-// Each IUSBHardwareDevice has one IDMAMemoryManager and one IUSBQueue. The IDMAMemoryManager
-// is used to handle dma memory allocations. The IUSBQueue manages requests which are send to the
-// usb hardware. See IUSBRequest class for details.
-//
-
-
-//=========================================================================================
-//
-// class IRootHCDController
-//
-// Description: This class serves as the root host controller. The host controller mantains
-// a list of registered controllers and provides support functions for the host controllers
-
-struct IHCDController;
-
-DECLARE_INTERFACE_(IRootHCDController, IUnknown)
-{
- DEFINE_ABSTRACT_UNKNOWN()
-
-//-----------------------------------------------------------------------------------------
-//
-// Initialize
-//
-// Description: This function initializes the root host controller. It allocates the resources
-// required to manage the registered controllers
-
- virtual NTSTATUS Initialize() = 0;
-
-//-----------------------------------------------------------------------------------------
-//
-// RegisterHCD
-//
-// Description: this function registers a host controller with the root host controller
-
- virtual NTSTATUS RegisterHCD(struct IHCDController * Controller) = 0;
-
-//-----------------------------------------------------------------------------------------
-//
-// UnregisterHCD
-//
-// Description: this function unregistes a host controller
-
- virtual NTSTATUS UnregisterHCD(struct IHCDController * Controller) = 0;
-
-//-----------------------------------------------------------------------------------------
-//
-// GetControllerCount
-//
-// Description: returns the number of host controllers registered
-
- virtual ULONG GetControllerCount() = 0;
-
-};
-
-typedef IRootHCDController *PROOTHDCCONTROLLER;
-
-//=========================================================================================
-//
-// class IHCDController
-//
-// Description: This class is used to manage a single USB host controller
-//
-
-DECLARE_INTERFACE_(IHCDController, IUnknown)
-{
- DEFINE_ABSTRACT_UNKNOWN()
-
-//-----------------------------------------------------------------------------------------
-//
-// Initialize
-//
-// Description: This function initializes the IHCDController implementation.
-// It creates an IUSBHardwareDevice object and initializes it. It also registeres itself with
-// the IRootHCDController
-//
- virtual NTSTATUS Initialize(IN PROOTHDCCONTROLLER RootHCDController,
- IN PDRIVER_OBJECT DriverObject,
- IN PDEVICE_OBJECT PhysicalDeviceObject) = 0;
-
-};
-
-typedef IHCDController *PHCDCONTROLLER;
-
-
-//=========================================================================================
-//
-// class IUSBHardwareDevice
-//
-// Description: This class provides access to the usb hardware controller
-//
-
-struct IDMAMemoryManager;
-struct IUSBQueue;
-
-#define DEFINE_ABSTRACT_USBHARDWAREDEVICE() \
- STDMETHOD_(NTSTATUS, Initialize)( THIS_ \
- IN PDRIVER_OBJECT DriverObject, \
- IN PDEVICE_OBJECT FunctionalDeviceObject, \
- IN PDEVICE_OBJECT PhysicalDeviceObject, \
- IN PDEVICE_OBJECT LowerDeviceObject) PURE; \
- \
- STDMETHOD_(NTSTATUS, PnpStart)( THIS_ \
- IN PCM_RESOURCE_LIST RawResources, \
- IN PCM_RESOURCE_LIST TranslatedResources) PURE; \
- \
- STDMETHOD_(NTSTATUS, PnpStop)( THIS) PURE; \
- \
- STDMETHOD_(NTSTATUS, GetDeviceDetails)( THIS_ \
- OUT OPTIONAL PUSHORT VendorId, \
- OUT OPTIONAL PUSHORT DeviceId, \
- OUT OPTIONAL PULONG NumberOfPorts, \
- OUT OPTIONAL PULONG Speed) PURE; \
- \
- STDMETHOD_(NTSTATUS, GetUSBQueue)( THIS_ \
- OUT struct IUSBQueue **OutUsbQueue) PURE; \
- \
- STDMETHOD_(NTSTATUS, GetDMA)( THIS_ \
- OUT struct IDMAMemoryManager **OutDMA) PURE; \
- \
- STDMETHOD_(NTSTATUS, ResetPort)( THIS_ \
- IN ULONG PortNumber) PURE; \
- \
- STDMETHOD_(NTSTATUS, GetPortStatus)( THIS_ \
- IN ULONG PortId, \
- OUT USHORT *PortStatus, \
- OUT USHORT *PortChange) PURE; \
- \
- STDMETHOD_(NTSTATUS, ClearPortStatus)( THIS_ \
- IN ULONG PortId, \
- IN ULONG Status) PURE; \
- \
- STDMETHOD_(NTSTATUS, SetPortFeature)( THIS_ \
- IN ULONG PortId, \
- IN ULONG Feature) PURE; \
- \
- STDMETHOD_(VOID, SetStatusChangeEndpointCallBack)( THIS_ \
- IN PVOID CallBack, \
- IN PVOID Context) PURE; \
- \
- STDMETHOD_(LPCSTR, GetUSBType)(THIS) PURE;
-
-
-#define IMP_IUSBHARDWAREDEVICE \
- STDMETHODIMP_(NTSTATUS) Initialize( \
- IN PDRIVER_OBJECT DriverObject, \
- IN PDEVICE_OBJECT FunctionalDeviceObject, \
- IN PDEVICE_OBJECT PhysicalDeviceObject, \
- IN PDEVICE_OBJECT LowerDeviceObject); \
- \
- STDMETHODIMP_(NTSTATUS) PnpStart( \
- IN PCM_RESOURCE_LIST RawResources, \
- IN PCM_RESOURCE_LIST TranslatedResources); \
- \
- STDMETHODIMP_(NTSTATUS) PnpStop(VOID); \
- \
- STDMETHODIMP_(NTSTATUS) GetDeviceDetails( \
- OUT OPTIONAL PUSHORT VendorId, \
- OUT OPTIONAL PUSHORT DeviceId, \
- OUT OPTIONAL PULONG NumberOfPorts, \
- OUT OPTIONAL PULONG Speed); \
- \
- STDMETHODIMP_(NTSTATUS) GetUSBQueue( \
- OUT struct IUSBQueue **OutUsbQueue); \
- \
- STDMETHODIMP_(NTSTATUS) GetDMA( \
- OUT struct IDMAMemoryManager **OutDMA); \
- \
- STDMETHODIMP_(NTSTATUS) ResetPort( \
- IN ULONG PortNumber); \
- \
- STDMETHODIMP_(NTSTATUS) GetPortStatus( \
- IN ULONG PortId, \
- OUT USHORT *PortStatus, \
- OUT USHORT *PortChange); \
- \
- STDMETHODIMP_(NTSTATUS) ClearPortStatus( \
- IN ULONG PortId, \
- IN ULONG Status); \
- \
- STDMETHODIMP_(NTSTATUS) SetPortFeature( \
- IN ULONG PortId, \
- IN ULONG Feature); \
- \
- STDMETHODIMP_(VOID) SetStatusChangeEndpointCallBack( \
- IN PVOID CallBack, \
- IN PVOID Context); \
- \
- STDMETHODIMP_(LPCSTR) GetUSBType();
-
-DECLARE_INTERFACE_(IUSBHardwareDevice, IUnknown)
-{
- DEFINE_ABSTRACT_UNKNOWN()
- DEFINE_ABSTRACT_USBHARDWAREDEVICE()
-};
-
-typedef IUSBHardwareDevice *PUSBHARDWAREDEVICE;
-
-
-//=========================================================================================
-//
-// class IDMAMemoryManager
-//
-// Description: This class provides access to the dma buffer. It provides methods to
-// allocate and free from the dma buffer
-//
-
-DECLARE_INTERFACE_(IDMAMemoryManager, IUnknown)
-{
- DEFINE_ABSTRACT_UNKNOWN()
-
-//-----------------------------------------------------------------------------------------
-//
-// Initialize
-//
-// Description: initializes the memory manager
-
- virtual NTSTATUS Initialize(IN PUSBHARDWAREDEVICE Device,
- IN PKSPIN_LOCK Lock,
- IN ULONG DmaBufferSize,
- IN PVOID VirtualBase,
- IN PHYSICAL_ADDRESS PhysicalAddress,
- IN ULONG DefaultBlockSize) = 0;
-
-//-----------------------------------------------------------------------------------------
-//
-// Allocate
-//
-// Description: allocates block of memory from allocator
-
- virtual NTSTATUS Allocate(IN ULONG Size,
- OUT PVOID *OutVirtualBase,
- OUT PPHYSICAL_ADDRESS OutPhysicalAddress) = 0;
-
-
-//-----------------------------------------------------------------------------------------
-//
-// Free
-//
-// Description: releases memory block
-
- virtual NTSTATUS Release(IN PVOID VirtualBase,
- IN ULONG Size) = 0;
-
-};
-
-typedef IDMAMemoryManager *PDMAMEMORYMANAGER;
-
-
-//=========================================================================================
-//
-// class IUSBRequest
-//
-// Description: This class is used to issue request to usb controller. The class is
-// initialized using InitializeXXX methods. You also need to call SetEndpoint to define the endpoint
-// In addition you can call SetCompletionDetails if you need to wait for the end of
-// the request or want to complete an irp. You call AddUSBRequest to add the request to the queue.
-// Once the request is completed the CompletionCallback is invoked. The CompletionCallback
-// will take care of any completion details which have been set. If the request is cancelled, the
-// CancelCallback routine is invoked.
-//
-
-struct IUSBDevice;
-
-#define DEFINE_ABSTRACT_USBREQUEST() \
- STDMETHOD_(NTSTATUS, InitializeWithSetupPacket)( THIS_ \
- IN PDMAMEMORYMANAGER DmaManager, \
- IN PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket, \
- IN struct IUSBDevice *Device, \
- IN OPTIONAL struct _USB_ENDPOINT *EndpointDescriptor, \
- IN OUT ULONG TransferBufferLength, \
- IN OUT PMDL TransferBuffer) PURE; \
- \
- STDMETHOD_(NTSTATUS, InitializeWithIrp)( THIS_ \
- IN PDMAMEMORYMANAGER DmaManager, \
- IN struct IUSBDevice *Device, \
- IN OUT PIRP Irp) PURE; \
- \
- STDMETHOD_(BOOLEAN, IsRequestComplete)( THIS) PURE; \
- \
- STDMETHOD_(ULONG, GetTransferType)( THIS) PURE; \
- \
- STDMETHOD_(VOID, GetResultStatus)( THIS_ \
- OUT OPTIONAL NTSTATUS * NtStatusCode, \
- OUT OPTIONAL PULONG UrbStatusCode) PURE;
-
-#define IMP_IUSBREQUEST \
- STDMETHODIMP_(NTSTATUS) InitializeWithSetupPacket( \
- IN PDMAMEMORYMANAGER DmaManager, \
- IN PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket, \
- IN struct IUSBDevice *Device, \
- IN OPTIONAL struct _USB_ENDPOINT *EndpointDescriptor, \
- IN OUT ULONG TransferBufferLength, \
- IN OUT PMDL TransferBuffer); \
- \
- STDMETHODIMP_(NTSTATUS) InitializeWithIrp( \
- IN PDMAMEMORYMANAGER DmaManager, \
- IN struct IUSBDevice *Device, \
- IN OUT PIRP Irp); \
- \
- STDMETHODIMP_(BOOLEAN) IsRequestComplete(VOID); \
- \
- STDMETHODIMP_(ULONG) GetTransferType(VOID); \
- \
- STDMETHODIMP_(VOID) GetResultStatus( \
- OUT OPTIONAL NTSTATUS * NtStatusCode, \
- OUT OPTIONAL PULONG UrbStatusCode);
-
-DECLARE_INTERFACE_(IUSBRequest, IUnknown)
-{
- DEFINE_ABSTRACT_UNKNOWN()
- DEFINE_ABSTRACT_USBREQUEST()
-};
-
-
-typedef IUSBRequest *PUSBREQUEST;
-
-//=========================================================================================
-//
-// class IUSBQueue
-//
-// Description: This class manages pending requests
-//
-
-#define DEFINE_ABSTRACT_USBQUEUE() \
- STDMETHOD_(NTSTATUS, Initialize)( THIS_ \
- IN PUSBHARDWAREDEVICE Hardware, \
- IN PDMA_ADAPTER AdapterObject, \
- IN PDMAMEMORYMANAGER MemManager, \
- IN OPTIONAL PKSPIN_LOCK Lock) PURE; \
- \
- STDMETHOD_(NTSTATUS, AddUSBRequest)( THIS_ \
- IN IUSBRequest * Request) PURE; \
- \
- STDMETHOD_(NTSTATUS, CreateUSBRequest)( THIS_ \
- IN IUSBRequest **OutRequest) PURE; \
- \
- STDMETHOD_(NTSTATUS, AbortDevicePipe)( THIS_ \
- IN UCHAR DeviceAddress, \
- IN PUSB_ENDPOINT_DESCRIPTOR EndpointDescriptor) PURE;
-
-#define IMP_IUSBQUEUE \
- STDMETHODIMP_(NTSTATUS) Initialize( \
- IN PUSBHARDWAREDEVICE Hardware, \
- IN PDMA_ADAPTER AdapterObject, \
- IN PDMAMEMORYMANAGER MemManager, \
- IN OPTIONAL PKSPIN_LOCK Lock); \
- \
- STDMETHODIMP_(NTSTATUS) AddUSBRequest( \
- IN IUSBRequest * Request); \
- \
- STDMETHODIMP_(NTSTATUS) CreateUSBRequest( \
- OUT IUSBRequest **OutRequest); \
- \
- STDMETHODIMP_(NTSTATUS) AbortDevicePipe( \
- IN UCHAR DeviceAddress, \
- IN PUSB_ENDPOINT_DESCRIPTOR EndpointDescriptor);
-
-DECLARE_INTERFACE_(IUSBQueue, IUnknown)
-{
- DEFINE_ABSTRACT_UNKNOWN()
- DEFINE_ABSTRACT_USBQUEUE()
-};
-
-typedef IUSBQueue *PUSBQUEUE;
-
-//=========================================================================================
-//
-// class IHubController
-//
-// Description: This class implements a hub controller
-//
-
-DECLARE_INTERFACE_(IHubController, IUnknown)
-{
- DEFINE_ABSTRACT_UNKNOWN()
-
-//----------------------------------------------------------------------------------------
-//
-// Initialize
-//
-// Description: Initializes the hub controller
-
- virtual NTSTATUS Initialize(IN PDRIVER_OBJECT DriverObject,
- IN PHCDCONTROLLER Controller,
- IN PUSBHARDWAREDEVICE Device,
- IN BOOLEAN IsRootHubDevice,
- IN ULONG DeviceAddress) = 0;
-
-//----------------------------------------------------------------------------------------
-//
-// GetHubControllerDeviceObject
-//
-// Description: Returns the hub controller device object
-
- virtual NTSTATUS GetHubControllerDeviceObject(PDEVICE_OBJECT * HubDeviceObject) = 0;
-
-//----------------------------------------------------------------------------------------
-//
-// GetHubControllerSymbolicLink
-//
-// Description: Returns the symbolic link of the root hub
-
- virtual NTSTATUS GetHubControllerSymbolicLink(ULONG BufferLength, PVOID Buffer, PULONG RequiredLength) = 0;
-
-
-};
-
-typedef IHubController *PHUBCONTROLLER;
-
-//=========================================================================================
-//
-// class IDispatchIrp
-//
-// Description: This class is used to handle irp dispatch requests
-//
-
-DECLARE_INTERFACE_(IDispatchIrp, IUnknown)
-{
- DEFINE_ABSTRACT_UNKNOWN()
-
-//-----------------------------------------------------------------------------------------
-//
-// HandlePnp
-//
-// Description: This function handles all pnp requests
-
- virtual NTSTATUS HandlePnp(IN PDEVICE_OBJECT DeviceObject,
- IN OUT PIRP Irp) = 0;
-
-//-----------------------------------------------------------------------------------------
-//
-// HandlePower
-//
-// Description: This function handles all power pnp requests
-//
- virtual NTSTATUS HandlePower(IN PDEVICE_OBJECT DeviceObject,
- IN OUT PIRP Irp) = 0;
-
-//-----------------------------------------------------------------------------------------
-//
-// HandleDeviceControl
-//
-// Description: handles device io control requests
-
- virtual NTSTATUS HandleDeviceControl(IN PDEVICE_OBJECT DeviceObject,
- IN OUT PIRP Irp) = 0;
-
-//-----------------------------------------------------------------------------------------
-//
-// HandleSystemControl
-//
-// Description: handles WMI system control requests
-
- virtual NTSTATUS HandleSystemControl(IN PDEVICE_OBJECT DeviceObject,
- IN OUT PIRP Irp) = 0;
-};
-
-typedef IDispatchIrp *PDISPATCHIRP;
-
-//=========================================================================================
-//
-// class IUSBDevice
-//
-// Description: This class is used to abstract details of a usb device
-//
-
-DECLARE_INTERFACE_(IUSBDevice, IUnknown)
-{
- DEFINE_ABSTRACT_UNKNOWN()
-
-//----------------------------------------------------------------------------------------
-//
-// Initialize
-//
-// Description: Initializes the usb device
-
- virtual NTSTATUS Initialize(IN PHUBCONTROLLER HubController,
- IN PUSBHARDWAREDEVICE Device,
- IN PVOID Parent,
- IN ULONG Port,
- IN ULONG PortStatus) = 0;
-
-//-----------------------------------------------------------------------------------------
-//
-// IsHub
-//
-// Description: returns true when device is a hub
-
- virtual BOOLEAN IsHub() = 0;
-
-//-----------------------------------------------------------------------------------------
-//
-// GetParent
-//
-// Description: gets the parent device of the this device
-
- virtual NTSTATUS GetParent(PVOID * Parent) = 0;
-
-//-----------------------------------------------------------------------------------------
-//
-// GetDeviceAddress
-//
-// Description: gets the device address of the this device
-
- virtual UCHAR GetDeviceAddress() = 0;
-
-
-//-----------------------------------------------------------------------------------------
-//
-// GetPort
-//
-// Description: gets the port to which this device is connected
-
- virtual ULONG GetPort() = 0;
-
-//-----------------------------------------------------------------------------------------
-//
-// GetSpeed
-//
-// Description: gets the speed of the device
-
- virtual USB_DEVICE_SPEED GetSpeed() = 0;
-
-//-----------------------------------------------------------------------------------------
-//
-// GetType
-//
-// Description: gets the type of the device, either 1.1 or 2.0 device
-
- virtual USB_DEVICE_TYPE GetType() = 0;
-
-//-----------------------------------------------------------------------------------------
-//
-// GetState
-//
-// Description: gets the device state
-
- virtual ULONG GetState() = 0;
-
-//-----------------------------------------------------------------------------------------
-//
-// SetDeviceHandleData
-//
-// Description: sets device handle data
-
- virtual void SetDeviceHandleData(PVOID Data) = 0;
-
-//-----------------------------------------------------------------------------------------
-//
-// SetDeviceAddress
-//
-// Description: sets device handle data
-
- virtual NTSTATUS SetDeviceAddress(UCHAR DeviceAddress) = 0;
-
-//-----------------------------------------------------------------------------------------
-//
-// GetDeviceDescriptor
-//
-// Description: sets device handle data
-
- virtual void GetDeviceDescriptor(PUSB_DEVICE_DESCRIPTOR DeviceDescriptor) = 0;
-
-//-----------------------------------------------------------------------------------------
-//
-// GetConfigurationValue
-//
-// Description: gets current selected configuration index
-
- virtual UCHAR GetConfigurationValue() = 0;
-
-//-----------------------------------------------------------------------------------------
-//
-// SubmitIrp
-//
-// Description: submits an irp containing an urb
-
- virtual NTSTATUS SubmitIrp(PIRP Irp) = 0;
-
-//-----------------------------------------------------------------------------------------
-//
-// GetConfigurationDescriptors
-//
-// Description: returns one or more configuration descriptors
-
- virtual VOID GetConfigurationDescriptors(IN PUSB_CONFIGURATION_DESCRIPTOR ConfigDescriptorBuffer,
- IN ULONG BufferLength,
- OUT PULONG OutBufferLength) = 0;
-
-//-----------------------------------------------------------------------------------------
-//
-// Description: returns length of configuration descriptors
-//
- virtual ULONG GetConfigurationDescriptorsLength() = 0;
-
-//-----------------------------------------------------------------------------------------
-//
-// SubmitSetupPacket
-//
-// Description: submits an setup packet. The usb device will then create an usb request from it and submit it to the queue
-
- virtual NTSTATUS SubmitSetupPacket(IN PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket,
- IN OUT ULONG BufferLength,
- OUT PVOID Buffer) = 0;
-
-//-----------------------------------------------------------------------------------------
-//
-// SelectConfiguration
-//
-// Description: selects a configuration
-
- virtual NTSTATUS SelectConfiguration(IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
- IN PUSBD_INTERFACE_INFORMATION Interface,
- OUT USBD_CONFIGURATION_HANDLE *ConfigurationHandle) = 0;
-
-//-----------------------------------------------------------------------------------------
-//
-// SelectConfiguration
-//
-// Description: selects a interface of an configuration
-
- virtual NTSTATUS SelectInterface(IN USBD_CONFIGURATION_HANDLE ConfigurationHandle,
- IN OUT PUSBD_INTERFACE_INFORMATION Interface) = 0;
-
-//-----------------------------------------------------------------------------------------
-//
-// AbortPipe
-//
-// Description: aborts all pending requests
-
- virtual NTSTATUS AbortPipe(IN PUSB_ENDPOINT_DESCRIPTOR EndpointDescriptor) = 0;
-
-//-----------------------------------------------------------------------------------------
-//
-// GetMaxPacketSize
-//
-// Description: aborts all pending requests
-
- virtual UCHAR GetMaxPacketSize() = 0;
-};
-
-typedef IUSBDevice *PUSBDEVICE;
-
-#endif