--- /dev/null
+#ifndef INTERFACES_HPP
+#define INTERFACES_HPP
+
+//=========================================================================================
+//
+// class IUSBHardwareDevice
+//
+// Description: This class provides access to the usb hardware controller
+//
+
+#define DEFINE_ABSTRACT_USBEHCIHARDWARE() \
+ STDMETHOD_(VOID, SetAsyncListRegister)( THIS_ \
+ IN ULONG PhysicalAddress) PURE; \
+ \
+ STDMETHOD_(VOID, SetPeriodicListRegister)( THIS_ \
+ IN ULONG PhysicalAddress) PURE; \
+ \
+ STDMETHOD_(struct _QUEUE_HEAD *, GetAsyncListQueueHead)( THIS) PURE; \
+ \
+ STDMETHOD_(ULONG, GetPeriodicListRegister)( THIS) PURE; \
+ \
+ STDMETHOD_(VOID, SetCommandRegister)( THIS_ \
+ IN struct _EHCI_USBCMD_CONTENT *UsbCmd) PURE; \
+ \
+ STDMETHOD_(VOID, GetCommandRegister)( THIS_ \
+ OUT struct _EHCI_USBCMD_CONTENT *UsbCmd) PURE;
+
+#define IMP_IUSBEHCIHARDWARE \
+ STDMETHODIMP_(VOID) SetAsyncListRegister( \
+ IN ULONG PhysicalAddress); \
+ \
+ STDMETHODIMP_(VOID) SetPeriodicListRegister( \
+ IN ULONG PhysicalAddress); \
+ \
+ STDMETHODIMP_(struct _QUEUE_HEAD *) GetAsyncListQueueHead(); \
+ \
+ STDMETHODIMP_(ULONG) GetPeriodicListRegister(); \
+ \
+ STDMETHODIMP_(VOID) SetCommandRegister( \
+ IN struct _EHCI_USBCMD_CONTENT *UsbCmd); \
+ STDMETHODIMP_(VOID) GetCommandRegister( \
+ OUT struct _EHCI_USBCMD_CONTENT *UsbCmd);
+
+DECLARE_INTERFACE_(IEHCIHardwareDevice, IUSBHardwareDevice)
+{
+ DEFINE_ABSTRACT_UNKNOWN()
+ DEFINE_ABSTRACT_USBHARDWAREDEVICE()
+ DEFINE_ABSTRACT_USBEHCIHARDWARE()
+};
+
+typedef IEHCIHardwareDevice *PEHCIHARDWAREDEVICE;
+
+//=========================================================================================
+//
+// 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 _QUEUE_HEAD;
+struct _USB_ENDPOINT;
+
+#define DEFINE_ABSTRACT_USBEHCIREQUEST() \
+ STDMETHOD_(VOID, CompletionCallback)( THIS_ \
+ IN NTSTATUS NtStatusCode, \
+ IN ULONG UrbStatusCode, \
+ IN struct _QUEUE_HEAD *QueueHead) PURE; \
+ \
+ STDMETHOD_(NTSTATUS, GetQueueHead)( THIS_ \
+ IN struct _QUEUE_HEAD ** OutHead) PURE; \
+ \
+ STDMETHOD_(BOOLEAN, ShouldReleaseRequestAfterCompletion)( THIS) PURE; \
+ \
+ \
+ STDMETHOD_(VOID, FreeQueueHead)( THIS_ \
+ IN struct _QUEUE_HEAD * QueueHead) PURE; \
+ \
+ STDMETHOD_(BOOLEAN, IsQueueHeadComplete)( THIS_ \
+ IN struct _QUEUE_HEAD * QueueHead) PURE; \
+ \
+ STDMETHOD_(USB_DEVICE_SPEED, GetSpeed)( THIS) PURE; \
+ \
+ STDMETHOD_(UCHAR, GetInterval)( THIS) PURE;
+
+#define IMP_IEHCIREQUEST \
+ STDMETHODIMP_(VOID) CompletionCallback( \
+ IN NTSTATUS NtStatusCode, \
+ IN ULONG UrbStatusCode, \
+ IN struct _QUEUE_HEAD *QueueHead); \
+ \
+ STDMETHODIMP_(NTSTATUS) GetQueueHead( \
+ IN struct _QUEUE_HEAD ** OutHead); \
+ \
+ STDMETHODIMP_(BOOLEAN) ShouldReleaseRequestAfterCompletion(); \
+ \
+ STDMETHODIMP_(VOID) FreeQueueHead(struct _QUEUE_HEAD * QueueHead); \
+ \
+ STDMETHODIMP_(BOOLEAN) IsQueueHeadComplete( \
+ IN struct _QUEUE_HEAD * QueueHead); \
+ \
+ STDMETHODIMP_(USB_DEVICE_SPEED) GetSpeed( THIS); \
+ \
+ STDMETHODIMP_(UCHAR) GetInterval( THIS);
+
+DECLARE_INTERFACE_(IEHCIRequest, IUSBRequest)
+{
+ DEFINE_ABSTRACT_UNKNOWN()
+ DEFINE_ABSTRACT_USBREQUEST()
+ DEFINE_ABSTRACT_USBEHCIREQUEST()
+};
+
+
+typedef IEHCIRequest *PEHCIREQUEST;
+
+//=========================================================================================
+//
+// class IUSBQueue
+//
+// Description: This class manages pending requests
+//
+
+#define DEFINE_ABSTRACT_USBEHCIQUEUE() \
+ STDMETHOD_(VOID, InterruptCallback)( THIS_ \
+ IN NTSTATUS Status, \
+ OUT PULONG ShouldRingDoorBell) PURE; \
+ \
+ STDMETHOD_(VOID, CompleteAsyncRequests)( THIS) PURE;
+
+#define IMP_IEHCIQUEUE \
+ STDMETHODIMP_(VOID) InterruptCallback( \
+ IN NTSTATUS Status, \
+ OUT PULONG ShouldRingDoorBell); \
+ \
+ STDMETHODIMP_(VOID) CompleteAsyncRequests();
+
+DECLARE_INTERFACE_(IEHCIQueue, IUSBQueue)
+{
+ DEFINE_ABSTRACT_UNKNOWN()
+ DEFINE_ABSTRACT_USBQUEUE()
+ DEFINE_ABSTRACT_USBEHCIQUEUE()
+};
+
+typedef IEHCIQueue *PEHCIQUEUE;
+
+#endif /* INTERFACES_HPP */