2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: USB hub driver
4 * FILE: drivers/usb/cromwell/hub/pdo.c
5 * PURPOSE: IRP_MJ_PNP operations for PDOs
7 * PROGRAMMERS: Hervé Poussineau (hpoussin@reactos.com)
14 #define IO_METHOD_FROM_CTL_CODE(ctlCode) (ctlCode&0x00000003)
17 UsbhubDeviceControlPdo(
18 IN PDEVICE_OBJECT DeviceObject
,
21 PIO_STACK_LOCATION Stack
;
22 ULONG_PTR Information
= 0;
25 DPRINT("Usbhub: UsbhubDeviceControlPdo() called\n");
27 Stack
= IoGetCurrentIrpStackLocation(Irp
);
28 Status
= Irp
->IoStatus
.Status
;
30 switch (Stack
->Parameters
.DeviceIoControl
.IoControlCode
)
34 DPRINT1("Usbhub: Unknown IOCTL code 0x%lx\n", Stack
->Parameters
.DeviceIoControl
.IoControlCode
);
35 Information
= Irp
->IoStatus
.Information
;
36 Status
= Irp
->IoStatus
.Status
;
40 Irp
->IoStatus
.Information
= Information
;
41 Irp
->IoStatus
.Status
= Status
;
42 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
48 IN PDEVICE_OBJECT DeviceObject
,
51 PHUB_DEVICE_EXTENSION DeviceExtension
;
54 DeviceExtension
= (PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
57 /* Register and activate device interface */
58 Status
= IoRegisterDeviceInterface(
60 DeviceExtension
->dev
->descriptor
.bDeviceClass
== USB_CLASS_HUB
?
61 &GUID_DEVINTERFACE_USB_HUB
:
62 &GUID_DEVINTERFACE_USB_DEVICE
,
63 NULL
, /* Reference string */
64 &DeviceExtension
->SymbolicLinkName
);
65 if (!NT_SUCCESS(Status
))
67 DPRINT("Usbhub: IoRegisterDeviceInterface() failed with status 0x%08lx\n", Status
);
71 Status
= IoSetDeviceInterfaceState(&DeviceExtension
->SymbolicLinkName
, TRUE
);
72 if (!NT_SUCCESS(Status
))
74 DPRINT("Usbhub: IoSetDeviceInterfaceState() failed with status 0x%08lx\n", Status
);
78 return STATUS_SUCCESS
;
83 IN PDEVICE_OBJECT DeviceObject
,
85 OUT ULONG_PTR
* Information
)
87 PHUB_DEVICE_EXTENSION DeviceExtension
;
89 PUNICODE_STRING SourceString
;
90 UNICODE_STRING String
;
93 IdType
= IoGetCurrentIrpStackLocation(Irp
)->Parameters
.QueryId
.IdType
;
94 DeviceExtension
= (PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
95 RtlInitUnicodeString(&String
, NULL
);
99 case BusQueryDeviceID
:
101 DPRINT("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryDeviceID\n");
102 SourceString
= &DeviceExtension
->DeviceId
;
105 case BusQueryHardwareIDs
:
107 DPRINT("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryHardwareIDs\n");
108 SourceString
= &DeviceExtension
->HardwareIds
;
111 case BusQueryCompatibleIDs
:
113 DPRINT("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryCompatibleIDs\n");
114 SourceString
= &DeviceExtension
->CompatibleIds
;
117 case BusQueryInstanceID
:
119 DPRINT("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryInstanceID\n");
120 SourceString
= &DeviceExtension
->InstanceId
;
124 DPRINT1("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_ID / unknown query id type 0x%lx\n", IdType
);
125 return STATUS_NOT_SUPPORTED
;
128 Status
= UsbhubDuplicateUnicodeString(
132 *Information
= (ULONG_PTR
)String
.Buffer
;
138 IN PDEVICE_OBJECT DeviceObject
,
142 PIO_STACK_LOCATION Stack
;
143 ULONG_PTR Information
= 0;
146 Stack
= IoGetCurrentIrpStackLocation(Irp
);
147 MinorFunction
= Stack
->MinorFunction
;
149 switch (MinorFunction
)
151 case IRP_MN_START_DEVICE
: /* 0x0 */
153 DPRINT("Usbhub: IRP_MJ_PNP / IRP_MN_START_DEVICE\n");
154 Status
= UsbhubPdoStartDevice(DeviceObject
, Irp
);
157 case IRP_MN_QUERY_ID
: /* 0x13 */
159 Status
= UsbhubPdoQueryId(DeviceObject
, Irp
, &Information
);
164 /* We can't forward request to the lower driver, because
165 * we are a Pdo, so we don't have lower driver...
167 DPRINT1("Usbhub: IRP_MJ_PNP / unknown minor function 0x%lx\n", MinorFunction
);
168 Information
= Irp
->IoStatus
.Information
;
169 Status
= Irp
->IoStatus
.Status
;
173 Irp
->IoStatus
.Information
= Information
;
174 Irp
->IoStatus
.Status
= Status
;
175 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);