Implement IRP_MN_QUERY_CAPABILITIES, IRP_MN_QUERY_RESOURCES, IRP_MN_QUERY_RESOURCE_REQUIREMENTS, IRP_MN_QUERY_DEVICE_TEXT for USB devices

Fix DeviceID and HardwareIDs identifiers returned for root hub (Vendor and Product IDs are still not initialized by Cromwell code)
Fix handling of removal IRPs for USB controller

svn path=/trunk/; revision=17930
This commit is contained in:
Hervé Poussineau 2005-09-19 10:04:07 +00:00
parent 243b1fc88f
commit 0558c3abc5
6 changed files with 174 additions and 22 deletions

View file

@ -630,6 +630,7 @@ HKLM,"SYSTEM\CurrentControlSet\Services\usbhub","Tag",0x00010001,0x00000011
HKLM,"SYSTEM\CurrentControlSet\Services\usbhub","DisplayName",0x00000000,"ReactOS USB HUB cromwell-type driver" HKLM,"SYSTEM\CurrentControlSet\Services\usbhub","DisplayName",0x00000000,"ReactOS USB HUB cromwell-type driver"
;hard coded values ;hard coded values
HKLM,"SYSTEM\CurrentControlSet\Enum\USB\ROOT_HUB\0000","Service",0x0000000,"usbhub" HKLM,"SYSTEM\CurrentControlSet\Enum\USB\ROOT_HUB\0000","Service",0x0000000,"usbhub"
HKLM,"SYSTEM\CurrentControlSet\Enum\USB\ROOT_HUB20\0000","Service",0x0000000,"usbhub"
; ReactOS PCNet NIC driver ; ReactOS PCNet NIC driver
; To use the AMD supplied driver change the driver name to pcntn5m.sys ; To use the AMD supplied driver change the driver name to pcntn5m.sys

View file

@ -190,7 +190,7 @@ UsbMpPnpFdo(
switch (MinorFunction) switch (MinorFunction)
{ {
case IRP_MN_START_DEVICE: case IRP_MN_START_DEVICE: /* 0x00 */
{ {
Status = ForwardIrpAndWait(DeviceObject, Irp); Status = ForwardIrpAndWait(DeviceObject, Irp);
if (NT_SUCCESS(Status) && NT_SUCCESS(Irp->IoStatus.Status)) if (NT_SUCCESS(Status) && NT_SUCCESS(Irp->IoStatus.Status))
@ -198,12 +198,15 @@ UsbMpPnpFdo(
break; break;
} }
case IRP_MN_REMOVE_DEVICE: case IRP_MN_QUERY_REMOVE_DEVICE: /* 0x01 */
case IRP_MN_QUERY_REMOVE_DEVICE: case IRP_MN_CANCEL_REMOVE_DEVICE: /* 0x03 */
case IRP_MN_CANCEL_REMOVE_DEVICE: {
case IRP_MN_SURPRISE_REMOVAL: return ForwardIrpAndForget(DeviceObject, Irp);
}
case IRP_MN_STOP_DEVICE: case IRP_MN_REMOVE_DEVICE: /* 0x02 */
case IRP_MN_STOP_DEVICE: /* 0x04 */
case IRP_MN_SURPRISE_REMOVAL: /* 0x17 */
{ {
Status = ForwardIrpAndWait(DeviceObject, Irp); Status = ForwardIrpAndWait(DeviceObject, Irp);
if (NT_SUCCESS(Status) && NT_SUCCESS(Irp->IoStatus.Status)) if (NT_SUCCESS(Status) && NT_SUCCESS(Irp->IoStatus.Status))
@ -211,8 +214,9 @@ UsbMpPnpFdo(
IoDeleteDevice(DeviceObject); // just delete device for now IoDeleteDevice(DeviceObject); // just delete device for now
break; break;
} }
case IRP_MN_QUERY_STOP_DEVICE:
case IRP_MN_CANCEL_STOP_DEVICE: case IRP_MN_QUERY_STOP_DEVICE: /* 0x05 */
case IRP_MN_CANCEL_STOP_DEVICE: /* 0x06 */
{ {
Status = STATUS_SUCCESS; Status = STATUS_SUCCESS;
break; break;
@ -244,7 +248,7 @@ UsbMpPnpFdo(
default: default:
{ {
DPRINT1("USBMP: unknown minor function 0x%lx\n", MinorFunction); DPRINT1("USBMP: IRP_MJ_PNP / unknown minor function 0x%lx\n", MinorFunction);
return ForwardIrpAndForget(DeviceObject, Irp); return ForwardIrpAndForget(DeviceObject, Irp);
} }
} }

View file

@ -80,36 +80,49 @@ UsbMpPdoQueryId(
ULONG IdType; ULONG IdType;
UNICODE_STRING SourceString; UNICODE_STRING SourceString;
UNICODE_STRING String; UNICODE_STRING String;
struct usb_device *roothub;
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
IdType = IoGetCurrentIrpStackLocation(Irp)->Parameters.QueryId.IdType; IdType = IoGetCurrentIrpStackLocation(Irp)->Parameters.QueryId.IdType;
DeviceExtension = (PUSBMP_DEVICE_EXTENSION)DeviceObject->DeviceExtension; DeviceExtension = (PUSBMP_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
RtlInitUnicodeString(&String, NULL); RtlInitUnicodeString(&String, NULL);
DeviceExtension = (PUSBMP_DEVICE_EXTENSION)DeviceExtension->FunctionalDeviceObject->DeviceExtension;
roothub = ((struct usb_hcd*)DeviceExtension->pdev->data)->self.root_hub;
switch (IdType) switch (IdType)
{ {
case BusQueryDeviceID: case BusQueryDeviceID:
{ {
DPRINT("USBMP: IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryDeviceID\n"); DPRINT("USBMP: IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryDeviceID\n");
RtlInitUnicodeString(&SourceString, L"USB\\ROOT_HUB"); if (roothub->speed == USB_SPEED_LOW || roothub->speed == USB_SPEED_FULL)
RtlInitUnicodeString(&SourceString, L"USB\\ROOT_HUB"); /* USB 1.1 */
else
RtlInitUnicodeString(&SourceString, L"USB\\ROOT_HUB20"); /* USB 2.0 */
break; break;
} }
case BusQueryHardwareIDs: case BusQueryHardwareIDs:
{ {
//CHAR Buffer[2][40]; CHAR Buffer[2][40];
PCHAR RootHubName;
USHORT Vendor, Product, Revision;
DPRINT("USBMP: IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryHardwareIDs\n"); DPRINT("USBMP: IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryHardwareIDs\n");
/*FIXME: sprintf(Buffer[0], "USB\\VID%04X&PID%04X&REV%04X", Vendor = DeviceExtension->pdev->vendor;
VENDOR, Product = DeviceExtension->pdev->device;
PRODUCT, Revision = 0; /* FIXME */
REV);
sprintf(Buffer[0], "USB\\VID%04X&PID%04X&REV%04X",
Vendor, Product, Revision);
sprintf(Buffer[1], "USB\\VID%04X&PID%04X", sprintf(Buffer[1], "USB\\VID%04X&PID%04X",
VENDOR, Vendor, Product);
PRODUCT); if (roothub->speed == USB_SPEED_LOW || roothub->speed == USB_SPEED_FULL)
RootHubName = "USB\\ROOT_HUB"; /* USB 1.1 */
else
RootHubName = "USB\\ROOT_HUB20"; /* USB 2.0 */
Status = UsbMpInitMultiSzString( Status = UsbMpInitMultiSzString(
&SourceString, &SourceString,
Buffer[0], Buffer[1], "USB\\ROOT_HUB", NULL);*/ Buffer[0], Buffer[1], RootHubName, NULL);
Status = UsbMpInitMultiSzString(&SourceString, "USB\\ROOT_HUB", NULL);
break; break;
} }
case BusQueryCompatibleIDs: case BusQueryCompatibleIDs:

View file

@ -133,6 +133,61 @@ UsbhubPdoQueryId(
return Status; return Status;
} }
static NTSTATUS
UsbhubPdoQueryDeviceText(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
OUT ULONG_PTR* Information)
{
PHUB_DEVICE_EXTENSION DeviceExtension;
DEVICE_TEXT_TYPE DeviceTextType;
LCID LocaleId;
DeviceTextType = IoGetCurrentIrpStackLocation(Irp)->Parameters.QueryDeviceText.DeviceTextType;
LocaleId = IoGetCurrentIrpStackLocation(Irp)->Parameters.QueryDeviceText.LocaleId;
DeviceExtension = (PHUB_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
switch (DeviceTextType)
{
/*case DeviceTextDescription:
{
DPRINT1("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_TEXT / DeviceTextDescription\n");
return STATUS_NOT_IMPLEMENTED;
}*/
case DeviceTextLocationInformation:
{
int size;
char *buf;
DPRINT("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_TEXT / DeviceTextLocationInformation\n");
if (!DeviceExtension->dev->descriptor.iProduct)
return STATUS_NOT_SUPPORTED;
size = usb_get_string(DeviceExtension->dev, LocaleId, DeviceExtension->dev->descriptor.iProduct, NULL, 0);
if (size < 2)
{
DPRINT("Usbhub: usb_get_string() failed\n");
return STATUS_IO_DEVICE_ERROR;
}
buf = ExAllocatePool(PagedPool, size);
if (buf == NULL)
return STATUS_INSUFFICIENT_RESOURCES;
size = usb_get_string(DeviceExtension->dev, LocaleId, DeviceExtension->dev->descriptor.iProduct, buf, size);
if (size < 0)
{
DPRINT("Usbhub: usb_get_string() failed\n");
ExFreePool(buf);
return STATUS_IO_DEVICE_ERROR;
}
*Information = (ULONG_PTR)buf;
return STATUS_SUCCESS;
}
default:
DPRINT1("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_TEXT / unknown device text type 0x%lx\n", DeviceTextType);
return STATUS_NOT_SUPPORTED;
}
}
NTSTATUS STDCALL NTSTATUS STDCALL
UsbhubPnpPdo( UsbhubPnpPdo(
IN PDEVICE_OBJECT DeviceObject, IN PDEVICE_OBJECT DeviceObject,
@ -154,6 +209,82 @@ UsbhubPnpPdo(
Status = UsbhubPdoStartDevice(DeviceObject, Irp); Status = UsbhubPdoStartDevice(DeviceObject, Irp);
break; break;
} }
case IRP_MN_QUERY_CAPABILITIES: /* 0x09 */
{
PDEVICE_CAPABILITIES DeviceCapabilities;
ULONG i;
DPRINT("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_CAPABILITIES\n");
DeviceCapabilities = (PDEVICE_CAPABILITIES)Stack->Parameters.DeviceCapabilities.Capabilities;
/* FIXME: capabilities can change with connected device */
DeviceCapabilities->LockSupported = TRUE;
DeviceCapabilities->EjectSupported = FALSE;
DeviceCapabilities->Removable = FALSE;
DeviceCapabilities->DockDevice = FALSE;
DeviceCapabilities->UniqueID = FALSE;
DeviceCapabilities->SilentInstall = TRUE;
DeviceCapabilities->RawDeviceOK = FALSE;
DeviceCapabilities->SurpriseRemovalOK = FALSE;
DeviceCapabilities->HardwareDisabled = FALSE; /* FIXME */
//DeviceCapabilities->NoDisplayInUI = FALSE; /* FIXME */
DeviceCapabilities->DeviceState[0] = PowerDeviceD0; /* FIXME */
for (i = 0; i < PowerSystemMaximum; i++)
DeviceCapabilities->DeviceState[i] = PowerDeviceD3; /* FIXME */
//DeviceCapabilities->DeviceWake = PowerDeviceUndefined; /* FIXME */
DeviceCapabilities->D1Latency = 0; /* FIXME */
DeviceCapabilities->D2Latency = 0; /* FIXME */
DeviceCapabilities->D3Latency = 0; /* FIXME */
Status = STATUS_SUCCESS;
break;
}
case IRP_MN_QUERY_RESOURCES: /* 0x0a */
{
PCM_RESOURCE_LIST ResourceList;
DPRINT("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_RESOURCES\n");
ResourceList = ExAllocatePool(PagedPool, sizeof(CM_RESOURCE_LIST));
if (!ResourceList)
{
DPRINT("Usbhub: ExAllocatePool() failed\n");
Status = STATUS_INSUFFICIENT_RESOURCES;
}
else
{
ResourceList->Count = 0;
Information = (ULONG_PTR)ResourceList;
Status = STATUS_SUCCESS;
}
break;
}
case IRP_MN_QUERY_RESOURCE_REQUIREMENTS: /* 0x0b */
{
PIO_RESOURCE_REQUIREMENTS_LIST ResourceList;
DPRINT("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n");
ResourceList = ExAllocatePool(PagedPool, sizeof(IO_RESOURCE_REQUIREMENTS_LIST));
if (!ResourceList)
{
DPRINT("Usbhub: ExAllocatePool() failed\n");
Status = STATUS_INSUFFICIENT_RESOURCES;
}
else
{
RtlZeroMemory(ResourceList, sizeof(IO_RESOURCE_REQUIREMENTS_LIST));
ResourceList->ListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST);
ResourceList->AlternativeLists = 1;
ResourceList->List->Version = 1;
ResourceList->List->Revision = 1;
ResourceList->List->Count = 0;
Information = (ULONG_PTR)ResourceList;
Status = STATUS_SUCCESS;
}
break;
}
case IRP_MN_QUERY_DEVICE_TEXT: /* 0x0c */
{
Status = UsbhubPdoQueryDeviceText(DeviceObject, Irp, &Information);
break;
}
case IRP_MN_QUERY_ID: /* 0x13 */ case IRP_MN_QUERY_ID: /* 0x13 */
{ {
Status = UsbhubPdoQueryId(DeviceObject, Irp, &Information); Status = UsbhubPdoQueryId(DeviceObject, Irp, &Information);

View file

@ -7,6 +7,7 @@ usb_exit@0
usb_init_urb@4 usb_init_urb@4
usb_alloc_urb@8 usb_alloc_urb@8
usb_free_urb@4 usb_free_urb@4
usb_get_string
usb_get_urb@4 usb_get_urb@4
usb_get_dev@4 usb_get_dev@4
usb_submit_urb@8 usb_submit_urb@8

View file

@ -31,6 +31,7 @@ HKR, , NoInstallClass, 0, 1
%PCI\CC_0C0310.DeviceDesc%=OHCI_Inst,PCI\CC_0C0310 %PCI\CC_0C0310.DeviceDesc%=OHCI_Inst,PCI\CC_0C0310
%PCI\CC_0C0320.DeviceDesc%=EHCI_Inst,PCI\CC_0C0320 %PCI\CC_0C0320.DeviceDesc%=EHCI_Inst,PCI\CC_0C0320
%USB\ROOT_HUB.DeviceDesc%=RootHub_Inst,USB\ROOT_HUB %USB\ROOT_HUB.DeviceDesc%=RootHub_Inst,USB\ROOT_HUB
%USB\ROOT_HUB.DeviceDesc%=RootHub_Inst,USB\ROOT_HUB20
[IntelMfg] [IntelMfg]
%PCI\VEN_8086&DEV_7112&CC_0C0300.DeviceDesc%=UHCI_Inst,PCI\VEN_8086&DEV_7112&CC_0C0300 %PCI\VEN_8086&DEV_7112&CC_0C0300.DeviceDesc%=UHCI_Inst,PCI\VEN_8086&DEV_7112&CC_0C0300
@ -41,7 +42,7 @@ HKR, , NoInstallClass, 0, 1
CopyFiles = UHCI_CopyFiles CopyFiles = UHCI_CopyFiles
[UHCI_CopyFiles.NT] [UHCI_CopyFiles.NT]
usbcore.sys usbport.sys
usbuhci.sys usbuhci.sys
[UHCI_Inst.NT.Services] [UHCI_Inst.NT.Services]
@ -60,7 +61,7 @@ LoadOrderGroup = Base
CopyFiles = OHCI_CopyFiles CopyFiles = OHCI_CopyFiles
[OHCI_CopyFiles.NT] [OHCI_CopyFiles.NT]
usbcore.sys usbport.sys
usbohci.sys usbohci.sys
[OHCI_Inst.NT.Services] [OHCI_Inst.NT.Services]
@ -79,7 +80,7 @@ LoadOrderGroup = Base
CopyFiles = EHCI_CopyFiles CopyFiles = EHCI_CopyFiles
[EHCI_CopyFiles.NT] [EHCI_CopyFiles.NT]
usbcore.sys usbport.sys
usbehci.sys usbehci.sys
[EHCI_Inst.NT.Services] [EHCI_Inst.NT.Services]
@ -98,6 +99,7 @@ LoadOrderGroup = Base
CopyFiles = RootHub_CopyFiles CopyFiles = RootHub_CopyFiles
[RootHub_CopyFiles.NT] [RootHub_CopyFiles.NT]
usbport.sys
usbhub.sys usbhub.sys
[RootHub_Inst.NT.Services] [RootHub_Inst.NT.Services]