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);