1 /* $Id: pdo.c,v 1.5 2004/06/09 14:22:53 ekohl Exp $
3 * PROJECT: ReactOS PCI bus driver
5 * PURPOSE: Child device object dispatch routines
6 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
8 * 10-09-2001 CSH Created
11 #include <ddk/ntddk.h>
19 DEFINE_GUID(GUID_BUS_TYPE_PCI
, 0xc8ebdfb0L
, 0xb510, 0x11d0, 0x80, 0xe5, 0x00, 0xa0, 0xc9, 0x25, 0x42, 0xe3);
21 /*** PRIVATE *****************************************************************/
25 IN PDEVICE_OBJECT DeviceObject
,
27 PIO_STACK_LOCATION IrpSp
)
29 PPDO_DEVICE_EXTENSION DeviceExtension
;
30 UNICODE_STRING String
;
35 DeviceExtension
= (PPDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
37 // Irp->IoStatus.Information = 0;
39 Status
= STATUS_SUCCESS
;
41 RtlInitUnicodeString(&String
, NULL
);
43 switch (IrpSp
->Parameters
.QueryId
.IdType
) {
44 case BusQueryDeviceID
:
45 Status
= PciDuplicateUnicodeString(
47 &DeviceExtension
->DeviceID
,
50 DPRINT("DeviceID: %S\n", String
.Buffer
);
52 Irp
->IoStatus
.Information
= (ULONG_PTR
)String
.Buffer
;
55 case BusQueryHardwareIDs
:
56 Status
= PciDuplicateUnicodeString(
58 &DeviceExtension
->HardwareIDs
,
61 Irp
->IoStatus
.Information
= (ULONG_PTR
)String
.Buffer
;
64 case BusQueryCompatibleIDs
:
65 Status
= PciDuplicateUnicodeString(
67 &DeviceExtension
->CompatibleIDs
,
70 Irp
->IoStatus
.Information
= (ULONG_PTR
)String
.Buffer
;
73 case BusQueryInstanceID
:
74 Status
= PciDuplicateUnicodeString(
76 &DeviceExtension
->InstanceID
,
79 DPRINT("InstanceID: %S\n", String
.Buffer
);
81 Irp
->IoStatus
.Information
= (ULONG_PTR
)String
.Buffer
;
84 case BusQueryDeviceSerialNumber
:
86 Status
= STATUS_NOT_IMPLEMENTED
;
94 PdoQueryBusInformation(
95 IN PDEVICE_OBJECT DeviceObject
,
97 PIO_STACK_LOCATION IrpSp
)
99 PPDO_DEVICE_EXTENSION DeviceExtension
;
100 PFDO_DEVICE_EXTENSION FdoDeviceExtension
;
101 PPNP_BUS_INFORMATION BusInformation
;
105 DeviceExtension
= (PPDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
106 FdoDeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceExtension
->Fdo
->DeviceExtension
;
107 BusInformation
= ExAllocatePool(PagedPool
, sizeof(PNP_BUS_INFORMATION
));
108 Irp
->IoStatus
.Information
= (ULONG_PTR
)BusInformation
;
109 if (BusInformation
!= NULL
)
111 BusInformation
->BusTypeGuid
= GUID_BUS_TYPE_PCI
;
112 BusInformation
->LegacyBusType
= PCIBus
;
113 BusInformation
->BusNumber
= DeviceExtension
->BusNumber
;
115 return STATUS_SUCCESS
;
118 return STATUS_INSUFFICIENT_RESOURCES
;
123 PdoQueryCapabilities(
124 IN PDEVICE_OBJECT DeviceObject
,
126 PIO_STACK_LOCATION IrpSp
)
128 PPDO_DEVICE_EXTENSION DeviceExtension
;
129 PDEVICE_CAPABILITIES DeviceCapabilities
;
133 DeviceExtension
= (PPDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
134 DeviceCapabilities
= IrpSp
->Parameters
.DeviceCapabilities
.Capabilities
;
136 DeviceCapabilities
->Address
=
137 DeviceCapabilities
->UINumber
= DeviceExtension
->SlotNumber
.u
.AsULONG
;
139 return STATUS_SUCCESS
;
145 IN PDEVICE_OBJECT DeviceObject
,
147 PIO_STACK_LOCATION IrpSp
)
149 PPDO_DEVICE_EXTENSION DeviceExtension
;
154 DeviceExtension
= (PPDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
156 if (IrpSp
->Parameters
.Power
.Type
== DevicePowerState
) {
157 Status
= STATUS_SUCCESS
;
158 switch (IrpSp
->Parameters
.Power
.State
.SystemState
) {
160 Status
= STATUS_UNSUCCESSFUL
;
163 Status
= STATUS_UNSUCCESSFUL
;
170 /*** PUBLIC ******************************************************************/
174 PDEVICE_OBJECT DeviceObject
,
177 * FUNCTION: Handle Plug and Play IRPs for the child device
179 * DeviceObject = Pointer to physical device object of the child device
180 * Irp = Pointer to IRP that should be handled
185 PIO_STACK_LOCATION IrpSp
;
190 Status
= Irp
->IoStatus
.Status
;
192 IrpSp
= IoGetCurrentIrpStackLocation(Irp
);
194 switch (IrpSp
->MinorFunction
) {
196 case IRP_MN_CANCEL_REMOVE_DEVICE
:
199 case IRP_MN_CANCEL_STOP_DEVICE
:
202 case IRP_MN_DEVICE_USAGE_NOTIFICATION
:
209 case IRP_MN_QUERY_BUS_INFORMATION
:
210 Status
= PdoQueryBusInformation(DeviceObject
, Irp
, IrpSp
);
213 case IRP_MN_QUERY_CAPABILITIES
:
214 Status
= PdoQueryCapabilities(DeviceObject
, Irp
, IrpSp
);
218 case IRP_MN_QUERY_DEVICE_RELATIONS
:
219 /* FIXME: Possibly handle for RemovalRelations */
222 case IRP_MN_QUERY_DEVICE_TEXT
:
226 case IRP_MN_QUERY_ID
:
227 Status
= PdoQueryId(DeviceObject
, Irp
, IrpSp
);
231 case IRP_MN_QUERY_PNP_DEVICE_STATE
:
234 case IRP_MN_QUERY_REMOVE_DEVICE
:
237 case IRP_MN_QUERY_RESOURCE_REQUIREMENTS
:
240 case IRP_MN_QUERY_RESOURCES
:
243 case IRP_MN_QUERY_STOP_DEVICE
:
246 case IRP_MN_REMOVE_DEVICE
:
249 case IRP_MN_SET_LOCK
:
252 case IRP_MN_START_DEVICE
:
255 case IRP_MN_STOP_DEVICE
:
258 case IRP_MN_SURPRISE_REMOVAL
:
262 DPRINT("Unknown IOCTL 0x%X\n", IrpSp
->MinorFunction
);
266 if (Status
!= STATUS_PENDING
) {
267 Irp
->IoStatus
.Status
= Status
;
268 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
271 DPRINT("Leaving. Status 0x%X\n", Status
);
278 PDEVICE_OBJECT DeviceObject
,
281 * FUNCTION: Handle power management IRPs for the child device
283 * DeviceObject = Pointer to physical device object of the child device
284 * Irp = Pointer to IRP that should be handled
289 PIO_STACK_LOCATION IrpSp
;
294 IrpSp
= IoGetCurrentIrpStackLocation(Irp
);
296 switch (IrpSp
->MinorFunction
) {
297 case IRP_MN_SET_POWER
:
298 Status
= PdoSetPower(DeviceObject
, Irp
, IrpSp
);
302 DPRINT("Unknown IOCTL 0x%X\n", IrpSp
->MinorFunction
);
303 Status
= STATUS_NOT_IMPLEMENTED
;
307 if (Status
!= STATUS_PENDING
) {
308 Irp
->IoStatus
.Status
= Status
;
309 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
312 DPRINT("Leaving. Status 0x%X\n", Status
);