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
;
137 UsbhubPdoQueryDeviceText(
138 IN PDEVICE_OBJECT DeviceObject
,
140 OUT ULONG_PTR
* Information
)
142 PHUB_DEVICE_EXTENSION DeviceExtension
;
143 DEVICE_TEXT_TYPE DeviceTextType
;
146 DeviceTextType
= IoGetCurrentIrpStackLocation(Irp
)->Parameters
.QueryDeviceText
.DeviceTextType
;
147 LocaleId
= IoGetCurrentIrpStackLocation(Irp
)->Parameters
.QueryDeviceText
.LocaleId
;
148 DeviceExtension
= (PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
150 switch (DeviceTextType
)
152 /*case DeviceTextDescription:
154 DPRINT1("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_TEXT / DeviceTextDescription\n");
155 return STATUS_NOT_IMPLEMENTED;
157 case DeviceTextLocationInformation
:
164 DPRINT("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_TEXT / DeviceTextLocationInformation\n");
165 if (!DeviceExtension
->dev
->descriptor
.iProduct
)
166 return STATUS_NOT_SUPPORTED
;
168 ret
= usb_get_string(DeviceExtension
->dev
, LocaleId
, DeviceExtension
->dev
->descriptor
.iProduct
, &size
, sizeof(size
));
171 DPRINT("Usbhub: usb_get_string() failed with error %d\n", ret
);
172 return STATUS_IO_DEVICE_ERROR
;
175 buf
= ExAllocatePool(PagedPool
, size
);
178 DPRINT("Usbhub: ExAllocatePool() failed\n");
179 return STATUS_INSUFFICIENT_RESOURCES
;
181 ret
= usb_get_string(DeviceExtension
->dev
, LocaleId
, DeviceExtension
->dev
->descriptor
.iProduct
, buf
, size
);
184 DPRINT("Usbhub: usb_get_string() failed with error %d\n", ret
);
186 return STATUS_IO_DEVICE_ERROR
;
188 bufret
= ExAllocatePool(PagedPool
, size
- 2 /* size of length identifier */ + 2 /* final NULL */);
191 DPRINT("Usbhub: ExAllocatePool() failed\n");
193 return STATUS_INSUFFICIENT_RESOURCES
;
196 RtlCopyMemory(bufret
, &buf
[1], size
- 2);
197 bufret
[(size
- 1) / sizeof(WCHAR
)] = 0;
198 *Information
= (ULONG_PTR
)bufret
;
200 return STATUS_SUCCESS
;
203 DPRINT1("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_TEXT / unknown device text type 0x%lx\n", DeviceTextType
);
204 return STATUS_NOT_SUPPORTED
;
210 IN PDEVICE_OBJECT DeviceObject
,
214 PIO_STACK_LOCATION Stack
;
215 ULONG_PTR Information
= 0;
218 Stack
= IoGetCurrentIrpStackLocation(Irp
);
219 MinorFunction
= Stack
->MinorFunction
;
221 switch (MinorFunction
)
223 case IRP_MN_START_DEVICE
: /* 0x0 */
225 DPRINT("Usbhub: IRP_MJ_PNP / IRP_MN_START_DEVICE\n");
226 Status
= UsbhubPdoStartDevice(DeviceObject
, Irp
);
229 case IRP_MN_QUERY_CAPABILITIES
: /* 0x09 */
231 PDEVICE_CAPABILITIES DeviceCapabilities
;
233 DPRINT("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_CAPABILITIES\n");
235 DeviceCapabilities
= (PDEVICE_CAPABILITIES
)Stack
->Parameters
.DeviceCapabilities
.Capabilities
;
236 /* FIXME: capabilities can change with connected device */
237 DeviceCapabilities
->LockSupported
= TRUE
;
238 DeviceCapabilities
->EjectSupported
= FALSE
;
239 DeviceCapabilities
->Removable
= FALSE
;
240 DeviceCapabilities
->DockDevice
= FALSE
;
241 DeviceCapabilities
->UniqueID
= FALSE
;
242 DeviceCapabilities
->SilentInstall
= TRUE
;
243 DeviceCapabilities
->RawDeviceOK
= FALSE
;
244 DeviceCapabilities
->SurpriseRemovalOK
= FALSE
;
245 DeviceCapabilities
->HardwareDisabled
= FALSE
; /* FIXME */
246 //DeviceCapabilities->NoDisplayInUI = FALSE; /* FIXME */
247 DeviceCapabilities
->DeviceState
[0] = PowerDeviceD0
; /* FIXME */
248 for (i
= 0; i
< PowerSystemMaximum
; i
++)
249 DeviceCapabilities
->DeviceState
[i
] = PowerDeviceD3
; /* FIXME */
250 //DeviceCapabilities->DeviceWake = PowerDeviceUndefined; /* FIXME */
251 DeviceCapabilities
->D1Latency
= 0; /* FIXME */
252 DeviceCapabilities
->D2Latency
= 0; /* FIXME */
253 DeviceCapabilities
->D3Latency
= 0; /* FIXME */
254 Status
= STATUS_SUCCESS
;
257 case IRP_MN_QUERY_RESOURCES
: /* 0x0a */
259 PCM_RESOURCE_LIST ResourceList
;
261 DPRINT("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_RESOURCES\n");
262 ResourceList
= ExAllocatePool(PagedPool
, sizeof(CM_RESOURCE_LIST
));
265 DPRINT("Usbhub: ExAllocatePool() failed\n");
266 Status
= STATUS_INSUFFICIENT_RESOURCES
;
270 ResourceList
->Count
= 0;
271 Information
= (ULONG_PTR
)ResourceList
;
272 Status
= STATUS_SUCCESS
;
276 case IRP_MN_QUERY_RESOURCE_REQUIREMENTS
: /* 0x0b */
278 PIO_RESOURCE_REQUIREMENTS_LIST ResourceList
;
280 DPRINT("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n");
281 ResourceList
= ExAllocatePool(PagedPool
, sizeof(IO_RESOURCE_REQUIREMENTS_LIST
));
284 DPRINT("Usbhub: ExAllocatePool() failed\n");
285 Status
= STATUS_INSUFFICIENT_RESOURCES
;
289 RtlZeroMemory(ResourceList
, sizeof(IO_RESOURCE_REQUIREMENTS_LIST
));
290 ResourceList
->ListSize
= sizeof(IO_RESOURCE_REQUIREMENTS_LIST
);
291 ResourceList
->AlternativeLists
= 1;
292 ResourceList
->List
->Version
= 1;
293 ResourceList
->List
->Revision
= 1;
294 ResourceList
->List
->Count
= 0;
295 Information
= (ULONG_PTR
)ResourceList
;
296 Status
= STATUS_SUCCESS
;
300 case IRP_MN_QUERY_DEVICE_TEXT
: /* 0x0c */
302 Status
= UsbhubPdoQueryDeviceText(DeviceObject
, Irp
, &Information
);
305 case IRP_MN_QUERY_ID
: /* 0x13 */
307 Status
= UsbhubPdoQueryId(DeviceObject
, Irp
, &Information
);
312 /* We can't forward request to the lower driver, because
313 * we are a Pdo, so we don't have lower driver...
315 DPRINT1("Usbhub: IRP_MJ_PNP / unknown minor function 0x%lx\n", MinorFunction
);
316 Information
= Irp
->IoStatus
.Information
;
317 Status
= Irp
->IoStatus
.Status
;
321 Irp
->IoStatus
.Information
= Information
;
322 Irp
->IoStatus
.Status
= Status
;
323 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);