3 * PROJECT: ReactOS ACPI bus driver
4 * FILE: acpi/ospm/pdo.c
5 * PURPOSE: Child device object dispatch routines
6 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
8 * 08-08-2001 CSH Created
15 /*** PRIVATE *****************************************************************/
18 AcpiDuplicateUnicodeString(
19 PUNICODE_STRING Destination
,
20 PUNICODE_STRING Source
,
25 RtlInitUnicodeString(Destination
, NULL
);
26 return STATUS_SUCCESS
;
29 Destination
->Buffer
= ExAllocatePool(PoolType
, Source
->MaximumLength
);
30 if (Destination
->Buffer
== NULL
)
32 return STATUS_INSUFFICIENT_RESOURCES
;
35 Destination
->MaximumLength
= Source
->MaximumLength
;
36 Destination
->Length
= Source
->Length
;
37 RtlCopyMemory(Destination
->Buffer
, Source
->Buffer
, Source
->MaximumLength
);
39 return STATUS_SUCCESS
;
45 IN PDEVICE_OBJECT DeviceObject
,
47 PIO_STACK_LOCATION IrpSp
)
49 PPDO_DEVICE_EXTENSION DeviceExtension
;
55 DeviceExtension
= (PPDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
57 Status
= STATUS_SUCCESS
;
59 switch (IrpSp
->Parameters
.QueryDeviceText
.DeviceTextType
)
61 case DeviceTextDescription
:
62 DPRINT("DeviceTextDescription\n");
63 Buffer
= (PWSTR
)ExAllocatePool(PagedPool
, DeviceExtension
->DeviceDescription
.Length
+ sizeof(UNICODE_NULL
));
65 Status
= STATUS_INSUFFICIENT_RESOURCES
;
68 RtlCopyMemory(Buffer
, DeviceExtension
->DeviceDescription
.Buffer
, DeviceExtension
->DeviceDescription
.Length
);
69 Buffer
[DeviceExtension
->DeviceDescription
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
70 Irp
->IoStatus
.Information
= (ULONG_PTR
)Buffer
;
75 Irp
->IoStatus
.Information
= 0;
76 Status
= STATUS_INVALID_PARAMETER
;
85 IN PDEVICE_OBJECT DeviceObject
,
87 PIO_STACK_LOCATION IrpSp
)
89 PPDO_DEVICE_EXTENSION DeviceExtension
;
90 UNICODE_STRING String
;
95 DeviceExtension
= (PPDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
97 RtlInitUnicodeString(&String
, NULL
);
99 // Irp->IoStatus.Information = 0;
101 switch (IrpSp
->Parameters
.QueryId
.IdType
)
103 case BusQueryDeviceID
:
104 DPRINT("BusQueryDeviceID\n");
105 Status
= AcpiDuplicateUnicodeString(&String
,
106 &DeviceExtension
->DeviceID
,
108 DPRINT("DeviceID: %S\n", String
.Buffer
);
109 Irp
->IoStatus
.Information
= (ULONG_PTR
)String
.Buffer
;
112 case BusQueryHardwareIDs
:
113 DPRINT("BusQueryHardwareIDs\n");
114 Status
= AcpiDuplicateUnicodeString(&String
,
115 &DeviceExtension
->HardwareIDs
,
117 Irp
->IoStatus
.Information
= (ULONG_PTR
)String
.Buffer
;
120 case BusQueryCompatibleIDs
:
121 DPRINT("BusQueryCompatibleIDs\n");
122 Status
= STATUS_NOT_IMPLEMENTED
;
125 case BusQueryInstanceID
:
126 DPRINT("BusQueryInstanceID\n");
127 Status
= AcpiDuplicateUnicodeString(&String
,
128 &DeviceExtension
->InstanceID
,
130 DPRINT("InstanceID: %S\n", String
.Buffer
);
131 Irp
->IoStatus
.Information
= (ULONG_PTR
)String
.Buffer
;
134 case BusQueryDeviceSerialNumber
:
135 DPRINT("BusQueryDeviceSerialNumber\n");
136 Status
= STATUS_NOT_IMPLEMENTED
;
140 DPRINT("Unknown id type: %lx\n", IrpSp
->Parameters
.QueryId
.IdType
);
141 Status
= STATUS_NOT_IMPLEMENTED
;
149 PdoQueryResourceRequirements(
150 IN PDEVICE_OBJECT DeviceObject
,
152 PIO_STACK_LOCATION IrpSp
)
154 PPDO_DEVICE_EXTENSION DeviceExtension
;
155 PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirementsList
;
157 DeviceExtension
= (PPDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
159 if (DeviceExtension
->ResourceRequirementsListSize
== 0)
161 return Irp
->IoStatus
.Status
;
164 ResourceRequirementsList
= ExAllocatePool(PagedPool
, DeviceExtension
->ResourceRequirementsListSize
);
165 if (!ResourceRequirementsList
)
167 Irp
->IoStatus
.Information
= 0;
168 return STATUS_INSUFFICIENT_RESOURCES
;
171 RtlCopyMemory(ResourceRequirementsList
, DeviceExtension
->ResourceRequirementsList
, DeviceExtension
->ResourceRequirementsListSize
);
172 Irp
->IoStatus
.Information
= (ULONG_PTR
)ResourceRequirementsList
;
173 return STATUS_SUCCESS
;
179 IN PDEVICE_OBJECT DeviceObject
,
181 PIO_STACK_LOCATION IrpSp
)
183 PPDO_DEVICE_EXTENSION DeviceExtension
;
184 PCM_RESOURCE_LIST ResourceList
;
186 DeviceExtension
= (PPDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
188 if (DeviceExtension
->ResourceListSize
== 0)
190 return Irp
->IoStatus
.Status
;
193 ResourceList
= ExAllocatePool(PagedPool
, DeviceExtension
->ResourceListSize
);
196 Irp
->IoStatus
.Information
= 0;
197 return STATUS_INSUFFICIENT_RESOURCES
;
200 RtlCopyMemory(ResourceList
, DeviceExtension
->ResourceList
, DeviceExtension
->ResourceListSize
);
201 Irp
->IoStatus
.Information
= (ULONG_PTR
)ResourceList
;
202 return STATUS_SUCCESS
;
208 IN PDEVICE_OBJECT DeviceObject
,
210 PIO_STACK_LOCATION IrpSp
)
212 PPDO_DEVICE_EXTENSION DeviceExtension
;
217 DeviceExtension
= (PPDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
219 if (IrpSp
->Parameters
.Power
.Type
== DevicePowerState
) {
220 Status
= STATUS_SUCCESS
;
221 switch (IrpSp
->Parameters
.Power
.State
.SystemState
) {
223 Status
= STATUS_UNSUCCESSFUL
;
226 Status
= STATUS_UNSUCCESSFUL
;
233 /*** PUBLIC ******************************************************************/
238 PDEVICE_OBJECT DeviceObject
,
241 * FUNCTION: Handle Plug and Play IRPs for the child device
243 * DeviceObject = Pointer to physical device object of the child device
244 * Irp = Pointer to IRP that should be handled
249 PIO_STACK_LOCATION IrpSp
;
254 Status
= Irp
->IoStatus
.Status
;
256 IrpSp
= IoGetCurrentIrpStackLocation(Irp
);
258 switch (IrpSp
->MinorFunction
) {
259 case IRP_MN_CANCEL_REMOVE_DEVICE
:
262 case IRP_MN_CANCEL_STOP_DEVICE
:
265 case IRP_MN_DEVICE_USAGE_NOTIFICATION
:
271 case IRP_MN_QUERY_BUS_INFORMATION
:
274 case IRP_MN_QUERY_CAPABILITIES
:
277 case IRP_MN_QUERY_DEVICE_RELATIONS
:
278 /* FIXME: Possibly handle for RemovalRelations */
281 case IRP_MN_QUERY_DEVICE_TEXT
:
282 Status
= PdoQueryDeviceText(DeviceObject
, Irp
, IrpSp
);
285 case IRP_MN_QUERY_ID
:
286 Status
= PdoQueryId(DeviceObject
,
291 case IRP_MN_QUERY_PNP_DEVICE_STATE
:
294 case IRP_MN_QUERY_REMOVE_DEVICE
:
297 case IRP_MN_QUERY_RESOURCE_REQUIREMENTS
:
298 Status
= PdoQueryResourceRequirements(DeviceObject
,
303 case IRP_MN_QUERY_RESOURCES
:
304 Status
= PdoQueryResources(DeviceObject
,
309 case IRP_MN_QUERY_STOP_DEVICE
:
312 case IRP_MN_REMOVE_DEVICE
:
315 case IRP_MN_SET_LOCK
:
318 case IRP_MN_START_DEVICE
:
319 Status
= STATUS_SUCCESS
;
322 case IRP_MN_STOP_DEVICE
:
325 case IRP_MN_SURPRISE_REMOVAL
:
329 DPRINT("Unknown IOCTL 0x%X\n", IrpSp
->MinorFunction
);
333 if (Status
!= STATUS_PENDING
) {
334 Irp
->IoStatus
.Status
= Status
;
335 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
338 DPRINT("Leaving. Status 0x%X\n", Status
);
346 PDEVICE_OBJECT DeviceObject
,
349 * FUNCTION: Handle power management IRPs for the child device
351 * DeviceObject = Pointer to physical device object of the child device
352 * Irp = Pointer to IRP that should be handled
357 PIO_STACK_LOCATION IrpSp
;
362 IrpSp
= IoGetCurrentIrpStackLocation(Irp
);
364 switch (IrpSp
->MinorFunction
) {
365 case IRP_MN_SET_POWER
:
366 Status
= PdoSetPower(DeviceObject
, Irp
, IrpSp
);
370 DPRINT("Unknown IOCTL 0x%X\n", IrpSp
->MinorFunction
);
371 Status
= STATUS_NOT_IMPLEMENTED
;
375 if (Status
!= STATUS_PENDING
) {
376 Irp
->IoStatus
.Status
= Status
;
377 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
380 DPRINT("Leaving. Status 0x%X\n", Status
);