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: Copyright 2005-2006 Hervé Poussineau (hpoussin@reactos.org)
14 #define IO_METHOD_FROM_CTL_CODE(ctlCode) (ctlCode&0x00000003)
17 UsbhubInternalDeviceControlPdo(
18 IN PDEVICE_OBJECT DeviceObject
,
21 PIO_STACK_LOCATION Stack
;
22 ULONG_PTR Information
= 0;
25 DPRINT("Usbhub: UsbhubInternalDeviceControlPdo() called\n");
27 Stack
= IoGetCurrentIrpStackLocation(Irp
);
28 Status
= Irp
->IoStatus
.Status
;
30 switch (Stack
->Parameters
.DeviceIoControl
.IoControlCode
)
32 case IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO
:
34 PHUB_DEVICE_EXTENSION DeviceExtension
;
36 DPRINT("Usbhub: IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO\n");
37 if (Irp
->AssociatedIrp
.SystemBuffer
== NULL
38 || Stack
->Parameters
.DeviceIoControl
.OutputBufferLength
!= sizeof(PVOID
))
40 Status
= STATUS_INVALID_PARAMETER
;
45 DeviceExtension
= (PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
47 pHubPointer
= (PVOID
*)Irp
->AssociatedIrp
.SystemBuffer
;
48 *pHubPointer
= DeviceExtension
->dev
;
49 Information
= sizeof(PVOID
);
50 Status
= STATUS_SUCCESS
;
56 DPRINT1("Usbhub: Unknown IOCTL code 0x%lx\n", Stack
->Parameters
.DeviceIoControl
.IoControlCode
);
57 Information
= Irp
->IoStatus
.Information
;
58 Status
= Irp
->IoStatus
.Status
;
62 Irp
->IoStatus
.Information
= Information
;
63 Irp
->IoStatus
.Status
= Status
;
64 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
70 IN PDEVICE_OBJECT DeviceObject
,
73 PHUB_DEVICE_EXTENSION DeviceExtension
;
76 DeviceExtension
= (PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
78 /* Register and activate device interface */
79 Status
= IoRegisterDeviceInterface(
81 DeviceExtension
->dev
->descriptor
.bDeviceClass
== USB_CLASS_HUB
?
82 &GUID_DEVINTERFACE_USB_HUB
:
83 &GUID_DEVINTERFACE_USB_DEVICE
,
84 NULL
, /* Reference string */
85 &DeviceExtension
->SymbolicLinkName
);
86 if (!NT_SUCCESS(Status
))
88 DPRINT("Usbhub: IoRegisterDeviceInterface() failed with status 0x%08lx\n", Status
);
92 Status
= IoSetDeviceInterfaceState(&DeviceExtension
->SymbolicLinkName
, TRUE
);
93 if (!NT_SUCCESS(Status
))
95 DPRINT("Usbhub: IoSetDeviceInterfaceState() failed with status 0x%08lx\n", Status
);
99 return STATUS_SUCCESS
;
104 IN PDEVICE_OBJECT DeviceObject
,
106 OUT ULONG_PTR
* Information
)
108 PHUB_DEVICE_EXTENSION DeviceExtension
;
110 PUNICODE_STRING SourceString
;
111 UNICODE_STRING String
;
114 IdType
= IoGetCurrentIrpStackLocation(Irp
)->Parameters
.QueryId
.IdType
;
115 DeviceExtension
= (PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
116 RtlInitUnicodeString(&String
, NULL
);
120 case BusQueryDeviceID
:
122 DPRINT("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryDeviceID\n");
123 SourceString
= &DeviceExtension
->DeviceId
;
126 case BusQueryHardwareIDs
:
128 DPRINT("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryHardwareIDs\n");
129 SourceString
= &DeviceExtension
->HardwareIds
;
132 case BusQueryCompatibleIDs
:
134 DPRINT("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryCompatibleIDs\n");
135 SourceString
= &DeviceExtension
->CompatibleIds
;
138 case BusQueryInstanceID
:
140 DPRINT("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryInstanceID\n");
141 SourceString
= &DeviceExtension
->InstanceId
;
145 DPRINT1("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_ID / unknown query id type 0x%lx\n", IdType
);
146 return STATUS_NOT_SUPPORTED
;
149 Status
= UsbhubDuplicateUnicodeString(
153 *Information
= (ULONG_PTR
)String
.Buffer
;
158 UsbhubPdoQueryDeviceText(
159 IN PDEVICE_OBJECT DeviceObject
,
161 OUT ULONG_PTR
* Information
)
163 PHUB_DEVICE_EXTENSION DeviceExtension
;
164 DEVICE_TEXT_TYPE DeviceTextType
;
167 DeviceTextType
= IoGetCurrentIrpStackLocation(Irp
)->Parameters
.QueryDeviceText
.DeviceTextType
;
168 LocaleId
= IoGetCurrentIrpStackLocation(Irp
)->Parameters
.QueryDeviceText
.LocaleId
;
169 DeviceExtension
= (PHUB_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
171 switch (DeviceTextType
)
173 case DeviceTextDescription
:
174 case DeviceTextLocationInformation
:
181 if (DeviceTextType
== DeviceTextDescription
)
182 DPRINT("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_TEXT / DeviceTextDescription\n");
184 DPRINT("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_TEXT / DeviceTextLocationInformation\n");
186 if (!DeviceExtension
->dev
->descriptor
.iProduct
)
187 return STATUS_NOT_SUPPORTED
;
189 ret
= usb_get_string(DeviceExtension
->dev
, LocaleId
, DeviceExtension
->dev
->descriptor
.iProduct
, &size
, sizeof(size
));
192 DPRINT("Usbhub: usb_get_string() failed with error %d\n", ret
);
193 return STATUS_IO_DEVICE_ERROR
;
196 buf
= ExAllocatePool(PagedPool
, size
);
199 DPRINT("Usbhub: ExAllocatePool() failed\n");
200 return STATUS_INSUFFICIENT_RESOURCES
;
202 ret
= usb_get_string(DeviceExtension
->dev
, LocaleId
, DeviceExtension
->dev
->descriptor
.iProduct
, buf
, size
);
205 DPRINT("Usbhub: usb_get_string() failed with error %d\n", ret
);
207 return STATUS_IO_DEVICE_ERROR
;
209 bufret
= ExAllocatePool(PagedPool
, size
- 2 /* size of length identifier */ + 2 /* final NULL */);
212 DPRINT("Usbhub: ExAllocatePool() failed\n");
214 return STATUS_INSUFFICIENT_RESOURCES
;
217 RtlCopyMemory(bufret
, &buf
[1], size
- 2);
218 bufret
[(size
- 1) / sizeof(WCHAR
)] = 0;
219 *Information
= (ULONG_PTR
)bufret
;
221 return STATUS_SUCCESS
;
224 DPRINT1("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_TEXT / unknown device text type 0x%lx\n", DeviceTextType
);
225 return STATUS_NOT_SUPPORTED
;
231 IN PDEVICE_OBJECT DeviceObject
,
235 PIO_STACK_LOCATION Stack
;
236 ULONG_PTR Information
= 0;
239 Stack
= IoGetCurrentIrpStackLocation(Irp
);
240 MinorFunction
= Stack
->MinorFunction
;
242 switch (MinorFunction
)
244 case IRP_MN_START_DEVICE
: /* 0x0 */
246 DPRINT("Usbhub: IRP_MJ_PNP / IRP_MN_START_DEVICE\n");
247 Status
= UsbhubPdoStartDevice(DeviceObject
, Irp
);
250 case IRP_MN_QUERY_CAPABILITIES
: /* 0x09 */
252 PDEVICE_CAPABILITIES DeviceCapabilities
;
254 DPRINT("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_CAPABILITIES\n");
256 DeviceCapabilities
= (PDEVICE_CAPABILITIES
)Stack
->Parameters
.DeviceCapabilities
.Capabilities
;
257 /* FIXME: capabilities can change with connected device */
258 DeviceCapabilities
->LockSupported
= TRUE
;
259 DeviceCapabilities
->EjectSupported
= FALSE
;
260 DeviceCapabilities
->Removable
= FALSE
;
261 DeviceCapabilities
->DockDevice
= FALSE
;
262 DeviceCapabilities
->UniqueID
= FALSE
;
263 DeviceCapabilities
->SilentInstall
= TRUE
;
264 DeviceCapabilities
->RawDeviceOK
= FALSE
;
265 DeviceCapabilities
->SurpriseRemovalOK
= FALSE
;
266 DeviceCapabilities
->HardwareDisabled
= FALSE
; /* FIXME */
267 //DeviceCapabilities->NoDisplayInUI = FALSE; /* FIXME */
268 DeviceCapabilities
->DeviceState
[0] = PowerDeviceD0
; /* FIXME */
269 for (i
= 0; i
< PowerSystemMaximum
; i
++)
270 DeviceCapabilities
->DeviceState
[i
] = PowerDeviceD3
; /* FIXME */
271 //DeviceCapabilities->DeviceWake = PowerDeviceUndefined; /* FIXME */
272 DeviceCapabilities
->D1Latency
= 0; /* FIXME */
273 DeviceCapabilities
->D2Latency
= 0; /* FIXME */
274 DeviceCapabilities
->D3Latency
= 0; /* FIXME */
275 Status
= STATUS_SUCCESS
;
278 case IRP_MN_QUERY_RESOURCES
: /* 0x0a */
280 PCM_RESOURCE_LIST ResourceList
;
282 DPRINT("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_RESOURCES\n");
283 ResourceList
= ExAllocatePool(PagedPool
, sizeof(CM_RESOURCE_LIST
));
286 DPRINT("Usbhub: ExAllocatePool() failed\n");
287 Status
= STATUS_INSUFFICIENT_RESOURCES
;
291 ResourceList
->Count
= 0;
292 Information
= (ULONG_PTR
)ResourceList
;
293 Status
= STATUS_SUCCESS
;
297 case IRP_MN_QUERY_RESOURCE_REQUIREMENTS
: /* 0x0b */
299 PIO_RESOURCE_REQUIREMENTS_LIST ResourceList
;
301 DPRINT("Usbhub: IRP_MJ_PNP / IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n");
302 ResourceList
= ExAllocatePool(PagedPool
, sizeof(IO_RESOURCE_REQUIREMENTS_LIST
));
305 DPRINT("Usbhub: ExAllocatePool() failed\n");
306 Status
= STATUS_INSUFFICIENT_RESOURCES
;
310 RtlZeroMemory(ResourceList
, sizeof(IO_RESOURCE_REQUIREMENTS_LIST
));
311 ResourceList
->ListSize
= sizeof(IO_RESOURCE_REQUIREMENTS_LIST
);
312 ResourceList
->AlternativeLists
= 1;
313 ResourceList
->List
->Version
= 1;
314 ResourceList
->List
->Revision
= 1;
315 ResourceList
->List
->Count
= 0;
316 Information
= (ULONG_PTR
)ResourceList
;
317 Status
= STATUS_SUCCESS
;
321 case IRP_MN_QUERY_DEVICE_TEXT
: /* 0x0c */
323 Status
= UsbhubPdoQueryDeviceText(DeviceObject
, Irp
, &Information
);
326 case IRP_MN_QUERY_ID
: /* 0x13 */
328 Status
= UsbhubPdoQueryId(DeviceObject
, Irp
, &Information
);
333 /* We can't forward request to the lower driver, because
334 * we are a Pdo, so we don't have lower driver...
336 DPRINT1("Usbhub: IRP_MJ_PNP / unknown minor function 0x%lx\n", MinorFunction
);
337 Information
= Irp
->IoStatus
.Information
;
338 Status
= Irp
->IoStatus
.Status
;
342 Irp
->IoStatus
.Information
= Information
;
343 Irp
->IoStatus
.Status
= Status
;
344 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);