Implement IRP_MN_QUERY_CAPABILITIES, IRP_MN_QUERY_RESOURCES,
IRP_MN_QUERY_RESOURCE_REQUIREMENTS
Modified: trunk/reactos/drivers/usb/cromwell/uhci/pdo.c
_____
Modified: trunk/reactos/drivers/usb/cromwell/uhci/pdo.c
--- trunk/reactos/drivers/usb/cromwell/uhci/pdo.c 2005-06-17
17:22:44 UTC (rev 16000)
+++ trunk/reactos/drivers/usb/cromwell/uhci/pdo.c 2005-06-17
17:22:57 UTC (rev 16001)
@@ -168,10 +168,114 @@
{
case IRP_MN_START_DEVICE: /* 0x00 */
{
- DPRINT("UHCI:
IRP_MJ_PNP/IRP_MN_START_DEVICE\n");
+ DPRINT("UHCI: IRP_MJ_PNP /
IRP_MN_START_DEVICE\n");
Status = UhciPnpStartDevice(DeviceObject);
break;
}
+ case IRP_MN_QUERY_CAPABILITIES: /* 0x09 */
+ {
+ PDEVICE_CAPABILITIES DeviceCapabilities;
+ ULONG i;
+ DPRINT("UHCI: IRP_MJ_PNP /
IRP_MN_QUERY_CAPABILITIES\n");
+
+ DeviceCapabilities =
(PDEVICE_CAPABILITIES)Stack->Parameters.DeviceCapabilities.Capabilities;
+ /* FIXME: capabilities can change with connected
device */
+ DeviceCapabilities->LockSupported = FALSE;
+ DeviceCapabilities->EjectSupported = FALSE;
+ DeviceCapabilities->Removable = TRUE;
+ DeviceCapabilities->DockDevice = FALSE;
+ DeviceCapabilities->UniqueID = FALSE;
+ DeviceCapabilities->SilentInstall = FALSE;
+ DeviceCapabilities->RawDeviceOK = TRUE;
+ DeviceCapabilities->SurpriseRemovalOK = TRUE;
+ 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 */
+ {
+ DPRINT("UHCI: IRP_MJ_PNP /
IRP_MN_QUERY_RESOURCES\n");
+ /* Root buses don't need resources, except the
ones of
+ * the usb controller. This PDO is the root bus
PDO, so
+ * report no resource by not changing
Information and
+ * Status
+ */
+ Information = Irp->IoStatus.Information;
+ Status = Irp->IoStatus.Status;
+ break;
+ }
+ case IRP_MN_QUERY_RESOURCE_REQUIREMENTS: /* 0x0b */
+ {
+ DPRINT("UHCI: IRP_MJ_PNP /
IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n");
+ /* Root buses don't need resources, except the
ones of
+ * the usb controller. This PDO is the root bus
PDO, so
+ * report no resource by not changing
Information and
+ * Status
+ */
+ Information = Irp->IoStatus.Information;
+ Status = Irp->IoStatus.Status;
+ break;
+ }
+#if 0 /* FIXME */
+ case IRP_MN_QUERY_DEVICE_TEXT: /* 0x0c */
+ {
+ switch
(Stack->Parameters.QueryDeviceText.DeviceTextType)
+ {
+ case DeviceTextDescription:
+ {
+ ULONG DescriptionSize;
+ PWSTR Description;
+ DPRINT("UHCI: IRP_MJ_PNP /
IRP_MN_QUERY_DEVICE_TEXT / DeviceTextDescription\n");
+
+ Status = IoGetDeviceProperty(
+ DeviceObject,
+
DevicePropertyDeviceDescription,
+ 0, NULL,
+ &DescriptionSize);
+ if (Status ==
STATUS_BUFFER_TOO_SMALL)
+ {
+ Description =
ExAllocatePool(PagedPool, DescriptionSize);
+ if (!Description)
+ Status =
STATUS_INSUFFICIENT_RESOURCES;
+ else
+ {
+ Status =
IoGetDeviceProperty(
+
DeviceObject,
+
DevicePropertyDeviceDescription,
+
DescriptionSize, Description,
+
&DescriptionSize);
+ Information =
DescriptionSize;
+ }
+ }
+ break;
+ }
+ case DeviceTextLocationInformation:
+ {
+ /* We don't have any text
location to report,
+ * and this query is optional,
so ignore it.
+ */
+ Information =
Irp->IoStatus.Information;
+ Status = Irp->IoStatus.Status;
+ break;
+ }
+ default:
+ {
+ DPRINT1("UHCI: IRP_MJ_PNP /
IRP_MN_QUERY_DEVICE_TEXT / unknown type 0x%lx\n",
+
Stack->Parameters.QueryDeviceText.DeviceTextType);
+ Status = STATUS_NOT_SUPPORTED;
+ }
+ }
+ break;
+ }
+#endif
case IRP_MN_QUERY_ID: /* 0x13 */
{
Status = UhciPdoQueryId(DeviceObject, Irp,
&Information);