2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel Streaming
4 * FILE: drivers/ksfilter/swenum/swenum.c
5 * PURPOSE: KS Allocator functions
6 * PROGRAMMER: Johannes Anderwald
12 const GUID KSMEDIUMSETID_Standard
= {0x4747B320L
, 0x62CE, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
18 IN PDEVICE_OBJECT DeviceObject
,
21 NTSTATUS Status
, PnpStatus
;
23 PIO_STACK_LOCATION IoStack
;
24 PDEVICE_OBJECT PnpDeviceObject
= NULL
;
26 /* get current stack location */
27 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
29 /* check if the device object is a child device */
30 Status
= KsIsBusEnumChildDevice(DeviceObject
, &ChildDevice
);
32 /* get bus enum pnp object */
33 PnpStatus
= KsGetBusEnumPnpDeviceObject(DeviceObject
, &PnpDeviceObject
);
35 /* check for success */
36 if (!NT_SUCCESS(Status
) || !NT_SUCCESS(PnpStatus
))
38 /* start next power irp */
39 PoStartNextPowerIrp(Irp
);
41 /* just complete the irp */
42 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
44 /* complete the irp */
45 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
48 return STATUS_SUCCESS
;
51 if (IoStack
->MinorFunction
== IRP_MN_SET_POWER
|| IoStack
->MinorFunction
== IRP_MN_QUERY_POWER
)
54 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
59 /* forward to pnp device object */
60 PoStartNextPowerIrp(Irp
);
62 /* skip current location */
63 IoSkipCurrentIrpStackLocation(Irp
);
66 return PoCallDriver(PnpDeviceObject
, Irp
);
69 /* start next power irp */
70 PoStartNextPowerIrp(Irp
);
72 /* just complete the irp */
73 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
75 /* complete the irp */
76 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
79 return STATUS_SUCCESS
;
85 IN PDEVICE_OBJECT DeviceObject
,
90 PIO_STACK_LOCATION IoStack
;
91 PDEVICE_OBJECT PnpDeviceObject
= NULL
;
93 /* get current stack location */
94 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
96 /* check if the device object is a child device */
97 Status
= KsIsBusEnumChildDevice(DeviceObject
, &ChildDevice
);
99 /* check for success */
100 if (!NT_SUCCESS(Status
))
103 Irp
->IoStatus
.Status
= Status
;
104 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
108 DPRINT("SwDispatchPnp ChildDevice %u Request %x\n", ChildDevice
, IoStack
->MinorFunction
);
110 /* let ks handle it */
111 Status
= KsServiceBusEnumPnpRequest(DeviceObject
, Irp
);
113 /* check if the request was for a pdo */
116 if (Status
!= STATUS_NOT_SUPPORTED
)
119 Irp
->IoStatus
.Status
= Status
;
122 /* complete request */
123 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
129 DPRINT("SwDispatchPnp KsServiceBusEnumPnpRequest Status %x\n", Status
);
131 if (NT_SUCCESS(Status
))
133 /* invalid request or not supported */
134 Irp
->IoStatus
.Status
= Status
;
135 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
139 /* get bus enum pnp object */
140 Status
= KsGetBusEnumPnpDeviceObject(DeviceObject
, &PnpDeviceObject
);
142 DPRINT("SwDispatchPnp KsGetBusEnumPnpDeviceObject Status %x\n", Status
);
144 /* check for success */
145 if (!NT_SUCCESS(Status
))
147 /* failed to get pnp object */
148 Irp
->IoStatus
.Status
= Status
;
149 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
154 ASSERT(PnpDeviceObject
);
156 /* get current stack location */
157 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
159 if (IoStack
->MinorFunction
== IRP_MN_REMOVE_DEVICE
)
161 /* delete the device */
162 IoDeleteDevice(DeviceObject
);
166 if (IoStack
->MinorFunction
== IRP_MN_QUERY_RESOURCES
|| IoStack
->MinorFunction
== IRP_MN_QUERY_RESOURCE_REQUIREMENTS
)
168 /* no resources required */
169 Irp
->IoStatus
.Information
= 0;
170 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
172 /* skip current location */
173 IoSkipCurrentIrpStackLocation(Irp
);
175 /* call the pnp device object */
176 return IoCallDriver(PnpDeviceObject
, Irp
);
179 if (IoStack
->MajorFunction
== IRP_MN_QUERY_PNP_DEVICE_STATE
)
181 /* device cannot be disabled */
182 Irp
->IoStatus
.Information
|= PNP_DEVICE_NOT_DISABLEABLE
;
183 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
185 /* skip current location */
186 IoSkipCurrentIrpStackLocation(Irp
);
188 /* call the pnp device object */
189 return IoCallDriver(PnpDeviceObject
, Irp
);
192 if (Status
== STATUS_NOT_SUPPORTED
)
194 /* skip current location */
195 IoSkipCurrentIrpStackLocation(Irp
);
197 /* call the pnp device object */
198 return IoCallDriver(PnpDeviceObject
, Irp
);
202 /* complete the request */
203 Irp
->IoStatus
.Status
= Status
;
204 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
211 SwDispatchSystemControl(
212 IN PDEVICE_OBJECT DeviceObject
,
217 PDEVICE_OBJECT PnpDeviceObject
;
219 /* check if the device object is a child device */
220 Status
= KsIsBusEnumChildDevice(DeviceObject
, &ChildDevice
);
222 /* check for success */
223 if (NT_SUCCESS(Status
))
227 /* bus devices dont support internal requests */
228 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
229 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
230 return STATUS_SUCCESS
;
233 /* get bus enum pnp object */
234 Status
= KsGetBusEnumPnpDeviceObject(DeviceObject
, &PnpDeviceObject
);
236 /* check for success */
237 if (NT_SUCCESS(Status
))
239 /* skip current location */
240 IoSkipCurrentIrpStackLocation(Irp
);
241 /* call the pnp device object */
242 return IoCallDriver(PnpDeviceObject
, Irp
);
247 /* complete the request */
248 Irp
->IoStatus
.Status
= Status
;
249 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
257 SwDispatchDeviceControl(
258 IN PDEVICE_OBJECT DeviceObject
,
261 PIO_STACK_LOCATION IoStack
;
264 /* get current stack location */
265 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
267 if (IoStack
->Parameters
.DeviceIoControl
.IoControlCode
== IOCTL_SWENUM_INSTALL_INTERFACE
)
269 /* install interface */
270 Status
= KsInstallBusEnumInterface(Irp
);
271 DPRINT("SwDispatchDeviceControl IOCTL_SWENUM_INSTALL_INTERFACE %x\n", Status
);
273 else if (IoStack
->Parameters
.DeviceIoControl
.IoControlCode
== IOCTL_SWENUM_REMOVE_INTERFACE
)
275 /* remove interface */
276 Status
= KsRemoveBusEnumInterface(Irp
);
277 DPRINT("SwDispatchDeviceControl IOCTL_SWENUM_REMOVE_INTERFACE %x\n", Status
);
280 else if (IoStack
->Parameters
.DeviceIoControl
.IoControlCode
== IOCTL_SWENUM_GET_BUS_ID
)
283 Status
= KsGetBusEnumIdentifier(Irp
);
284 DPRINT("SwDispatchDeviceControl IOCTL_SWENUM_GET_BUS_ID %x\n", Status
);
288 DPRINT("SwDispatchDeviceControl Unknown IOCTL %x\n", IoStack
->Parameters
.DeviceIoControl
.IoControlCode
);
289 Status
= STATUS_INVALID_PARAMETER
;
293 Irp
->IoStatus
.Status
= Status
;
296 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
306 IN PDEVICE_OBJECT DeviceObject
,
312 /* check if the device object is a child device */
313 Status
= KsIsBusEnumChildDevice(DeviceObject
, &ChildDevice
);
315 DPRINT("SwDispatchCreate %x\n", Status
);
317 /* check for success */
318 if (NT_SUCCESS(Status
))
322 /* child devices cant create devices */
323 Irp
->IoStatus
.Status
= STATUS_OBJECT_NAME_NOT_FOUND
;
324 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
325 return STATUS_OBJECT_NAME_NOT_FOUND
;
327 /* perform the create request */
328 Status
= KsServiceBusEnumCreateRequest(DeviceObject
, Irp
);
329 DPRINT("SwDispatchCreate %x\n", Status
);
332 /* check the irp is pending */
333 if (Status
!= STATUS_PENDING
)
335 /* irp is ok to complete */
336 Irp
->IoStatus
.Status
= Status
;
337 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
347 IN PDEVICE_OBJECT DeviceObject
,
350 /* just complete the irp */
351 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
353 /* complete the irp */
354 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
357 return STATUS_SUCCESS
;
364 IN PDRIVER_OBJECT DriverObject
,
365 IN PDEVICE_OBJECT PhysicalDeviceObject
)
368 PDEVICE_OBJECT FunctionalDeviceObject
;
370 DPRINT("SWENUM AddDevice\n");
371 /* create the device */
372 Status
= IoCreateDevice(DriverObject
, sizeof(KSDEVICE_HEADER
), NULL
, FILE_DEVICE_BUS_EXTENDER
, 0, FALSE
, &FunctionalDeviceObject
);
374 if (!NT_SUCCESS(Status
))
380 /* create the bus enum object */
381 Status
= KsCreateBusEnumObject(L
"SW", FunctionalDeviceObject
, PhysicalDeviceObject
, NULL
, &KSMEDIUMSETID_Standard
, L
"Devices");
383 /* check for success */
384 if (NT_SUCCESS(Status
))
386 /* set device flags */
387 FunctionalDeviceObject
->Flags
|= DO_POWER_PAGABLE
;
388 FunctionalDeviceObject
->Flags
&= ~ DO_DEVICE_INITIALIZING
;
392 /* failed to create bus enum object */
393 IoDeleteDevice(FunctionalDeviceObject
);
403 IN PDRIVER_OBJECT DriverObject
)
411 IN PDRIVER_OBJECT DriverObject
,
412 IN PUNICODE_STRING RegistryPathName
)
415 /* setup add device routine */
416 DriverObject
->DriverExtension
->AddDevice
= SwAddDevice
;
418 /* setup unload routine */
419 DriverObject
->DriverUnload
= SwUnload
;
421 /* misc irp handling routines */
422 DriverObject
->MajorFunction
[IRP_MJ_CREATE
] = SwDispatchCreate
;
423 DriverObject
->MajorFunction
[IRP_MJ_CLOSE
] = SwDispatchClose
;
424 DriverObject
->MajorFunction
[IRP_MJ_PNP
] = SwDispatchPnp
;
425 DriverObject
->MajorFunction
[IRP_MJ_POWER
] = SwDispatchPower
;
426 DriverObject
->MajorFunction
[IRP_MJ_DEVICE_CONTROL
] = SwDispatchDeviceControl
;
427 DriverObject
->MajorFunction
[IRP_MJ_SYSTEM_CONTROL
] = SwDispatchSystemControl
;
429 DPRINT("SWENUM loaded\n");
430 return STATUS_SUCCESS
;