1 /* $Id: pdo.c,v 1.1 2001/09/16 13:18:24 chorns 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
15 /*** PRIVATE *****************************************************************/
19 IN PDEVICE_OBJECT DeviceObject
,
21 PIO_STACK_LOCATION IrpSp
)
23 PPDO_DEVICE_EXTENSION DeviceExtension
;
24 UNICODE_STRING String
;
29 DeviceExtension
= (PPDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
31 // Irp->IoStatus.Information = 0;
33 Status
= STATUS_SUCCESS
;
35 RtlInitUnicodeString(&String
, NULL
);
37 switch (IrpSp
->Parameters
.QueryId
.IdType
) {
38 case BusQueryDeviceID
:
39 Status
= PciCreateUnicodeString(
41 DeviceExtension
->DeviceID
.Buffer
,
44 DPRINT("DeviceID: %S\n", String
.Buffer
);
46 Irp
->IoStatus
.Information
= (ULONG_PTR
)String
.Buffer
;
49 case BusQueryHardwareIDs
:
50 case BusQueryCompatibleIDs
:
51 Status
= STATUS_NOT_IMPLEMENTED
;
54 case BusQueryInstanceID
:
55 Status
= PciCreateUnicodeString(
60 DPRINT("InstanceID: %S\n", String
.Buffer
);
62 Irp
->IoStatus
.Information
= (ULONG_PTR
)String
.Buffer
;
65 case BusQueryDeviceSerialNumber
:
67 Status
= STATUS_NOT_IMPLEMENTED
;
76 IN PDEVICE_OBJECT DeviceObject
,
78 PIO_STACK_LOCATION IrpSp
)
80 PPDO_DEVICE_EXTENSION DeviceExtension
;
85 DeviceExtension
= (PPDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
87 if (IrpSp
->Parameters
.Power
.Type
== DevicePowerState
) {
88 Status
= STATUS_SUCCESS
;
89 switch (IrpSp
->Parameters
.Power
.State
.SystemState
) {
91 Status
= STATUS_UNSUCCESSFUL
;
94 Status
= STATUS_UNSUCCESSFUL
;
101 /*** PUBLIC ******************************************************************/
105 PDEVICE_OBJECT DeviceObject
,
108 * FUNCTION: Handle Plug and Play IRPs for the child device
110 * DeviceObject = Pointer to physical device object of the child device
111 * Irp = Pointer to IRP that should be handled
116 PIO_STACK_LOCATION IrpSp
;
121 Status
= Irp
->IoStatus
.Status
;
123 IrpSp
= IoGetCurrentIrpStackLocation(Irp
);
125 switch (IrpSp
->MinorFunction
) {
127 case IRP_MN_CANCEL_REMOVE_DEVICE
:
130 case IRP_MN_CANCEL_STOP_DEVICE
:
133 case IRP_MN_DEVICE_USAGE_NOTIFICATION
:
139 case IRP_MN_QUERY_BUS_INFORMATION
:
142 case IRP_MN_QUERY_CAPABILITIES
:
145 case IRP_MN_QUERY_DEVICE_RELATIONS
:
146 /* FIXME: Possibly handle for RemovalRelations */
149 case IRP_MN_QUERY_DEVICE_TEXT
:
152 case IRP_MN_QUERY_ID
:
153 Status
= PdoQueryId(DeviceObject
, Irp
, IrpSp
);
156 case IRP_MN_QUERY_PNP_DEVICE_STATE
:
159 case IRP_MN_QUERY_REMOVE_DEVICE
:
162 case IRP_MN_QUERY_RESOURCE_REQUIREMENTS
:
165 case IRP_MN_QUERY_RESOURCES
:
168 case IRP_MN_QUERY_STOP_DEVICE
:
171 case IRP_MN_REMOVE_DEVICE
:
174 case IRP_MN_SET_LOCK
:
177 case IRP_MN_START_DEVICE
:
180 case IRP_MN_STOP_DEVICE
:
183 case IRP_MN_SURPRISE_REMOVAL
:
187 DPRINT("Unknown IOCTL 0x%X\n", IrpSp
->MinorFunction
);
191 if (Status
!= STATUS_PENDING
) {
192 Irp
->IoStatus
.Status
= Status
;
193 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
196 DPRINT("Leaving. Status 0x%X\n", Status
);
203 PDEVICE_OBJECT DeviceObject
,
206 * FUNCTION: Handle power management IRPs for the child device
208 * DeviceObject = Pointer to physical device object of the child device
209 * Irp = Pointer to IRP that should be handled
214 PIO_STACK_LOCATION IrpSp
;
219 IrpSp
= IoGetCurrentIrpStackLocation(Irp
);
221 switch (IrpSp
->MinorFunction
) {
222 case IRP_MN_SET_POWER
:
223 Status
= PdoSetPower(DeviceObject
, Irp
, IrpSp
);
227 DPRINT("Unknown IOCTL 0x%X\n", IrpSp
->MinorFunction
);
228 Status
= STATUS_NOT_IMPLEMENTED
;
232 if (Status
!= STATUS_PENDING
) {
233 Irp
->IoStatus
.Status
= Status
;
234 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
237 DPRINT("Leaving. Status 0x%X\n", Status
);