1 /* $Id: pdo.c,v 1.2 2003/12/12 21:54:42 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 /*** PRIVATE *****************************************************************/
23 IN PDEVICE_OBJECT DeviceObject
,
25 PIO_STACK_LOCATION IrpSp
)
27 PPDO_DEVICE_EXTENSION DeviceExtension
;
28 UNICODE_STRING String
;
33 DeviceExtension
= (PPDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
35 // Irp->IoStatus.Information = 0;
37 Status
= STATUS_SUCCESS
;
39 RtlInitUnicodeString(&String
, NULL
);
41 switch (IrpSp
->Parameters
.QueryId
.IdType
) {
42 case BusQueryDeviceID
:
43 Status
= PciCreateUnicodeString(
45 DeviceExtension
->DeviceID
.Buffer
,
48 DPRINT("DeviceID: %S\n", String
.Buffer
);
50 Irp
->IoStatus
.Information
= (ULONG_PTR
)String
.Buffer
;
53 case BusQueryHardwareIDs
:
54 case BusQueryCompatibleIDs
:
55 Status
= STATUS_NOT_IMPLEMENTED
;
58 case BusQueryInstanceID
:
59 Status
= PciCreateUnicodeString(
64 DPRINT("InstanceID: %S\n", String
.Buffer
);
66 Irp
->IoStatus
.Information
= (ULONG_PTR
)String
.Buffer
;
69 case BusQueryDeviceSerialNumber
:
71 Status
= STATUS_NOT_IMPLEMENTED
;
80 IN PDEVICE_OBJECT DeviceObject
,
82 PIO_STACK_LOCATION IrpSp
)
84 PPDO_DEVICE_EXTENSION DeviceExtension
;
89 DeviceExtension
= (PPDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
91 if (IrpSp
->Parameters
.Power
.Type
== DevicePowerState
) {
92 Status
= STATUS_SUCCESS
;
93 switch (IrpSp
->Parameters
.Power
.State
.SystemState
) {
95 Status
= STATUS_UNSUCCESSFUL
;
98 Status
= STATUS_UNSUCCESSFUL
;
105 /*** PUBLIC ******************************************************************/
109 PDEVICE_OBJECT DeviceObject
,
112 * FUNCTION: Handle Plug and Play IRPs for the child device
114 * DeviceObject = Pointer to physical device object of the child device
115 * Irp = Pointer to IRP that should be handled
120 PIO_STACK_LOCATION IrpSp
;
125 Status
= Irp
->IoStatus
.Status
;
127 IrpSp
= IoGetCurrentIrpStackLocation(Irp
);
129 switch (IrpSp
->MinorFunction
) {
131 case IRP_MN_CANCEL_REMOVE_DEVICE
:
134 case IRP_MN_CANCEL_STOP_DEVICE
:
137 case IRP_MN_DEVICE_USAGE_NOTIFICATION
:
143 case IRP_MN_QUERY_BUS_INFORMATION
:
146 case IRP_MN_QUERY_CAPABILITIES
:
149 case IRP_MN_QUERY_DEVICE_RELATIONS
:
150 /* FIXME: Possibly handle for RemovalRelations */
153 case IRP_MN_QUERY_DEVICE_TEXT
:
156 case IRP_MN_QUERY_ID
:
157 Status
= PdoQueryId(DeviceObject
, Irp
, IrpSp
);
160 case IRP_MN_QUERY_PNP_DEVICE_STATE
:
163 case IRP_MN_QUERY_REMOVE_DEVICE
:
166 case IRP_MN_QUERY_RESOURCE_REQUIREMENTS
:
169 case IRP_MN_QUERY_RESOURCES
:
172 case IRP_MN_QUERY_STOP_DEVICE
:
175 case IRP_MN_REMOVE_DEVICE
:
178 case IRP_MN_SET_LOCK
:
181 case IRP_MN_START_DEVICE
:
184 case IRP_MN_STOP_DEVICE
:
187 case IRP_MN_SURPRISE_REMOVAL
:
191 DPRINT("Unknown IOCTL 0x%X\n", IrpSp
->MinorFunction
);
195 if (Status
!= STATUS_PENDING
) {
196 Irp
->IoStatus
.Status
= Status
;
197 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
200 DPRINT("Leaving. Status 0x%X\n", Status
);
207 PDEVICE_OBJECT DeviceObject
,
210 * FUNCTION: Handle power management IRPs for the child device
212 * DeviceObject = Pointer to physical device object of the child device
213 * Irp = Pointer to IRP that should be handled
218 PIO_STACK_LOCATION IrpSp
;
223 IrpSp
= IoGetCurrentIrpStackLocation(Irp
);
225 switch (IrpSp
->MinorFunction
) {
226 case IRP_MN_SET_POWER
:
227 Status
= PdoSetPower(DeviceObject
, Irp
, IrpSp
);
231 DPRINT("Unknown IOCTL 0x%X\n", IrpSp
->MinorFunction
);
232 Status
= STATUS_NOT_IMPLEMENTED
;
236 if (Status
!= STATUS_PENDING
) {
237 Irp
->IoStatus
.Status
= Status
;
238 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
241 DPRINT("Leaving. Status 0x%X\n", Status
);