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
,
24 /* just complete the irp */
25 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
27 /* complete the irp */
28 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
31 return STATUS_SUCCESS
;
38 IN PDEVICE_OBJECT DeviceObject
,
43 PIO_STACK_LOCATION IoStack
;
44 PDEVICE_OBJECT PnpDeviceObject
= NULL
;
46 /* get current stack location */
47 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
49 /* check if the device object is a child device */
50 Status
= KsIsBusEnumChildDevice(DeviceObject
, &ChildDevice
);
52 /* check for success */
53 if (!NT_SUCCESS(Status
))
56 Irp
->IoStatus
.Status
= Status
;
57 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
61 DPRINT1("SwDispatchPnp ChildDevice %u Request %x\n", ChildDevice
, IoStack
->MinorFunction
);
63 /* let ks handle it */
64 Status
= KsServiceBusEnumPnpRequest(DeviceObject
, Irp
);
66 /* check if the request was for a pdo */
69 if (Status
!= STATUS_NOT_SUPPORTED
)
72 Irp
->IoStatus
.Status
= Status
;
75 /* complete request */
76 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
82 DPRINT1("SwDispatchPnp KsServiceBusEnumPnpRequest Status %x\n", Status
);
84 if (NT_SUCCESS(Status
))
86 /* invalid request or not supported */
87 Irp
->IoStatus
.Status
= Status
;
88 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
92 /* get bus enum pnp object */
93 Status
= KsGetBusEnumPnpDeviceObject(DeviceObject
, &PnpDeviceObject
);
95 DPRINT1("SwDispatchPnp KsGetBusEnumPnpDeviceObject Status %x\n", Status
);
97 /* check for success */
98 if (!NT_SUCCESS(Status
))
100 /* failed to get pnp object */
101 Irp
->IoStatus
.Status
= Status
;
102 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
107 ASSERT(PnpDeviceObject
);
109 /* get current stack location */
110 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
112 if (IoStack
->MinorFunction
== IRP_MN_REMOVE_DEVICE
)
114 /* delete the device */
115 IoDeleteDevice(DeviceObject
);
119 if (IoStack
->MinorFunction
== IRP_MN_QUERY_RESOURCES
|| IoStack
->MinorFunction
== IRP_MN_QUERY_RESOURCE_REQUIREMENTS
)
121 /* no resources required */
122 Irp
->IoStatus
.Information
= 0;
123 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
125 /* skip current location */
126 IoSkipCurrentIrpStackLocation(Irp
);
128 /* call the pnp device object */
129 return IoCallDriver(PnpDeviceObject
, Irp
);
132 if (IoStack
->MajorFunction
== IRP_MN_QUERY_PNP_DEVICE_STATE
)
134 /* device cannot be disabled */
135 Irp
->IoStatus
.Information
|= PNP_DEVICE_NOT_DISABLEABLE
;
136 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
138 /* skip current location */
139 IoSkipCurrentIrpStackLocation(Irp
);
141 /* call the pnp device object */
142 return IoCallDriver(PnpDeviceObject
, Irp
);
145 if (Status
== STATUS_NOT_SUPPORTED
)
147 /* skip current location */
148 IoSkipCurrentIrpStackLocation(Irp
);
150 /* call the pnp device object */
151 return IoCallDriver(PnpDeviceObject
, Irp
);
155 /* complete the request */
156 Irp
->IoStatus
.Status
= Status
;
157 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
164 SwDispatchSystemControl(
165 IN PDEVICE_OBJECT DeviceObject
,
170 PDEVICE_OBJECT PnpDeviceObject
;
172 /* check if the device object is a child device */
173 Status
= KsIsBusEnumChildDevice(DeviceObject
, &ChildDevice
);
175 /* check for success */
176 if (NT_SUCCESS(Status
))
180 /* bus devices dont support internal requests */
181 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
182 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
183 return STATUS_SUCCESS
;
186 /* get bus enum pnp object */
187 Status
= KsGetBusEnumPnpDeviceObject(DeviceObject
, &PnpDeviceObject
);
189 /* check for success */
190 if (NT_SUCCESS(Status
))
192 /* skip current location */
193 IoSkipCurrentIrpStackLocation(Irp
);
194 /* call the pnp device object */
195 return IoCallDriver(PnpDeviceObject
, Irp
);
200 /* complete the request */
201 Irp
->IoStatus
.Status
= Status
;
202 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
210 SwDispatchDeviceControl(
211 IN PDEVICE_OBJECT DeviceObject
,
214 PIO_STACK_LOCATION IoStack
;
217 /* get current stack location */
218 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
220 if (IoStack
->Parameters
.DeviceIoControl
.IoControlCode
== IOCTL_SWENUM_INSTALL_INTERFACE
)
222 /* install interface */
223 Status
= KsInstallBusEnumInterface(Irp
);
224 DPRINT1("SwDispatchDeviceControl IOCTL_SWENUM_INSTALL_INTERFACE %x\n", Status
);
226 else if (IoStack
->Parameters
.DeviceIoControl
.IoControlCode
== IOCTL_SWENUM_REMOVE_INTERFACE
)
228 /* remove interface */
229 Status
= KsRemoveBusEnumInterface(Irp
);
230 DPRINT1("SwDispatchDeviceControl IOCTL_SWENUM_REMOVE_INTERFACE %x\n", Status
);
233 else if (IoStack
->Parameters
.DeviceIoControl
.IoControlCode
== IOCTL_SWENUM_GET_BUS_ID
)
236 Status
= KsGetBusEnumIdentifier(Irp
);
237 DPRINT1("SwDispatchDeviceControl IOCTL_SWENUM_GET_BUS_ID %x\n", Status
);
241 DPRINT1("SwDispatchDeviceControl Unknown IOCTL %x\n", IoStack
->Parameters
.DeviceIoControl
.IoControlCode
);
242 Status
= STATUS_INVALID_PARAMETER
;
246 Irp
->IoStatus
.Status
= Status
;
249 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
259 IN PDEVICE_OBJECT DeviceObject
,
265 /* check if the device object is a child device */
266 Status
= KsIsBusEnumChildDevice(DeviceObject
, &ChildDevice
);
268 DPRINT1("SwDispatchCreate %x\n", Status
);
270 /* check for success */
271 if (NT_SUCCESS(Status
))
275 /* child devices cant create devices */
276 Irp
->IoStatus
.Status
= STATUS_OBJECT_NAME_NOT_FOUND
;
277 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
278 return STATUS_OBJECT_NAME_NOT_FOUND
;
280 /* perform the create request */
281 Status
= KsServiceBusEnumCreateRequest(DeviceObject
, Irp
);
282 DPRINT1("SwDispatchCreate %x\n", Status
);
285 /* check the irp is pending */
286 if (Status
!= STATUS_PENDING
)
288 /* irp is ok to complete */
289 Irp
->IoStatus
.Status
= Status
;
290 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
300 IN PDEVICE_OBJECT DeviceObject
,
303 /* just complete the irp */
304 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
306 /* complete the irp */
307 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
310 return STATUS_SUCCESS
;
317 IN PDRIVER_OBJECT DriverObject
,
318 IN PDEVICE_OBJECT PhysicalDeviceObject
)
321 PDEVICE_OBJECT FunctionalDeviceObject
;
323 DPRINT1("SWENUM AddDevice\n");
325 /* create the device */
326 Status
= IoCreateDevice(DriverObject
, sizeof(KSDEVICE_HEADER
), NULL
, FILE_DEVICE_BUS_EXTENDER
, 0, FALSE
, &FunctionalDeviceObject
);
328 if (!NT_SUCCESS(Status
))
334 /* create the bus enum object */
335 Status
= KsCreateBusEnumObject(L
"SW", FunctionalDeviceObject
, PhysicalDeviceObject
, NULL
, &KSMEDIUMSETID_Standard
, L
"Devices");
337 /* check for success */
338 if (NT_SUCCESS(Status
))
340 /* set device flags */
341 FunctionalDeviceObject
->Flags
|= DO_POWER_PAGABLE
;
342 FunctionalDeviceObject
->Flags
&= ~ DO_DEVICE_INITIALIZING
;
346 /* failed to create bus enum object */
347 IoDeleteDevice(FunctionalDeviceObject
);
357 IN PDRIVER_OBJECT DriverObject
)
365 IN PDRIVER_OBJECT DriverObject
,
366 IN PUNICODE_STRING RegistryPathName
)
369 /* setup add device routine */
370 DriverObject
->DriverExtension
->AddDevice
= SwAddDevice
;
372 /* setup unload routine */
373 DriverObject
->DriverUnload
= SwUnload
;
375 /* misc irp handling routines */
376 DriverObject
->MajorFunction
[IRP_MJ_CREATE
] = SwDispatchCreate
;
377 DriverObject
->MajorFunction
[IRP_MJ_CLOSE
] = SwDispatchClose
;
378 DriverObject
->MajorFunction
[IRP_MJ_PNP
] = SwDispatchPnp
;
379 DriverObject
->MajorFunction
[IRP_MJ_POWER
] = SwDispatchPower
;
380 DriverObject
->MajorFunction
[IRP_MJ_DEVICE_CONTROL
] = SwDispatchDeviceControl
;
381 DriverObject
->MajorFunction
[IRP_MJ_SYSTEM_CONTROL
] = SwDispatchSystemControl
;
383 DPRINT1("SWENUM loaded\n");
384 return STATUS_SUCCESS
;