2012-02-28 15:01:27 +00:00
|
|
|
|
|
|
|
#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;
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
//
|
2015-04-28 19:22:43 +00:00
|
|
|
// Object Hierarchy
|
2012-02-28 15:01:27 +00:00
|
|
|
// --------------------------------------------------------------------
|
|
|
|
// | 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, \
|
2013-02-02 15:45:02 +00:00
|
|
|
IN PVOID Context) PURE; \
|
|
|
|
\
|
2013-03-31 07:41:31 +00:00
|
|
|
STDMETHOD_(LPCSTR, GetUSBType)(THIS) PURE;
|
2012-02-28 15:01:27 +00:00
|
|
|
|
|
|
|
|
|
|
|
#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, \
|
2013-02-02 15:45:02 +00:00
|
|
|
IN PVOID Context); \
|
|
|
|
\
|
2013-03-31 07:41:31 +00:00
|
|
|
STDMETHODIMP_(LPCSTR) GetUSBType();
|
2012-02-28 15:01:27 +00:00
|
|
|
|
|
|
|
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.
|
|
|
|
//
|
|
|
|
|
2012-02-28 18:54:30 +00:00
|
|
|
struct IUSBDevice;
|
|
|
|
|
2012-02-28 15:01:27 +00:00
|
|
|
#define DEFINE_ABSTRACT_USBREQUEST() \
|
|
|
|
STDMETHOD_(NTSTATUS, InitializeWithSetupPacket)( THIS_ \
|
|
|
|
IN PDMAMEMORYMANAGER DmaManager, \
|
|
|
|
IN PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket, \
|
2012-02-28 18:54:30 +00:00
|
|
|
IN struct IUSBDevice *Device, \
|
2012-02-28 15:01:27 +00:00
|
|
|
IN OPTIONAL struct _USB_ENDPOINT *EndpointDescriptor, \
|
|
|
|
IN OUT ULONG TransferBufferLength, \
|
|
|
|
IN OUT PMDL TransferBuffer) PURE; \
|
|
|
|
\
|
|
|
|
STDMETHOD_(NTSTATUS, InitializeWithIrp)( THIS_ \
|
|
|
|
IN PDMAMEMORYMANAGER DmaManager, \
|
2012-02-28 18:54:30 +00:00
|
|
|
IN struct IUSBDevice *Device, \
|
2012-02-28 15:01:27 +00:00
|
|
|
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, \
|
2012-02-28 18:54:30 +00:00
|
|
|
IN struct IUSBDevice *Device, \
|
2012-02-28 15:01:27 +00:00
|
|
|
IN OPTIONAL struct _USB_ENDPOINT *EndpointDescriptor, \
|
|
|
|
IN OUT ULONG TransferBufferLength, \
|
|
|
|
IN OUT PMDL TransferBuffer); \
|
|
|
|
\
|
|
|
|
STDMETHODIMP_(NTSTATUS) InitializeWithIrp( \
|
|
|
|
IN PDMAMEMORYMANAGER DmaManager, \
|
2012-02-28 18:54:30 +00:00
|
|
|
IN struct IUSBDevice *Device, \
|
2012-02-28 15:01:27 +00:00
|
|
|
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;
|
2014-06-29 12:39:10 +00:00
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// HandleSystemControl
|
|
|
|
//
|
|
|
|
// Description: handles WMI system control requests
|
|
|
|
|
|
|
|
virtual NTSTATUS HandleSystemControl(IN PDEVICE_OBJECT DeviceObject,
|
|
|
|
IN OUT PIRP Irp) = 0;
|
2012-02-28 15:01:27 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
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
|
|
|
|
//
|
2015-04-28 19:22:43 +00:00
|
|
|
// Description: aborts all pending requests
|
2012-02-28 15:01:27 +00:00
|
|
|
|
|
|
|
virtual NTSTATUS AbortPipe(IN PUSB_ENDPOINT_DESCRIPTOR EndpointDescriptor) = 0;
|
|
|
|
|
2012-03-01 15:51:59 +00:00
|
|
|
//-----------------------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// GetMaxPacketSize
|
|
|
|
//
|
2015-04-28 19:22:43 +00:00
|
|
|
// Description: aborts all pending requests
|
2012-03-01 15:51:59 +00:00
|
|
|
|
|
|
|
virtual UCHAR GetMaxPacketSize() = 0;
|
2012-02-28 15:01:27 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
typedef IUSBDevice *PUSBDEVICE;
|
|
|
|
|
|
|
|
#endif
|