2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel Streaming
4 * FILE: drivers/wdm/audio/filters/kmixer/filter.c
5 * PURPOSE: Filter File Context Header header
6 * PROGRAMMER: Johannes Anderwald
18 Dispatch_fnDeviceIoControl(
19 PDEVICE_OBJECT DeviceObject
,
25 Irp
->IoStatus
.Status
= STATUS_UNSUCCESSFUL
;
26 Irp
->IoStatus
.Information
= 0;
27 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
28 return STATUS_UNSUCCESSFUL
;
34 PDEVICE_OBJECT DeviceObject
,
39 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
40 Irp
->IoStatus
.Information
= 0;
41 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
42 return STATUS_SUCCESS
;
45 static KSDISPATCH_TABLE DispatchTable
=
47 Dispatch_fnDeviceIoControl
,
48 KsDispatchInvalidDeviceRequest
,
49 KsDispatchInvalidDeviceRequest
,
50 KsDispatchInvalidDeviceRequest
,
52 KsDispatchInvalidDeviceRequest
,
53 KsDispatchInvalidDeviceRequest
,
54 KsDispatchFastIoDeviceControlFailure
,
55 KsDispatchFastWriteFailure
,
56 KsDispatchFastWriteFailure
,
61 DispatchCreateKMixPin(
62 IN PDEVICE_OBJECT DeviceObject
,
67 DPRINT("DispatchCreateKMix entered\n");
70 Status
= CreatePin(Irp
);
73 Irp
->IoStatus
.Status
= Status
;
74 /* complete the request */
75 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
82 DispatchCreateKMixAllocator(
83 IN PDEVICE_OBJECT DeviceObject
,
88 /* create the allocator */
89 Status
= KsCreateDefaultAllocator(Irp
);
92 Irp
->IoStatus
.Status
= Status
;
93 /* complete the request */
94 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
102 IN PDEVICE_OBJECT DeviceObject
,
106 KSOBJECT_HEADER ObjectHeader
;
107 PKSOBJECT_CREATE_ITEM CreateItem
;
108 PKMIXER_DEVICE_EXT DeviceExtension
;
110 DPRINT("DispatchCreateKMix entered\n");
112 /* check if the request was from usermode */
113 if (Irp
->RequestorMode
== UserMode
)
115 /* deny access from usermode */
116 Irp
->IoStatus
.Status
= STATUS_INVALID_DEVICE_REQUEST
;
117 Irp
->IoStatus
.Information
= 0;
118 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
119 return STATUS_INVALID_DEVICE_REQUEST
;
122 /* get device extension */
123 DeviceExtension
= (PKMIXER_DEVICE_EXT
)DeviceObject
->DeviceExtension
;
126 /* reference the software bus object */
127 Status
= KsReferenceSoftwareBusObject(DeviceExtension
->KsDeviceHeader
);
129 if (!NT_SUCCESS(Status
))
131 /* failed to reference bus object */
132 Irp
->IoStatus
.Status
= Status
;
133 Irp
->IoStatus
.Information
= 0;
134 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
139 /* allocate create item */
140 CreateItem
= ExAllocatePool(NonPagedPool
, sizeof(KSOBJECT_CREATE_ITEM
) * 2);
143 /* not enough memory */
144 Irp
->IoStatus
.Information
= 0;
145 Irp
->IoStatus
.Status
= STATUS_INSUFFICIENT_RESOURCES
;
146 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
147 return STATUS_INSUFFICIENT_RESOURCES
;
150 /* zero create struct */
151 RtlZeroMemory(CreateItem
, sizeof(KSOBJECT_CREATE_ITEM
) * 2);
153 /* initialize pin create item */
154 CreateItem
[0].Create
= DispatchCreateKMixPin
;
155 RtlInitUnicodeString(&CreateItem
[0].ObjectClass
, KSSTRING_Pin
);
156 CreateItem
[1].Create
= DispatchCreateKMixAllocator
;
157 RtlInitUnicodeString(&CreateItem
[1].ObjectClass
, KSSTRING_Allocator
);
159 /* allocate object header */
160 Status
= KsAllocateObjectHeader(&ObjectHeader
, 2, CreateItem
, Irp
, &DispatchTable
);
162 if (!NT_SUCCESS(Status
))
164 /* failed to allocate object header */
165 ExFreePool(CreateItem
);
166 KsDereferenceSoftwareBusObject(DeviceExtension
->KsDeviceHeader
);
169 DPRINT("KsAllocateObjectHeader result %x\n", Status
);
170 /* complete the irp */
171 Irp
->IoStatus
.Information
= 0;
172 Irp
->IoStatus
.Status
= Status
;
173 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
179 KMixAllocateDeviceHeader(
180 IN PKMIXER_DEVICE_EXT DeviceExtension
)
183 PKSOBJECT_CREATE_ITEM CreateItem
;
185 /* allocate create item */
186 CreateItem
= ExAllocatePool(NonPagedPool
, sizeof(KSOBJECT_CREATE_ITEM
) * 2);
188 return STATUS_INSUFFICIENT_RESOURCES
;
190 /* initialize create item struct */
191 RtlZeroMemory(CreateItem
, sizeof(KSOBJECT_CREATE_ITEM
) * 2);
192 CreateItem
[0].Create
= DispatchCreateKMix
;
193 RtlInitUnicodeString(&CreateItem
[0].ObjectClass
, L
"GLOBAL");
194 CreateItem
[1].Create
= DispatchCreateKMix
;
195 RtlInitUnicodeString(&CreateItem
[1].ObjectClass
, KSSTRING_Filter
);
197 Status
= KsAllocateDeviceHeader(&DeviceExtension
->KsDeviceHeader
,