The 'UNIMPLEMENTED' macro call should be followed explicitely by a semicolon.
[reactos.git] / reactos / drivers / wdm / audio / filters / kmixer / filter.c
1 /*
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
7 */
8
9 #include "kmixer.h"
10
11 #include <swenum.h>
12
13 #define YDEBUG
14 #include <debug.h>
15
16 NTSTATUS
17 NTAPI
18 Dispatch_fnDeviceIoControl(
19 PDEVICE_OBJECT DeviceObject,
20 PIRP Irp)
21 {
22 UNIMPLEMENTED;
23 DbgBreakPoint();
24
25 Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
26 Irp->IoStatus.Information = 0;
27 IoCompleteRequest(Irp, IO_NO_INCREMENT);
28 return STATUS_UNSUCCESSFUL;
29 }
30
31 NTSTATUS
32 NTAPI
33 Dispatch_fnClose(
34 PDEVICE_OBJECT DeviceObject,
35 PIRP Irp)
36 {
37 UNIMPLEMENTED;
38
39 Irp->IoStatus.Status = STATUS_SUCCESS;
40 Irp->IoStatus.Information = 0;
41 IoCompleteRequest(Irp, IO_NO_INCREMENT);
42 return STATUS_SUCCESS;
43 }
44
45 static KSDISPATCH_TABLE DispatchTable =
46 {
47 Dispatch_fnDeviceIoControl,
48 KsDispatchInvalidDeviceRequest,
49 KsDispatchInvalidDeviceRequest,
50 KsDispatchInvalidDeviceRequest,
51 Dispatch_fnClose,
52 KsDispatchInvalidDeviceRequest,
53 KsDispatchInvalidDeviceRequest,
54 KsDispatchFastIoDeviceControlFailure,
55 KsDispatchFastWriteFailure,
56 KsDispatchFastWriteFailure,
57 };
58
59 NTSTATUS
60 NTAPI
61 DispatchCreateKMixPin(
62 IN PDEVICE_OBJECT DeviceObject,
63 IN PIRP Irp)
64 {
65 NTSTATUS Status;
66
67 DPRINT("DispatchCreateKMix entered\n");
68
69 /* create the pin */
70 Status = CreatePin(Irp);
71
72 /* save result */
73 Irp->IoStatus.Status = Status;
74 /* complete the request */
75 IoCompleteRequest(Irp, IO_NO_INCREMENT);
76 /* done */
77 return Status;
78 }
79
80 NTSTATUS
81 NTAPI
82 DispatchCreateKMixAllocator(
83 IN PDEVICE_OBJECT DeviceObject,
84 IN PIRP Irp)
85 {
86 NTSTATUS Status;
87
88 /* create the allocator */
89 Status = KsCreateDefaultAllocator(Irp);
90
91 /* save result */
92 Irp->IoStatus.Status = Status;
93 /* complete the request */
94 IoCompleteRequest(Irp, IO_NO_INCREMENT);
95 /* done */
96 return Status;
97 }
98
99 NTSTATUS
100 NTAPI
101 DispatchCreateKMix(
102 IN PDEVICE_OBJECT DeviceObject,
103 IN PIRP Irp)
104 {
105 NTSTATUS Status;
106 KSOBJECT_HEADER ObjectHeader;
107 PKSOBJECT_CREATE_ITEM CreateItem;
108 PKMIXER_DEVICE_EXT DeviceExtension;
109
110 DPRINT("DispatchCreateKMix entered\n");
111
112 /* check if the request was from usermode */
113 if (Irp->RequestorMode == UserMode)
114 {
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;
120 }
121
122 /* get device extension */
123 DeviceExtension = (PKMIXER_DEVICE_EXT)DeviceObject->DeviceExtension;
124
125 #if 0
126 /* reference the software bus object */
127 Status = KsReferenceSoftwareBusObject(DeviceExtension->KsDeviceHeader);
128
129 if (!NT_SUCCESS(Status))
130 {
131 /* failed to reference bus object */
132 Irp->IoStatus.Status = Status;
133 Irp->IoStatus.Information = 0;
134 IoCompleteRequest(Irp, IO_NO_INCREMENT);
135 return Status;
136 }
137 #endif
138
139 /* allocate create item */
140 CreateItem = ExAllocatePool(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM) * 2);
141 if (!CreateItem)
142 {
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;
148 }
149
150 /* zero create struct */
151 RtlZeroMemory(CreateItem, sizeof(KSOBJECT_CREATE_ITEM) * 2);
152
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);
158
159 /* allocate object header */
160 Status = KsAllocateObjectHeader(&ObjectHeader, 2, CreateItem, Irp, &DispatchTable);
161
162 if (!NT_SUCCESS(Status))
163 {
164 /* failed to allocate object header */
165 ExFreePool(CreateItem);
166 KsDereferenceSoftwareBusObject(DeviceExtension->KsDeviceHeader);
167 }
168
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);
174 return Status;
175 }
176
177 NTSTATUS
178 NTAPI
179 KMixAllocateDeviceHeader(
180 IN PKMIXER_DEVICE_EXT DeviceExtension)
181 {
182 NTSTATUS Status;
183 PKSOBJECT_CREATE_ITEM CreateItem;
184
185 /* allocate create item */
186 CreateItem = ExAllocatePool(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM) * 2);
187 if (!CreateItem)
188 return STATUS_INSUFFICIENT_RESOURCES;
189
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);
196
197 Status = KsAllocateDeviceHeader(&DeviceExtension->KsDeviceHeader,
198 2,
199 CreateItem);
200 return Status;
201 }
202