mirror of
https://github.com/reactos/reactos.git
synced 2024-08-21 10:53:15 +00:00
[usb/usbehci]
- Define Device and Configuration Descriptors for RootHub20. - Queue all USB_SUBMIT_URBs and create a separate thread to handle them. - For PNP START_DEVICE, Create the internal RootHub usb device and register usb hub device interface. - Fill in direct call interface for USB_BUS_INTERFACE_USBDI_V2 and USB_BUS_INTERFACE_HUB_V5. - Implement Direct Call Interface function GetExtendedHubInformation. - Remove duplicate structures that are already defined in USB Headers. Some reorganization. svn path=/trunk/; revision=45552
This commit is contained in:
parent
909e0c1b43
commit
b028cb1e4e
|
@ -7,15 +7,108 @@
|
||||||
* Michael Martin
|
* Michael Martin
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* INCLUDES *******************************************************************/
|
|
||||||
#define INITGUID
|
#define INITGUID
|
||||||
|
#define NDEBUG
|
||||||
|
|
||||||
#include "usbehci.h"
|
#include "usbehci.h"
|
||||||
#include <wdmguid.h>
|
#include <wdmguid.h>
|
||||||
|
#include "usbiffn.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#define NDEBUG
|
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
|
/* Lifted from Linux with slight changes */
|
||||||
|
const UCHAR ROOTHUB2_DEVICE_DESCRIPTOR [] =
|
||||||
|
{
|
||||||
|
0x12, /* bLength; */
|
||||||
|
USB_DEVICE_DESCRIPTOR_TYPE, /* bDescriptorType; Device */
|
||||||
|
0x00, 0x20, /* bcdUSB; v1.1 */
|
||||||
|
USB_DEVICE_CLASS_HUB, /* bDeviceClass; HUB_CLASSCODE */
|
||||||
|
0x01, /* bDeviceSubClass; */
|
||||||
|
0x00, /* bDeviceProtocol; [ low/full speeds only ] */
|
||||||
|
0x08, /* bMaxPacketSize0; 8 Bytes */
|
||||||
|
/* Fill Vendor and Product in when init root hub */
|
||||||
|
0x00, 0x00, /* idVendor; */
|
||||||
|
0x00, 0x00, /* idProduct; */
|
||||||
|
0x00, 0x00, /* bcdDevice */
|
||||||
|
0x00, /* iManufacturer; */
|
||||||
|
0x00, /* iProduct; */
|
||||||
|
0x00, /* iSerialNumber; */
|
||||||
|
0x01 /* bNumConfigurations; */
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
const UCHAR ROOTHUB2_CONFIGURATION_DESCRIPTOR [] =
|
||||||
|
{
|
||||||
|
/* one configuration */
|
||||||
|
0x09, /* bLength; */
|
||||||
|
0x02, /* bDescriptorType; Configuration */
|
||||||
|
0x19, 0x00, /* wTotalLength; */
|
||||||
|
0x01, /* bNumInterfaces; (1) */
|
||||||
|
0x23, /* bConfigurationValue; */
|
||||||
|
0x00, /* iConfiguration; */
|
||||||
|
0x40, /* bmAttributes;
|
||||||
|
Bit 7: must be set,
|
||||||
|
6: Self-powered,
|
||||||
|
5: Remote wakeup,
|
||||||
|
4..0: reserved */
|
||||||
|
0x00, /* MaxPower; */
|
||||||
|
|
||||||
|
/* one interface */
|
||||||
|
0x09, /* bLength: Interface; */
|
||||||
|
0x04, /* bDescriptorType; Interface */
|
||||||
|
0x00, /* bInterfaceNumber; */
|
||||||
|
0x00, /* bAlternateSetting; */
|
||||||
|
0x01, /* bNumEndpoints; */
|
||||||
|
0x09, /* bInterfaceClass; HUB_CLASSCODE */
|
||||||
|
0x01, /* bInterfaceSubClass; */
|
||||||
|
0x00, /* bInterfaceProtocol: */
|
||||||
|
0x00, /* iInterface; */
|
||||||
|
|
||||||
|
/* one endpoint (status change endpoint) */
|
||||||
|
0x07, /* bLength; */
|
||||||
|
0x05, /* bDescriptorType; Endpoint */
|
||||||
|
0x81, /* bEndpointAddress; IN Endpoint 1 */
|
||||||
|
0x03, /* bmAttributes; Interrupt */
|
||||||
|
0x08, 0x00, /* wMaxPacketSize; 1 + (MAX_ROOT_PORTS / 8) */
|
||||||
|
0xFF /* bInterval; (255ms -- usb 2.0 spec) */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* FIXME: Do something better */
|
||||||
|
VOID NTAPI
|
||||||
|
UrbWorkerThread(PVOID Context)
|
||||||
|
{
|
||||||
|
PPDO_DEVICE_EXTENSION PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)Context;
|
||||||
|
|
||||||
|
while (PdoDeviceExtension->HaltUrbHandling == FALSE)
|
||||||
|
{
|
||||||
|
CompletePendingURBRequest(PdoDeviceExtension);
|
||||||
|
}
|
||||||
|
DPRINT1("Thread terminated\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME: Do something better */
|
||||||
|
PVOID InternalCreateUsbDevice(UCHAR DeviceNumber, ULONG Port, PUSB_DEVICE Parent, BOOLEAN Hub)
|
||||||
|
{
|
||||||
|
PUSB_DEVICE UsbDevicePointer = NULL;
|
||||||
|
UsbDevicePointer = ExAllocatePool(NonPagedPool, sizeof(USB_DEVICE));
|
||||||
|
if (!UsbDevicePointer)
|
||||||
|
{
|
||||||
|
DPRINT1("Out of memory\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((Hub) && (!Parent))
|
||||||
|
{
|
||||||
|
DPRINT1("This is the root hub\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
UsbDevicePointer->Address = DeviceNumber;
|
||||||
|
UsbDevicePointer->Port = Port;
|
||||||
|
UsbDevicePointer->ParentDevice = Parent;
|
||||||
|
|
||||||
|
return UsbDevicePointer;
|
||||||
|
}
|
||||||
|
|
||||||
NTSTATUS NTAPI
|
NTSTATUS NTAPI
|
||||||
PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
||||||
{
|
{
|
||||||
|
@ -24,125 +117,94 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
||||||
PIO_STACK_LOCATION Stack = NULL;
|
PIO_STACK_LOCATION Stack = NULL;
|
||||||
NTSTATUS Status = STATUS_UNSUCCESSFUL;
|
NTSTATUS Status = STATUS_UNSUCCESSFUL;
|
||||||
ULONG_PTR Information = 0;
|
ULONG_PTR Information = 0;
|
||||||
DPRINT("PdoDispatchInternalDeviceControl\n");
|
|
||||||
|
|
||||||
PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) DeviceObject->DeviceExtension;
|
PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) DeviceObject->DeviceExtension;
|
||||||
FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) PdoDeviceExtension->ControllerFdo->DeviceExtension;
|
FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) PdoDeviceExtension->ControllerFdo->DeviceExtension;
|
||||||
|
|
||||||
ASSERT(PdoDeviceExtension->Common.IsFdo == FALSE);
|
ASSERT(PdoDeviceExtension->Common.IsFdo == FALSE);
|
||||||
|
|
||||||
Stack = IoGetCurrentIrpStackLocation(Irp);
|
Stack = IoGetCurrentIrpStackLocation(Irp);
|
||||||
DPRINT("IoControlCode %x\n", Stack->Parameters.DeviceIoControl.IoControlCode);
|
|
||||||
switch(Stack->Parameters.DeviceIoControl.IoControlCode)
|
switch(Stack->Parameters.DeviceIoControl.IoControlCode)
|
||||||
{
|
{
|
||||||
case IOCTL_INTERNAL_USB_SUBMIT_URB:
|
case IOCTL_INTERNAL_USB_SUBMIT_URB:
|
||||||
{
|
{
|
||||||
URB *Urb;
|
URB *Urb;
|
||||||
|
|
||||||
DPRINT1("IOCTL_INTERNAL_USB_SUBMIT_URB\n");
|
|
||||||
DPRINT("Stack->Parameters.DeviceIoControl.InputBufferLength %d\n",
|
|
||||||
Stack->Parameters.DeviceIoControl.InputBufferLength);
|
|
||||||
DPRINT("Stack->Parameters.Others.Argument1 %x\n", Stack->Parameters.Others.Argument1);
|
|
||||||
|
|
||||||
Urb = (PURB) Stack->Parameters.Others.Argument1;
|
Urb = (PURB) Stack->Parameters.Others.Argument1;
|
||||||
DPRINT("Header Size %d\n", Urb->UrbHeader.Length);
|
DPRINT("Header Length %d\n", Urb->UrbHeader.Length);
|
||||||
DPRINT("Header Type %d\n", Urb->UrbHeader.Function);
|
DPRINT("Header Function %d\n", Urb->UrbHeader.Function);
|
||||||
DPRINT("Index %x\n", Urb->UrbControlDescriptorRequest.Index);
|
|
||||||
|
|
||||||
/* Check the type */
|
/* Queue all request for now, kernel thread will complete them */
|
||||||
switch(Urb->UrbHeader.Function)
|
QueueURBRequest(PdoDeviceExtension, Irp);
|
||||||
{
|
Information = 0;
|
||||||
case URB_FUNCTION_SELECT_CONFIGURATION:
|
IoMarkIrpPending(Irp);
|
||||||
{
|
Status = STATUS_PENDING;
|
||||||
DPRINT1("URB_FUNCTION_SELECT_CONFIGURATION\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:
|
|
||||||
{
|
|
||||||
URB *Urb;
|
|
||||||
DPRINT1("URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE\n");
|
|
||||||
Urb = (PURB) Stack->Parameters.Others.Argument1;
|
|
||||||
Urb->UrbHeader.Status = 0;
|
|
||||||
|
|
||||||
DPRINT1("Irp->CancelRoutine %x\n",Irp->CancelRoutine);
|
|
||||||
QueueRequest(FdoDeviceExtension, Irp);
|
|
||||||
|
|
||||||
Information = 0;
|
|
||||||
|
|
||||||
IoMarkIrpPending(Irp);
|
|
||||||
Status = STATUS_PENDING;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* FIXME: Handle all other Functions */
|
|
||||||
default:
|
|
||||||
DPRINT1("Not handled yet!\n");
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IOCTL_INTERNAL_USB_CYCLE_PORT:
|
case IOCTL_INTERNAL_USB_CYCLE_PORT:
|
||||||
{
|
{
|
||||||
DPRINT("IOCTL_INTERNAL_USB_CYCLE_PORT\n");
|
DPRINT1("IOCTL_INTERNAL_USB_CYCLE_PORT\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IOCTL_INTERNAL_USB_ENABLE_PORT:
|
case IOCTL_INTERNAL_USB_ENABLE_PORT:
|
||||||
{
|
{
|
||||||
DPRINT("IOCTL_INTERNAL_USB_ENABLE_PORT\n");
|
DPRINT1("IOCTL_INTERNAL_USB_ENABLE_PORT\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IOCTL_INTERNAL_USB_GET_BUS_INFO:
|
case IOCTL_INTERNAL_USB_GET_BUS_INFO:
|
||||||
{
|
{
|
||||||
DPRINT("IOCTL_INTERNAL_USB_GET_BUS_INFO\n");
|
DPRINT1("IOCTL_INTERNAL_USB_GET_BUS_INFO\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IOCTL_INTERNAL_USB_GET_BUSGUID_INFO:
|
case IOCTL_INTERNAL_USB_GET_BUSGUID_INFO:
|
||||||
{
|
{
|
||||||
DPRINT("IOCTL_INTERNAL_USB_GET_BUSGUID_INFO\n");
|
DPRINT1("IOCTL_INTERNAL_USB_GET_BUSGUID_INFO\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME:
|
case IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME:
|
||||||
{
|
{
|
||||||
DPRINT("IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME\n");
|
DPRINT1("IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE:
|
case IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE:
|
||||||
{
|
{
|
||||||
DPRINT("IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE\n");
|
DPRINT1("IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IOCTL_INTERNAL_USB_GET_HUB_COUNT:
|
case IOCTL_INTERNAL_USB_GET_HUB_COUNT:
|
||||||
{
|
{
|
||||||
DPRINT("IOCTL_INTERNAL_USB_GET_HUB_COUNT\n");
|
DPRINT1("IOCTL_INTERNAL_USB_GET_HUB_COUNT\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IOCTL_INTERNAL_USB_GET_HUB_NAME:
|
case IOCTL_INTERNAL_USB_GET_HUB_NAME:
|
||||||
{
|
{
|
||||||
DPRINT("IOCTL_INTERNAL_USB_GET_HUB_NAME\n");
|
DPRINT1("IOCTL_INTERNAL_USB_GET_HUB_NAME\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO:
|
case IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO:
|
||||||
{
|
{
|
||||||
DPRINT("IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO\n");
|
DPRINT1("IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IOCTL_INTERNAL_USB_GET_PORT_STATUS:
|
case IOCTL_INTERNAL_USB_GET_PORT_STATUS:
|
||||||
{
|
{
|
||||||
DPRINT("IOCTL_INTERNAL_USB_GET_PORT_STATUS\n");
|
DPRINT1("IOCTL_INTERNAL_USB_GET_PORT_STATUS\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IOCTL_INTERNAL_USB_RESET_PORT:
|
case IOCTL_INTERNAL_USB_RESET_PORT:
|
||||||
{
|
{
|
||||||
DPRINT("IOCTL_INTERNAL_USB_RESET_PORT\n");
|
DPRINT1("IOCTL_INTERNAL_USB_RESET_PORT\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO:
|
case IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO:
|
||||||
{
|
{
|
||||||
DPRINT("IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO\n");
|
DPRINT1("IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO\n");
|
||||||
/* This is document as Argument1 = PDO and Argument2 = FDO.
|
|
||||||
Its actually reversed, the FDO goes in Argument1 and PDO goes in Argument2 */
|
|
||||||
if (Stack->Parameters.Others.Argument1)
|
if (Stack->Parameters.Others.Argument1)
|
||||||
Stack->Parameters.Others.Argument1 = FdoDeviceExtension->DeviceObject;
|
*(PVOID *)Stack->Parameters.Others.Argument1 = FdoDeviceExtension->Pdo;
|
||||||
if (Stack->Parameters.Others.Argument2)
|
if (Stack->Parameters.Others.Argument2)
|
||||||
Stack->Parameters.Others.Argument2 = FdoDeviceExtension->Pdo;
|
*(PVOID *)Stack->Parameters.Others.Argument2 = IoGetAttachedDevice(FdoDeviceExtension->DeviceObject);
|
||||||
|
|
||||||
Irp->IoStatus.Information = 0;
|
Irp->IoStatus.Information = 0;
|
||||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
|
@ -151,7 +213,7 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
||||||
}
|
}
|
||||||
case IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION:
|
case IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION:
|
||||||
{
|
{
|
||||||
DPRINT("IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION\n");
|
DPRINT1("IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@ -162,6 +224,7 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
||||||
}
|
}
|
||||||
|
|
||||||
Irp->IoStatus.Information = Information;
|
Irp->IoStatus.Information = Information;
|
||||||
|
|
||||||
if (Status != STATUS_PENDING)
|
if (Status != STATUS_PENDING)
|
||||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
|
|
||||||
|
@ -171,8 +234,6 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
PdoQueryId(PDEVICE_OBJECT DeviceObject, PIRP Irp, ULONG_PTR* Information)
|
PdoQueryId(PDEVICE_OBJECT DeviceObject, PIRP Irp, ULONG_PTR* Information)
|
||||||
{
|
{
|
||||||
PPDO_DEVICE_EXTENSION PdoDeviceExtension;
|
|
||||||
PFDO_DEVICE_EXTENSION FdoDeviceExtension;
|
|
||||||
WCHAR Buffer[256];
|
WCHAR Buffer[256];
|
||||||
ULONG Index = 0;
|
ULONG Index = 0;
|
||||||
ULONG IdType;
|
ULONG IdType;
|
||||||
|
@ -181,25 +242,18 @@ PdoQueryId(PDEVICE_OBJECT DeviceObject, PIRP Irp, ULONG_PTR* Information)
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
IdType = IoGetCurrentIrpStackLocation(Irp)->Parameters.QueryId.IdType;
|
IdType = IoGetCurrentIrpStackLocation(Irp)->Parameters.QueryId.IdType;
|
||||||
PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
|
|
||||||
FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension;
|
|
||||||
|
|
||||||
/* FIXME: Read values from registry */
|
|
||||||
|
|
||||||
switch (IdType)
|
switch (IdType)
|
||||||
{
|
{
|
||||||
case BusQueryDeviceID:
|
case BusQueryDeviceID:
|
||||||
{
|
{
|
||||||
DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryDeviceID\n");
|
|
||||||
RtlInitUnicodeString(&SourceString, L"USB\\ROOT_HUB20");
|
RtlInitUnicodeString(&SourceString, L"USB\\ROOT_HUB20");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case BusQueryHardwareIDs:
|
case BusQueryHardwareIDs:
|
||||||
{
|
{
|
||||||
DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryHardwareIDs\n");
|
|
||||||
|
|
||||||
Index += swprintf(&Buffer[Index], L"USB\\ROOT_HUB20&VID8086&PID265C&REV0000") + 1;
|
Index += swprintf(&Buffer[Index], L"USB\\ROOT_HUB20&VID8086&PID265C&REV0000") + 1;
|
||||||
Index += swprintf(&Buffer[Index], L"USB\\ROOT_HUB20&VID8086&PID265") + 1;
|
Index += swprintf(&Buffer[Index], L"USB\\ROOT_HUB20&VID8086&PID265C") + 1;
|
||||||
Index += swprintf(&Buffer[Index], L"USB\\ROOT_HUB20") + 1;
|
Index += swprintf(&Buffer[Index], L"USB\\ROOT_HUB20") + 1;
|
||||||
|
|
||||||
Buffer[Index] = UNICODE_NULL;
|
Buffer[Index] = UNICODE_NULL;
|
||||||
|
@ -209,24 +263,12 @@ PdoQueryId(PDEVICE_OBJECT DeviceObject, PIRP Irp, ULONG_PTR* Information)
|
||||||
}
|
}
|
||||||
case BusQueryCompatibleIDs:
|
case BusQueryCompatibleIDs:
|
||||||
{
|
{
|
||||||
DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryCompatibleIDs\n");
|
/* We have none */
|
||||||
/* We have none */
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
case BusQueryInstanceID:
|
case BusQueryInstanceID:
|
||||||
{
|
{
|
||||||
DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryInstanceID\n");
|
|
||||||
|
|
||||||
/*
|
|
||||||
Do we need to implement this?
|
|
||||||
At one point I hade DeviceCapabilities->UniqueID set to TRUE.
|
|
||||||
And caused usbhub to fail attaching
|
|
||||||
to the PDO. Setting UniqueID to FALSE, it works
|
|
||||||
*/
|
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
|
@ -247,18 +289,15 @@ PdoQueryId(PDEVICE_OBJECT DeviceObject, PIRP Irp, ULONG_PTR* Information)
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
PdoQueryDeviceRelations(PDEVICE_OBJECT DeviceObject, PDEVICE_RELATIONS* pDeviceRelations)
|
PdoQueryDeviceRelations(PDEVICE_OBJECT DeviceObject, PDEVICE_RELATIONS* pDeviceRelations)
|
||||||
{
|
{
|
||||||
PFDO_DEVICE_EXTENSION DeviceExtension;
|
|
||||||
PDEVICE_RELATIONS DeviceRelations;
|
PDEVICE_RELATIONS DeviceRelations;
|
||||||
|
|
||||||
DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
|
|
||||||
|
|
||||||
DeviceRelations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool, sizeof(DEVICE_RELATIONS));
|
DeviceRelations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool, sizeof(DEVICE_RELATIONS));
|
||||||
if (!DeviceRelations)
|
if (!DeviceRelations)
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
|
||||||
ObReferenceObject(DeviceObject);
|
|
||||||
DeviceRelations->Count = 1;
|
DeviceRelations->Count = 1;
|
||||||
DeviceRelations->Objects[0] = DeviceObject;
|
DeviceRelations->Objects[0] = DeviceObject;
|
||||||
|
ObReferenceObject(DeviceObject);
|
||||||
|
|
||||||
*pDeviceRelations = DeviceRelations;
|
*pDeviceRelations = DeviceRelations;
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
|
@ -271,8 +310,8 @@ PdoDispatchPnp(
|
||||||
{
|
{
|
||||||
ULONG MinorFunction;
|
ULONG MinorFunction;
|
||||||
PIO_STACK_LOCATION Stack;
|
PIO_STACK_LOCATION Stack;
|
||||||
ULONG_PTR Information = 0;
|
ULONG_PTR Information = Irp->IoStatus.Information;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status = Irp->IoStatus.Status;
|
||||||
|
|
||||||
Stack = IoGetCurrentIrpStackLocation(Irp);
|
Stack = IoGetCurrentIrpStackLocation(Irp);
|
||||||
MinorFunction = Stack->MinorFunction;
|
MinorFunction = Stack->MinorFunction;
|
||||||
|
@ -284,17 +323,70 @@ PdoDispatchPnp(
|
||||||
case IRP_MN_CANCEL_REMOVE_DEVICE:
|
case IRP_MN_CANCEL_REMOVE_DEVICE:
|
||||||
case IRP_MN_STOP_DEVICE:
|
case IRP_MN_STOP_DEVICE:
|
||||||
case IRP_MN_QUERY_STOP_DEVICE:
|
case IRP_MN_QUERY_STOP_DEVICE:
|
||||||
|
case IRP_MN_CANCEL_STOP_DEVICE:
|
||||||
case IRP_MN_QUERY_DEVICE_TEXT:
|
case IRP_MN_QUERY_DEVICE_TEXT:
|
||||||
case IRP_MN_SURPRISE_REMOVAL:
|
case IRP_MN_SURPRISE_REMOVAL:
|
||||||
|
case IRP_MN_QUERY_RESOURCES:
|
||||||
|
case IRP_MN_QUERY_RESOURCE_REQUIREMENTS:
|
||||||
|
case IRP_MN_FILTER_RESOURCE_REQUIREMENTS:
|
||||||
{
|
{
|
||||||
Information = Irp->IoStatus.Information;
|
|
||||||
Status = STATUS_SUCCESS;
|
Status = STATUS_SUCCESS;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case IRP_MN_START_DEVICE:
|
case IRP_MN_START_DEVICE:
|
||||||
{
|
{
|
||||||
DPRINT("IRP_MJ_PNP / IRP_MN_START_DEVICE\n");
|
PUSB_DEVICE RootHubDevice;
|
||||||
|
PPDO_DEVICE_EXTENSION PdoDeviceExtension;
|
||||||
|
PFDO_DEVICE_EXTENSION FdoDeviceExtension;
|
||||||
|
UNICODE_STRING InterfaceSymLinkName;
|
||||||
|
|
||||||
|
PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
|
||||||
|
FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension;
|
||||||
|
|
||||||
|
/* Create the root hub */
|
||||||
|
RootHubDevice = InternalCreateUsbDevice(0, 0, NULL, TRUE);
|
||||||
|
|
||||||
|
RootHubDevice->Address = 1;
|
||||||
|
RootHubDevice->Port = 0;
|
||||||
|
|
||||||
|
RtlCopyMemory(&RootHubDevice->DeviceDescriptor,
|
||||||
|
ROOTHUB2_DEVICE_DESCRIPTOR,
|
||||||
|
sizeof(ROOTHUB2_DEVICE_DESCRIPTOR));
|
||||||
|
|
||||||
|
RootHubDevice->DeviceDescriptor.idVendor = FdoDeviceExtension->VendorId;
|
||||||
|
RootHubDevice->DeviceDescriptor.idProduct = FdoDeviceExtension->DeviceId;
|
||||||
|
|
||||||
|
RtlCopyMemory(&RootHubDevice->ConfigurationDescriptor,
|
||||||
|
ROOTHUB2_CONFIGURATION_DESCRIPTOR,
|
||||||
|
sizeof(ROOTHUB2_CONFIGURATION_DESCRIPTOR));
|
||||||
|
|
||||||
|
PdoDeviceExtension->UsbDevices[0] = RootHubDevice;
|
||||||
|
|
||||||
|
/* Create a thread to handle the URB's */
|
||||||
|
Status = PsCreateSystemThread(&PdoDeviceExtension->ThreadHandle,
|
||||||
|
THREAD_ALL_ACCESS,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
UrbWorkerThread,
|
||||||
|
(PVOID)PdoDeviceExtension);
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
DPRINT1("Failed Thread Creation with Status: %x\n", Status);
|
||||||
|
|
||||||
|
Status = IoRegisterDeviceInterface(DeviceObject, &GUID_DEVINTERFACE_USB_HUB, NULL, &InterfaceSymLinkName);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
DPRINT1("Failed to register interface\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Status = IoSetDeviceInterfaceState(&InterfaceSymLinkName, TRUE);
|
||||||
|
DPRINT1("Set interface state %x\n", Status);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Status = STATUS_SUCCESS;
|
Status = STATUS_SUCCESS;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -305,16 +397,17 @@ PdoDispatchPnp(
|
||||||
case TargetDeviceRelation:
|
case TargetDeviceRelation:
|
||||||
{
|
{
|
||||||
PDEVICE_RELATIONS DeviceRelations = NULL;
|
PDEVICE_RELATIONS DeviceRelations = NULL;
|
||||||
DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / TargetDeviceRelation\n");
|
|
||||||
Status = PdoQueryDeviceRelations(DeviceObject, &DeviceRelations);
|
Status = PdoQueryDeviceRelations(DeviceObject, &DeviceRelations);
|
||||||
Information = (ULONG_PTR)DeviceRelations;
|
Information = (ULONG_PTR)DeviceRelations;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case BusRelations:
|
||||||
|
case RemovalRelations:
|
||||||
|
case EjectionRelations:
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / Unhandled type 0x%lx\n",
|
DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / Unhandled type 0x%lx\n",
|
||||||
Stack->Parameters.QueryDeviceRelations.Type);
|
Stack->Parameters.QueryDeviceRelations.Type);
|
||||||
//ASSERT(FALSE);
|
|
||||||
Status = STATUS_NOT_SUPPORTED;
|
Status = STATUS_NOT_SUPPORTED;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -325,17 +418,20 @@ PdoDispatchPnp(
|
||||||
{
|
{
|
||||||
PDEVICE_CAPABILITIES DeviceCapabilities;
|
PDEVICE_CAPABILITIES DeviceCapabilities;
|
||||||
ULONG i;
|
ULONG i;
|
||||||
DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_CAPABILITIES\n");
|
|
||||||
DeviceCapabilities = (PDEVICE_CAPABILITIES)Stack->Parameters.DeviceCapabilities.Capabilities;
|
DeviceCapabilities = (PDEVICE_CAPABILITIES)Stack->Parameters.DeviceCapabilities.Capabilities;
|
||||||
/* FIXME: capabilities can change with connected device */
|
|
||||||
DeviceCapabilities->LockSupported = FALSE;
|
DeviceCapabilities->LockSupported = FALSE;
|
||||||
DeviceCapabilities->EjectSupported = FALSE;
|
DeviceCapabilities->EjectSupported = FALSE;
|
||||||
DeviceCapabilities->Removable = FALSE;
|
DeviceCapabilities->Removable = FALSE;
|
||||||
DeviceCapabilities->DockDevice = FALSE;
|
DeviceCapabilities->DockDevice = FALSE;
|
||||||
DeviceCapabilities->UniqueID = FALSE;//TRUE;
|
DeviceCapabilities->UniqueID = FALSE;
|
||||||
DeviceCapabilities->SilentInstall = FALSE;
|
DeviceCapabilities->SilentInstall = FALSE;
|
||||||
DeviceCapabilities->RawDeviceOK = TRUE;
|
DeviceCapabilities->RawDeviceOK = FALSE;
|
||||||
DeviceCapabilities->SurpriseRemovalOK = FALSE;
|
DeviceCapabilities->SurpriseRemovalOK = FALSE;
|
||||||
|
DeviceCapabilities->Address = 0;
|
||||||
|
DeviceCapabilities->UINumber = 0;
|
||||||
|
DeviceCapabilities->DeviceD2 = 1;
|
||||||
|
|
||||||
/* FIXME */
|
/* FIXME */
|
||||||
DeviceCapabilities->HardwareDisabled = FALSE;
|
DeviceCapabilities->HardwareDisabled = FALSE;
|
||||||
|
@ -343,47 +439,101 @@ PdoDispatchPnp(
|
||||||
DeviceCapabilities->DeviceState[0] = PowerDeviceD0;
|
DeviceCapabilities->DeviceState[0] = PowerDeviceD0;
|
||||||
for (i = 0; i < PowerSystemMaximum; i++)
|
for (i = 0; i < PowerSystemMaximum; i++)
|
||||||
DeviceCapabilities->DeviceState[i] = PowerDeviceD3;
|
DeviceCapabilities->DeviceState[i] = PowerDeviceD3;
|
||||||
//DeviceCapabilities->DeviceWake = PowerDeviceUndefined;
|
DeviceCapabilities->DeviceWake = 0;
|
||||||
DeviceCapabilities->D1Latency = 0;
|
DeviceCapabilities->D1Latency = 0;
|
||||||
DeviceCapabilities->D2Latency = 0;
|
DeviceCapabilities->D2Latency = 0;
|
||||||
DeviceCapabilities->D3Latency = 0;
|
DeviceCapabilities->D3Latency = 0;
|
||||||
|
Information = 0;
|
||||||
Status = STATUS_SUCCESS;
|
Status = STATUS_SUCCESS;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IRP_MN_QUERY_RESOURCES:
|
|
||||||
{
|
|
||||||
Information = Irp->IoStatus.Information;
|
|
||||||
Status = Irp->IoStatus.Status;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case IRP_MN_QUERY_RESOURCE_REQUIREMENTS:
|
|
||||||
{
|
|
||||||
DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n");
|
|
||||||
Information = Irp->IoStatus.Information;
|
|
||||||
Status = Irp->IoStatus.Status;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/*case IRP_MN_QUERY_DEVICE_TEXT:
|
/*case IRP_MN_QUERY_DEVICE_TEXT:
|
||||||
{
|
{
|
||||||
Status = STATUS_NOT_SUPPORTED;
|
Status = STATUS_NOT_SUPPORTED;
|
||||||
break;
|
break;
|
||||||
}*/
|
}*/
|
||||||
case IRP_MN_FILTER_RESOURCE_REQUIREMENTS:
|
|
||||||
{
|
|
||||||
DPRINT("IRP_MJ_PNP / IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n");
|
|
||||||
Information = Irp->IoStatus.Information;
|
|
||||||
Status = Irp->IoStatus.Status;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case IRP_MN_QUERY_ID:
|
case IRP_MN_QUERY_ID:
|
||||||
{
|
{
|
||||||
Status = PdoQueryId(DeviceObject, Irp, &Information);
|
Status = PdoQueryId(DeviceObject, Irp, &Information);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case IRP_MN_QUERY_INTERFACE:
|
||||||
|
{
|
||||||
|
UNICODE_STRING GuidString;
|
||||||
|
PUSB_BUS_INTERFACE_HUB_V5 InterfaceHub;
|
||||||
|
PUSB_BUS_INTERFACE_USBDI_V2 InterfaceDI;
|
||||||
|
PPDO_DEVICE_EXTENSION PdoDeviceExtension;
|
||||||
|
PFDO_DEVICE_EXTENSION FdoDeviceExtension;
|
||||||
|
|
||||||
|
PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
|
||||||
|
FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension;
|
||||||
|
|
||||||
|
Status = RtlStringFromGUID(Stack->Parameters.QueryInterface.InterfaceType, &GuidString);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
DPRINT1("Failed to create string from GUID!\n");
|
||||||
|
}
|
||||||
|
DPRINT1("Interface GUID requested %wZ\n", &GuidString);
|
||||||
|
DPRINT1("QueryInterface.Size %x\n", Stack->Parameters.QueryInterface.Size);
|
||||||
|
DPRINT1("QueryInterface.Version %x\n", Stack->Parameters.QueryInterface.Version);
|
||||||
|
|
||||||
|
Status = STATUS_SUCCESS;
|
||||||
|
Information = 0;
|
||||||
|
|
||||||
|
/* FIXME: Check the actual Guid */
|
||||||
|
if (Stack->Parameters.QueryInterface.Size == sizeof(USB_BUS_INTERFACE_USBDI_V2) && (Stack->Parameters.QueryInterface.Version == 2))
|
||||||
|
{
|
||||||
|
InterfaceDI = (PUSB_BUS_INTERFACE_USBDI_V2) Stack->Parameters.QueryInterface.Interface;
|
||||||
|
InterfaceDI->Size = sizeof(USB_BUS_INTERFACE_USBDI_V2);
|
||||||
|
InterfaceDI->Version = 2;
|
||||||
|
InterfaceDI->BusContext = PdoDeviceExtension->DeviceObject;
|
||||||
|
InterfaceDI->InterfaceReference = (PINTERFACE_REFERENCE)InterfaceReference;
|
||||||
|
InterfaceDI->InterfaceDereference = (PINTERFACE_DEREFERENCE)InterfaceDereference;
|
||||||
|
InterfaceDI->GetUSBDIVersion = GetUSBDIVersion;
|
||||||
|
InterfaceDI->QueryBusTime = QueryBusTime;
|
||||||
|
InterfaceDI->SubmitIsoOutUrb = SubmitIsoOutUrb;
|
||||||
|
InterfaceDI->QueryBusInformation = QueryBusInformation;
|
||||||
|
InterfaceDI->IsDeviceHighSpeed = IsDeviceHighSpeed;
|
||||||
|
InterfaceDI->EnumLogEntry = EnumLogEntry;
|
||||||
|
}
|
||||||
|
/* FIXME: Check the actual Guid */
|
||||||
|
else if (Stack->Parameters.QueryInterface.Size == sizeof(USB_BUS_INTERFACE_HUB_V5) &&
|
||||||
|
(Stack->Parameters.QueryInterface.Version == 5))
|
||||||
|
{
|
||||||
|
InterfaceHub = (PUSB_BUS_INTERFACE_HUB_V5)Stack->Parameters.QueryInterface.Interface;
|
||||||
|
InterfaceHub->Version = 5;
|
||||||
|
InterfaceHub->Size = sizeof(USB_BUS_INTERFACE_HUB_V5);
|
||||||
|
InterfaceHub->BusContext = PdoDeviceExtension->DeviceObject;
|
||||||
|
InterfaceHub->InterfaceReference = (PINTERFACE_REFERENCE)InterfaceReference;
|
||||||
|
InterfaceHub->InterfaceDereference = (PINTERFACE_DEREFERENCE)InterfaceDereference;
|
||||||
|
InterfaceHub->CreateUsbDevice = CreateUsbDevice;
|
||||||
|
InterfaceHub->InitializeUsbDevice = InitializeUsbDevice;
|
||||||
|
InterfaceHub->GetUsbDescriptors = GetUsbDescriptors;
|
||||||
|
InterfaceHub->RemoveUsbDevice = RemoveUsbDevice;
|
||||||
|
InterfaceHub->RestoreUsbDevice = RestoreUsbDevice;
|
||||||
|
InterfaceHub->GetPortHackFlags = GetPortHackFlags;
|
||||||
|
InterfaceHub->QueryDeviceInformation = QueryDeviceInformation;
|
||||||
|
InterfaceHub->GetControllerInformation = GetControllerInformation;
|
||||||
|
InterfaceHub->ControllerSelectiveSuspend = ControllerSelectiveSuspend;
|
||||||
|
InterfaceHub->GetExtendedHubInformation = GetExtendedHubInformation;
|
||||||
|
InterfaceHub->GetRootHubSymbolicName = GetRootHubSymbolicName;
|
||||||
|
InterfaceHub->GetDeviceBusContext = GetDeviceBusContext;
|
||||||
|
InterfaceHub->Initialize20Hub = Initialize20Hub;
|
||||||
|
InterfaceHub->RootHubInitNotification = RootHubInitNotification;
|
||||||
|
InterfaceHub->FlushTransfers = FlushTransfers;
|
||||||
|
InterfaceHub->SetDeviceHandleData = SetDeviceHandleData;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DPRINT1("Not Supported\n");
|
||||||
|
Status = STATUS_NOT_SUPPORTED;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case IRP_MN_QUERY_BUS_INFORMATION:
|
case IRP_MN_QUERY_BUS_INFORMATION:
|
||||||
{
|
{
|
||||||
PPNP_BUS_INFORMATION BusInfo;
|
PPNP_BUS_INFORMATION BusInfo;
|
||||||
DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_BUS_INFORMATION\n");
|
|
||||||
|
|
||||||
BusInfo = (PPNP_BUS_INFORMATION)ExAllocatePool(PagedPool, sizeof(PNP_BUS_INFORMATION));
|
BusInfo = (PPNP_BUS_INFORMATION)ExAllocatePool(PagedPool, sizeof(PNP_BUS_INFORMATION));
|
||||||
if (!BusInfo)
|
if (!BusInfo)
|
||||||
|
@ -407,9 +557,6 @@ PdoDispatchPnp(
|
||||||
{
|
{
|
||||||
/* We are the PDO. So ignore */
|
/* We are the PDO. So ignore */
|
||||||
DPRINT1("IRP_MJ_PNP / Unknown minor function 0x%lx\n", MinorFunction);
|
DPRINT1("IRP_MJ_PNP / Unknown minor function 0x%lx\n", MinorFunction);
|
||||||
|
|
||||||
Information = Irp->IoStatus.Information;
|
|
||||||
Status = Irp->IoStatus.Status;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -176,24 +176,6 @@ typedef struct _EHCI_SETUP_FORMAT
|
||||||
USHORT wLength;
|
USHORT wLength;
|
||||||
} EHCI_SETUP_FORMAT, *PEHCI_SETUP_FORMAT;
|
} EHCI_SETUP_FORMAT, *PEHCI_SETUP_FORMAT;
|
||||||
|
|
||||||
typedef struct _STANDARD_DEVICE_DESC
|
|
||||||
{
|
|
||||||
UCHAR bLength;
|
|
||||||
UCHAR bDescriptorType;
|
|
||||||
USHORT bcdUSB;
|
|
||||||
UCHAR bDeviceClass;
|
|
||||||
UCHAR bDeviceSubClass;
|
|
||||||
UCHAR bDeviceProtocal;
|
|
||||||
UCHAR bMaxPacketSize;
|
|
||||||
USHORT idVendor;
|
|
||||||
USHORT idProduct;
|
|
||||||
USHORT bcdDevice;
|
|
||||||
UCHAR iManufacturer;
|
|
||||||
UCHAR iProduct;
|
|
||||||
UCHAR iSerialNumber;
|
|
||||||
UCHAR bNumConfigurations;
|
|
||||||
} STANDARD_DEVICE_DESC, *PSTANDARD_DEVICE_DESC;
|
|
||||||
|
|
||||||
typedef struct _STRING_DESCRIPTOR
|
typedef struct _STRING_DESCRIPTOR
|
||||||
{
|
{
|
||||||
UCHAR bLength; /* Size of this descriptor in bytes */
|
UCHAR bLength; /* Size of this descriptor in bytes */
|
||||||
|
@ -201,6 +183,17 @@ typedef struct _STRING_DESCRIPTOR
|
||||||
UCHAR bString[0]; /* UNICODE encoded string */
|
UCHAR bString[0]; /* UNICODE encoded string */
|
||||||
} STRING_DESCRIPTOR, *PSTRING_DESCRIPTOR;
|
} STRING_DESCRIPTOR, *PSTRING_DESCRIPTOR;
|
||||||
|
|
||||||
|
typedef struct _USB_DEVICE
|
||||||
|
{
|
||||||
|
UCHAR Address;
|
||||||
|
ULONG Port;
|
||||||
|
PVOID ParentDevice;
|
||||||
|
USB_DEVICE_DESCRIPTOR DeviceDescriptor;
|
||||||
|
USB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor;
|
||||||
|
USB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
|
||||||
|
USB_ENDPOINT_DESCRIPTOR EndPointDescriptor;
|
||||||
|
} USB_DEVICE, *PUSB_DEVICE;
|
||||||
|
|
||||||
/* USBCMD register 32 bits */
|
/* USBCMD register 32 bits */
|
||||||
typedef struct _EHCI_USBCMD_CONTENT
|
typedef struct _EHCI_USBCMD_CONTENT
|
||||||
{
|
{
|
||||||
|
@ -292,7 +285,6 @@ typedef struct _EHCI_CAPS {
|
||||||
UCHAR PortRoute [8];
|
UCHAR PortRoute [8];
|
||||||
} EHCI_CAPS, *PEHCI_CAPS;
|
} EHCI_CAPS, *PEHCI_CAPS;
|
||||||
|
|
||||||
|
|
||||||
typedef struct _COMMON_DEVICE_EXTENSION
|
typedef struct _COMMON_DEVICE_EXTENSION
|
||||||
{
|
{
|
||||||
BOOLEAN IsFdo;
|
BOOLEAN IsFdo;
|
||||||
|
@ -309,9 +301,7 @@ typedef struct _FDO_DEVICE_EXTENSION
|
||||||
PDEVICE_OBJECT Pdo;
|
PDEVICE_OBJECT Pdo;
|
||||||
ULONG DeviceState;
|
ULONG DeviceState;
|
||||||
|
|
||||||
/* USB Specs says a max of 127 devices */
|
PVOID RootHubDeviceHandle;
|
||||||
ULONG ChildDeviceCount;
|
|
||||||
|
|
||||||
PDMA_ADAPTER pDmaAdapter;
|
PDMA_ADAPTER pDmaAdapter;
|
||||||
|
|
||||||
ULONG Vector;
|
ULONG Vector;
|
||||||
|
@ -323,10 +313,6 @@ typedef struct _FDO_DEVICE_EXTENSION
|
||||||
KDPC DpcObject;
|
KDPC DpcObject;
|
||||||
KAFFINITY Affinity;
|
KAFFINITY Affinity;
|
||||||
|
|
||||||
LIST_ENTRY IrpQueue;
|
|
||||||
KSPIN_LOCK IrpQueueLock;
|
|
||||||
PIRP CurrentIrp;
|
|
||||||
|
|
||||||
ULONG MapRegisters;
|
ULONG MapRegisters;
|
||||||
|
|
||||||
ULONG BusNumber;
|
ULONG BusNumber;
|
||||||
|
@ -354,7 +340,6 @@ typedef struct _FDO_DEVICE_EXTENSION
|
||||||
|
|
||||||
PULONG ResourceBase;
|
PULONG ResourceBase;
|
||||||
ULONG Size;
|
ULONG Size;
|
||||||
|
|
||||||
} FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
|
} FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
|
||||||
|
|
||||||
typedef struct _PDO_DEVICE_EXTENSION
|
typedef struct _PDO_DEVICE_EXTENSION
|
||||||
|
@ -362,16 +347,26 @@ typedef struct _PDO_DEVICE_EXTENSION
|
||||||
COMMON_DEVICE_EXTENSION Common;
|
COMMON_DEVICE_EXTENSION Common;
|
||||||
PDEVICE_OBJECT DeviceObject;
|
PDEVICE_OBJECT DeviceObject;
|
||||||
PDEVICE_OBJECT ControllerFdo;
|
PDEVICE_OBJECT ControllerFdo;
|
||||||
|
PUSB_DEVICE UsbDevices[127];
|
||||||
|
LIST_ENTRY IrpQueue;
|
||||||
|
KSPIN_LOCK IrpQueueLock;
|
||||||
|
PIRP CurrentIrp;
|
||||||
|
HANDLE ThreadHandle;
|
||||||
|
ULONG ChildDeviceCount;
|
||||||
|
BOOLEAN HaltUrbHandling;
|
||||||
} PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
|
} PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
|
||||||
|
|
||||||
|
|
||||||
typedef struct _WORKITEM_DATA
|
typedef struct _WORKITEM_DATA
|
||||||
{
|
{
|
||||||
PIO_WORKITEM IoWorkItem;
|
PIO_WORKITEM IoWorkItem;
|
||||||
PFDO_DEVICE_EXTENSION FdoDeviceExtension;
|
PFDO_DEVICE_EXTENSION FdoDeviceExtension;
|
||||||
|
PDEVICE_OBJECT PortDeviceObject;
|
||||||
} WORKITEM_DATA, *PWORKITEM_DATA;
|
} WORKITEM_DATA, *PWORKITEM_DATA;
|
||||||
|
|
||||||
|
|
||||||
|
VOID NTAPI
|
||||||
|
UrbWorkerThread(PVOID Context);
|
||||||
|
|
||||||
NTSTATUS NTAPI
|
NTSTATUS NTAPI
|
||||||
GetBusInterface(PDEVICE_OBJECT pcifido, PBUS_INTERFACE_STANDARD busInterface);
|
GetBusInterface(PDEVICE_OBJECT pcifido, PBUS_INTERFACE_STANDARD busInterface);
|
||||||
|
|
||||||
|
@ -406,27 +401,18 @@ NTSTATUS NTAPI
|
||||||
PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
|
PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
|
||||||
|
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
GetDeviceDescriptor (PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index);
|
GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index, PUSB_DEVICE_DESCRIPTOR OutBuffer, BOOLEAN Hub);
|
||||||
|
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
GetDeviceStringDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index);
|
GetDeviceStringDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index);
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
CompletePendingRequest(PFDO_DEVICE_EXTENSION DeviceExtension);
|
QueueURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp);
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
QueueRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp);
|
CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension);
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
QueueRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp);
|
URBRequestCancel (PDEVICE_OBJECT DeviceObject, PIRP Irp);
|
||||||
|
|
||||||
VOID
|
|
||||||
CompletePendingRequest(PFDO_DEVICE_EXTENSION DeviceExtension);
|
|
||||||
|
|
||||||
VOID
|
|
||||||
DeviceArrivalWorkItem(PDEVICE_OBJECT DeviceObject, PVOID Context);
|
|
||||||
|
|
||||||
VOID
|
|
||||||
RequestCancel (PDEVICE_OBJECT DeviceObject, PIRP Irp);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -9,5 +9,6 @@
|
||||||
<file>common.c</file>
|
<file>common.c</file>
|
||||||
<file>misc.c</file>
|
<file>misc.c</file>
|
||||||
<file>irp.c</file>
|
<file>irp.c</file>
|
||||||
|
<file>usbiffn.c</file>
|
||||||
<file>urbreq.c</file>
|
<file>urbreq.c</file>
|
||||||
</module>
|
</module>
|
||||||
|
|
260
reactos/drivers/usb/usbehci/usbiffn.c
Normal file
260
reactos/drivers/usb/usbehci/usbiffn.c
Normal file
|
@ -0,0 +1,260 @@
|
||||||
|
/*
|
||||||
|
* PROJECT: ReactOS Universal Serial Bus Bulk Enhanced Host Controller Interface
|
||||||
|
* LICENSE: GPL - See COPYING in the top level directory
|
||||||
|
* FILE: drivers/usb/usbehci/usbiffn.c
|
||||||
|
* PURPOSE: Direct Call Interface Functions.
|
||||||
|
* PROGRAMMERS:
|
||||||
|
* Michael Martin
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* usbbusif.h and hubbusif.h need to be imported */
|
||||||
|
#include "usbehci.h"
|
||||||
|
#include "usbiffn.h"
|
||||||
|
#define NDEBUG
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
VOID
|
||||||
|
USB_BUSIFFN
|
||||||
|
InterfaceReference(PVOID BusContext)
|
||||||
|
{
|
||||||
|
DPRINT1("InterfaceReference called\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
USB_BUSIFFN
|
||||||
|
InterfaceDereference(PVOID BusContext)
|
||||||
|
{
|
||||||
|
DPRINT1("InterfaceDereference called\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Bus Interface Hub V5 Functions */
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
CreateUsbDevice(PVOID BusContext,
|
||||||
|
PUSB_DEVICE_HANDLE *NewDevice,
|
||||||
|
PUSB_DEVICE_HANDLE HubDeviceHandle,
|
||||||
|
USHORT PortStatus, USHORT PortNumber)
|
||||||
|
{
|
||||||
|
DPRINT1("CreateUsbDevice called\n");
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle)
|
||||||
|
{
|
||||||
|
DPRINT1("InitializeUsbDevice called\n");
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
GetUsbDescriptors(PVOID BusContext,
|
||||||
|
PUSB_DEVICE_HANDLE DeviceHandle,
|
||||||
|
PUCHAR DeviceDescriptorBuffer,
|
||||||
|
PULONG DeviceDescriptorBufferLength,
|
||||||
|
PUCHAR ConfigurationBuffer,
|
||||||
|
PULONG ConfigDescriptorBufferLength)
|
||||||
|
{
|
||||||
|
DPRINT1("GetUsbDescriptor called\n");
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
RemoveUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle, ULONG Flags)
|
||||||
|
{
|
||||||
|
DPRINT1("RemoveUsbDevice called\n");
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
RestoreUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE OldDeviceHandle, PUSB_DEVICE_HANDLE NewDeviceHandle)
|
||||||
|
{
|
||||||
|
DPRINT1("RestoreUsbDevice called\n");
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
GetPortHackFlags(PVOID BusContext, PULONG Flags)
|
||||||
|
{
|
||||||
|
DPRINT1("GetPortHackFlags called\n");
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
QueryDeviceInformation(PVOID BusContext,
|
||||||
|
PUSB_DEVICE_HANDLE DeviceHandle,
|
||||||
|
PVOID DeviceInformationBuffer,
|
||||||
|
ULONG DeviceInformationBufferLength,
|
||||||
|
PULONG LengthReturned)
|
||||||
|
{
|
||||||
|
DPRINT1("QueryDeviceInformation called\n");
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
GetControllerInformation(PVOID BusContext,
|
||||||
|
PVOID ControllerInformationBuffer,
|
||||||
|
ULONG ControllerInformationBufferLength,
|
||||||
|
PULONG LengthReturned)
|
||||||
|
{
|
||||||
|
DPRINT1("GetControllerInformation called\n");
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
ControllerSelectiveSuspend(PVOID BusContext, BOOLEAN Enable)
|
||||||
|
{
|
||||||
|
DPRINT1("ControllerSelectiveSuspend called\n");
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
GetExtendedHubInformation(PVOID BusContext,
|
||||||
|
PDEVICE_OBJECT HubPhysicalDeviceObject,
|
||||||
|
PVOID HubInformationBuffer,
|
||||||
|
ULONG HubInformationBufferLength,
|
||||||
|
PULONG LengthReturned)
|
||||||
|
{
|
||||||
|
|
||||||
|
PUSB_EXTHUB_INFORMATION_0 UsbExtHubInfo = HubInformationBuffer;
|
||||||
|
PPDO_DEVICE_EXTENSION PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension;
|
||||||
|
PFDO_DEVICE_EXTENSION FdoDeviceExntension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension;
|
||||||
|
LONG i;
|
||||||
|
|
||||||
|
/* Set the default return value */
|
||||||
|
*LengthReturned = 0;
|
||||||
|
/* Caller must have set InformationLevel to 0 */
|
||||||
|
if (UsbExtHubInfo->InformationLevel != 0)
|
||||||
|
{
|
||||||
|
return STATUS_NOT_SUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
UsbExtHubInfo->NumberOfPorts = 8;
|
||||||
|
|
||||||
|
for (i=0; i < UsbExtHubInfo->NumberOfPorts; i++)
|
||||||
|
{
|
||||||
|
UsbExtHubInfo->Port[i].PhysicalPortNumber = i + 1;
|
||||||
|
UsbExtHubInfo->Port[i].PortLabelNumber = FdoDeviceExntension->ECHICaps.HCSParams.PortCount;
|
||||||
|
UsbExtHubInfo->Port[i].VidOverride = 0;
|
||||||
|
UsbExtHubInfo->Port[i].PidOverride = 0;
|
||||||
|
UsbExtHubInfo->Port[i].PortAttributes = USB_PORTATTR_SHARED_USB2;
|
||||||
|
}
|
||||||
|
|
||||||
|
*LengthReturned = FIELD_OFFSET(USB_EXTHUB_INFORMATION_0, Port[8]);
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
GetRootHubSymbolicName(PVOID BusContext,
|
||||||
|
PVOID HubSymNameBuffer,
|
||||||
|
ULONG HubSymNameBufferLength,
|
||||||
|
PULONG HubSymNameActualLength)
|
||||||
|
{
|
||||||
|
DPRINT1("GetRootHubSymbolicName called\n");
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
PVOID
|
||||||
|
USB_BUSIFFN
|
||||||
|
GetDeviceBusContext(PVOID HubBusContext, PVOID DeviceHandle)
|
||||||
|
{
|
||||||
|
DPRINT1("GetDeviceBusContext called\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
Initialize20Hub(PVOID BusContext, PUSB_DEVICE_HANDLE HubDeviceHandle, ULONG TtCount)
|
||||||
|
{
|
||||||
|
DPRINT1("Initialize20Hub called\n");
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
RootHubInitNotification(PVOID BusContext, PVOID CallbackContext, PRH_INIT_CALLBACK CallbackRoutine)
|
||||||
|
{
|
||||||
|
DPRINT1("RootHubInitNotification\n");
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
USB_BUSIFFN
|
||||||
|
FlushTransfers(PVOID BusContext, PVOID DeviceHandle)
|
||||||
|
{
|
||||||
|
DPRINT1("FlushTransfers\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
USB_BUSIFFN
|
||||||
|
SetDeviceHandleData(PVOID BusContext, PVOID DeviceHandle, PDEVICE_OBJECT UsbDevicePdo)
|
||||||
|
{
|
||||||
|
DPRINT1("SetDeviceHandleData called\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* USB_BUS_INTERFACE_USBDI_V2 Functions */
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
GetUSBDIVersion(PVOID BusContext, PUSBD_VERSION_INFORMATION VersionInformation, PULONG HcdCapabilites)
|
||||||
|
{
|
||||||
|
DPRINT1("GetUSBDIVersion called\n");
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
QueryBusTime(PVOID BusContext, PULONG CurrentFrame)
|
||||||
|
{
|
||||||
|
DPRINT1("QueryBusTime called\n");
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
SubmitIsoOutUrb(PVOID BusContext, PURB Urb)
|
||||||
|
{
|
||||||
|
DPRINT1("SubmitIsoOutUrb called\n");
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
QueryBusInformation(PVOID BusContext,
|
||||||
|
ULONG Level,
|
||||||
|
PVOID BusInformationBuffer,
|
||||||
|
PULONG BusInformationBufferLength,
|
||||||
|
PULONG BusInformationActualLength)
|
||||||
|
{
|
||||||
|
DPRINT1("QueryBusInformation called\n");
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
USB_BUSIFFN
|
||||||
|
IsDeviceHighSpeed(PVOID BusCOntext)
|
||||||
|
{
|
||||||
|
DPRINT1("IsDeviceHighSpeed called\n");
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
EnumLogEntry(PVOID BusContext, ULONG DriverTag, ULONG EnumTag, ULONG P1, ULONG P2)
|
||||||
|
{
|
||||||
|
DPRINT1("EnumLogEntry called\n");
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
200
reactos/drivers/usb/usbehci/usbiffn.h
Normal file
200
reactos/drivers/usb/usbehci/usbiffn.h
Normal file
|
@ -0,0 +1,200 @@
|
||||||
|
#ifndef __USBIFFN_H__
|
||||||
|
#define __USBIFFN_H__
|
||||||
|
|
||||||
|
#define USB_BUSIFFN __stdcall
|
||||||
|
#include <ntifs.h>
|
||||||
|
#include <ntddk.h>
|
||||||
|
#include <usb.h>
|
||||||
|
|
||||||
|
/* usbbusif.h and hubbusif.h need to be imported */
|
||||||
|
typedef PVOID PUSB_DEVICE_HANDLE;
|
||||||
|
|
||||||
|
typedef
|
||||||
|
VOID
|
||||||
|
USB_BUSIFFN
|
||||||
|
RH_INIT_CALLBACK (PVOID CallBackContext);
|
||||||
|
|
||||||
|
typedef RH_INIT_CALLBACK *PRH_INIT_CALLBACK;
|
||||||
|
|
||||||
|
typedef struct _USB_EXTPORT_INFORMATION_0
|
||||||
|
{
|
||||||
|
ULONG PhysicalPortNumber;
|
||||||
|
ULONG PortLabelNumber;
|
||||||
|
USHORT VidOverride;
|
||||||
|
USHORT PidOverride;
|
||||||
|
ULONG PortAttributes;
|
||||||
|
} USB_EXTPORT_INFORMATION_0, *PUSB_EXTPORT_INFORMATION;
|
||||||
|
|
||||||
|
typedef struct _USB_EXTHUB_INFORMATION_0
|
||||||
|
{
|
||||||
|
ULONG InformationLevel;
|
||||||
|
ULONG NumberOfPorts;
|
||||||
|
USB_EXTPORT_INFORMATION_0 Port[255];
|
||||||
|
} USB_EXTHUB_INFORMATION_0, *PUSB_EXTHUB_INFORMATION_0;
|
||||||
|
|
||||||
|
typedef struct _USB_BUS_INTERFACE_USBDI_V2
|
||||||
|
{
|
||||||
|
USHORT Size;
|
||||||
|
USHORT Version;
|
||||||
|
PVOID BusContext;
|
||||||
|
PINTERFACE_REFERENCE InterfaceReference;
|
||||||
|
PINTERFACE_DEREFERENCE InterfaceDereference;
|
||||||
|
|
||||||
|
PVOID GetUSBDIVersion;
|
||||||
|
PVOID QueryBusTime;
|
||||||
|
PVOID SubmitIsoOutUrb;
|
||||||
|
PVOID QueryBusInformation;
|
||||||
|
PVOID IsDeviceHighSpeed;
|
||||||
|
PVOID EnumLogEntry;
|
||||||
|
} USB_BUS_INTERFACE_USBDI_V2, *PUSB_BUS_INTERFACE_USBDI_V2;
|
||||||
|
|
||||||
|
typedef struct _USB_BUS_INTERFACE_HUB_V5
|
||||||
|
{
|
||||||
|
USHORT Size;
|
||||||
|
USHORT Version;
|
||||||
|
PVOID BusContext;
|
||||||
|
PINTERFACE_REFERENCE InterfaceReference;
|
||||||
|
PINTERFACE_DEREFERENCE InterfaceDereference;
|
||||||
|
|
||||||
|
PVOID CreateUsbDevice;
|
||||||
|
PVOID InitializeUsbDevice;
|
||||||
|
PVOID GetUsbDescriptors;
|
||||||
|
PVOID RemoveUsbDevice;
|
||||||
|
PVOID RestoreUsbDevice;
|
||||||
|
PVOID GetPortHackFlags;
|
||||||
|
PVOID QueryDeviceInformation;
|
||||||
|
PVOID GetControllerInformation;
|
||||||
|
PVOID ControllerSelectiveSuspend;
|
||||||
|
PVOID GetExtendedHubInformation;
|
||||||
|
PVOID GetRootHubSymbolicName;
|
||||||
|
PVOID GetDeviceBusContext;
|
||||||
|
PVOID Initialize20Hub;
|
||||||
|
PVOID RootHubInitNotification;
|
||||||
|
PVOID FlushTransfers;
|
||||||
|
PVOID SetDeviceHandleData;
|
||||||
|
} USB_BUS_INTERFACE_HUB_V5, *PUSB_BUS_INTERFACE_HUB_V5;
|
||||||
|
|
||||||
|
VOID
|
||||||
|
USB_BUSIFFN
|
||||||
|
InterfaceReference(PVOID BusContext);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
USB_BUSIFFN
|
||||||
|
InterfaceDereference(PVOID BusContext);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
CreateUsbDevice(PVOID BusContext,
|
||||||
|
PUSB_DEVICE_HANDLE *NewDevice,
|
||||||
|
PUSB_DEVICE_HANDLE HubDeviceHandle,
|
||||||
|
USHORT PortStatus, USHORT PortNumber);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
GetUsbDescriptors(PVOID BusContext,
|
||||||
|
PUSB_DEVICE_HANDLE DeviceHandle,
|
||||||
|
PUCHAR DeviceDescriptorBuffer,
|
||||||
|
PULONG DeviceDescriptorBufferLength,
|
||||||
|
PUCHAR ConfigurationBuffer,
|
||||||
|
PULONG ConfigDescriptorBufferLength);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
RemoveUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle, ULONG Flags);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
RestoreUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE OldDeviceHandle, PUSB_DEVICE_HANDLE NewDeviceHandle);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
GetPortHackFlags(PVOID BusContext, PULONG Flags);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
QueryDeviceInformation(PVOID BusContext,
|
||||||
|
PUSB_DEVICE_HANDLE DeviceHandle,
|
||||||
|
PVOID DeviceInformationBuffer,
|
||||||
|
ULONG DeviceInformationBufferLength,
|
||||||
|
PULONG LengthReturned);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
GetControllerInformation(PVOID BusContext,
|
||||||
|
PVOID ControllerInformationBuffer,
|
||||||
|
ULONG ControllerInformationBufferLength,
|
||||||
|
PULONG LengthReturned);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
ControllerSelectiveSuspend(PVOID BusContext, BOOLEAN Enable);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
GetExtendedHubInformation(PVOID BusContext,
|
||||||
|
PDEVICE_OBJECT HubPhysicalDeviceObject,
|
||||||
|
PVOID HubInformationBuffer,
|
||||||
|
ULONG HubInformationBufferLength,
|
||||||
|
PULONG LengthReturned);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
GetRootHubSymbolicName(PVOID BusContext,
|
||||||
|
PVOID HubSymNameBuffer,
|
||||||
|
ULONG HubSymNameBufferLength,
|
||||||
|
PULONG HubSymNameActualLength);
|
||||||
|
|
||||||
|
PVOID
|
||||||
|
USB_BUSIFFN
|
||||||
|
GetDeviceBusContext(PVOID HubBusContext, PVOID DeviceHandle);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
Initialize20Hub(PVOID BusContext, PUSB_DEVICE_HANDLE HubDeviceHandle, ULONG TtCount);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
RootHubInitNotification(PVOID BusContext, PVOID CallbackContext, PRH_INIT_CALLBACK CallbackRoutine);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
USB_BUSIFFN
|
||||||
|
FlushTransfers(PVOID BusContext, PVOID DeviceHandle);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
USB_BUSIFFN
|
||||||
|
SetDeviceHandleData(PVOID BusContext, PVOID DeviceHandle, PDEVICE_OBJECT UsbDevicePdo);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
GetUSBDIVersion(PVOID BusContext, PUSBD_VERSION_INFORMATION VersionInformation, PULONG HcdCapabilites);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
QueryBusTime(PVOID BusContext, PULONG CurrentFrame);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
SubmitIsoOutUrb(PVOID BusContext, PURB Urb);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
QueryBusInformation(PVOID BusContext,
|
||||||
|
ULONG Level,
|
||||||
|
PVOID BusInformationBuffer,
|
||||||
|
PULONG BusInformationBufferLength,
|
||||||
|
PULONG BusInformationActualLength);
|
||||||
|
|
||||||
|
BOOLEAN
|
||||||
|
USB_BUSIFFN
|
||||||
|
IsDeviceHighSpeed(PVOID BusCOntext);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
USB_BUSIFFN
|
||||||
|
EnumLogEntry(PVOID BusContext, ULONG DriverTag, ULONG EnumTag, ULONG P1, ULONG P2);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue