Sync to trunk head (r40091)
[reactos.git] / reactos / drivers / ksfilter / ks / misc.c
1 #include "priv.h"
2
3 /* ===============================================================
4 Misc. Helper Functions
5 */
6
7 /*
8 @unimplemented
9 */
10 KSDDKAPI NTSTATUS NTAPI
11 KsCacheMedium(
12 IN PUNICODE_STRING SymbolicLink,
13 IN PKSPIN_MEDIUM Medium,
14 IN ULONG PinDirection)
15 {
16 UNIMPLEMENTED;
17 return STATUS_UNSUCCESSFUL;
18 }
19
20 /*
21 @unimplemented
22 */
23
24 KSDDKAPI NTSTATUS NTAPI
25 KsDefaultDispatchPnp(
26 IN PDEVICE_OBJECT DeviceObject,
27 IN PIRP Irp)
28 {
29 PIO_STACK_LOCATION IoStack;
30 NTSTATUS Status = STATUS_SUCCESS;
31
32 IoStack = IoGetCurrentIrpStackLocation(Irp);
33
34 DPRINT1("KsDefaultDispatchPnp entered with func %x\n", IoStack->MinorFunction);
35
36 switch(IoStack->MinorFunction)
37 {
38 case IRP_MN_QUERY_DEVICE_RELATIONS:
39 Irp->IoStatus.Information = 0;
40 Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
41 IoCompleteRequest(Irp, IO_NO_INCREMENT);
42 return STATUS_INSUFFICIENT_RESOURCES;
43 case IRP_MN_REMOVE_DEVICE:
44 // FIXME
45 // destroy device header, detach device and delete device
46 case IRP_MN_START_DEVICE:
47 case IRP_MN_QUERY_REMOVE_DEVICE:
48 case IRP_MN_CANCEL_STOP_DEVICE:
49 case IRP_MN_SURPRISE_REMOVAL:
50 Irp->IoStatus.Information = 0;
51 Irp->IoStatus.Status = STATUS_SUCCESS;
52 IoCompleteRequest(Irp, IO_NO_INCREMENT);
53 return STATUS_SUCCESS;
54 default:
55 Irp->IoStatus.Information = 0;
56 Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
57 IoCompleteRequest(Irp, IO_NO_INCREMENT);
58 //Status = IoCallDriver(NULL /* PnpBaseObject */, Irp);
59 }
60
61 return Status;
62 }
63
64 /*
65 @unimplemented
66 */
67 KSDDKAPI VOID NTAPI
68 KsSetDevicePnpAndBaseObject(
69 IN KSDEVICE_HEADER Header,
70 IN PDEVICE_OBJECT PnpDeviceObject,
71 IN PDEVICE_OBJECT BaseDevice)
72 {
73 UNIMPLEMENTED;
74 }
75
76 /*
77 @unimplemented
78 */
79 KSDDKAPI NTSTATUS NTAPI
80 KsDefaultDispatchPower(
81 IN PDEVICE_OBJECT DeviceObject,
82 IN PIRP Irp)
83 {
84 UNIMPLEMENTED;
85
86 Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
87 Irp->IoStatus.Information = 0;
88 IoCompleteRequest(Irp, IO_NO_INCREMENT);
89 return STATUS_UNSUCCESSFUL;
90 }
91
92 /*
93 @unimplemented
94 */
95 KSDDKAPI VOID NTAPI
96 KsSetPowerDispatch(
97 IN KSOBJECT_HEADER Header,
98 IN PFNKSCONTEXT_DISPATCH PowerDispatch OPTIONAL,
99 IN PVOID PowerContext OPTIONAL)
100 {
101 UNIMPLEMENTED;
102 }
103
104 /*
105 @unimplemented
106 */
107 KSDDKAPI NTSTATUS NTAPI
108 KsReferenceBusObject(
109 IN KSDEVICE_HEADER Header)
110 {
111 UNIMPLEMENTED;
112 return STATUS_UNSUCCESSFUL;
113 }
114
115 /*
116 @unimplemented
117 */
118 KSDDKAPI VOID NTAPI
119 KsDereferenceBusObject(
120 IN KSDEVICE_HEADER Header)
121 {
122 UNIMPLEMENTED;
123 }
124
125 /*
126 @unimplemented
127 */
128 KSDDKAPI NTSTATUS NTAPI
129 KsFreeObjectCreateItem(
130 IN KSDEVICE_HEADER Header,
131 IN PUNICODE_STRING CreateItem)
132 {
133 UNIMPLEMENTED;
134 return STATUS_UNSUCCESSFUL;
135 }
136
137 /*
138 @unimplemented
139 */
140 KSDDKAPI NTSTATUS NTAPI
141 KsFreeObjectCreateItemsByContext(
142 IN KSDEVICE_HEADER Header,
143 IN PVOID Context)
144 {
145 UNIMPLEMENTED;
146 return STATUS_UNSUCCESSFUL;
147 }
148
149 /*
150 @unimplemented
151 */
152 KSDDKAPI NTSTATUS NTAPI
153 KsLoadResource(
154 IN PVOID ImageBase,
155 IN POOL_TYPE PoolType,
156 IN ULONG_PTR ResourceName,
157 IN ULONG ResourceType,
158 OUT PVOID* Resource,
159 OUT PULONG ResourceSize)
160 {
161 UNIMPLEMENTED;
162 return STATUS_UNSUCCESSFUL;
163 }
164
165 /*
166 @unimplemented
167 */
168 VOID
169 KsNullDriverUnload(
170 IN PDRIVER_OBJECT DriverObject)
171 {
172 UNIMPLEMENTED;
173 }
174
175 /*
176 @unimplemented
177 */
178 KSDDKAPI NTSTATUS NTAPI
179 KsPinDataIntersectionEx(
180 IN PIRP Irp,
181 IN PKSP_PIN Pin,
182 OUT PVOID Data,
183 IN ULONG DescriptorsCount,
184 IN const KSPIN_DESCRIPTOR* Descriptor,
185 IN ULONG DescriptorSize,
186 IN PFNKSINTERSECTHANDLEREX IntersectHandler OPTIONAL,
187 IN PVOID HandlerContext OPTIONAL)
188 {
189 UNIMPLEMENTED;
190 return STATUS_UNSUCCESSFUL;
191 }
192
193 /*
194 @unimplemented
195 */
196 KSDDKAPI PDEVICE_OBJECT NTAPI
197 KsQueryDevicePnpObject(
198 IN KSDEVICE_HEADER Header)
199 {
200 UNIMPLEMENTED;
201 return NULL;
202 }
203
204 /*
205 @unimplemented
206 */
207 KSDDKAPI VOID NTAPI
208 KsRecalculateStackDepth(
209 IN KSDEVICE_HEADER Header,
210 IN BOOLEAN ReuseStackLocation)
211 {
212 UNIMPLEMENTED;
213 }
214
215 /*
216 @unimplemented
217 */
218 KSDDKAPI VOID NTAPI
219 KsSetTargetDeviceObject(
220 IN KSOBJECT_HEADER Header,
221 IN PDEVICE_OBJECT TargetDevice OPTIONAL)
222 {
223 UNIMPLEMENTED;
224 }
225
226 /*
227 @unimplemented
228 */
229 KSDDKAPI VOID NTAPI
230 KsSetTargetState(
231 IN KSOBJECT_HEADER Header,
232 IN KSTARGET_STATE TargetState)
233 {
234 UNIMPLEMENTED;
235 }
236
237 NTSTATUS
238 NTAPI
239 CompletionRoutine(
240 IN PDEVICE_OBJECT DeviceObject,
241 IN PIRP Irp,
242 IN PVOID Context)
243 {
244 PIO_STATUS_BLOCK IoStatusBlock = (PIO_STATUS_BLOCK)Context;
245
246 IoStatusBlock->Information = Irp->IoStatus.Information;
247 IoStatusBlock->Status = Irp->IoStatus.Status;
248
249 return STATUS_SUCCESS;
250 }
251
252 /*
253 @implemented
254 */
255 KSDDKAPI
256 NTSTATUS
257 NTAPI
258 KsSynchronousIoControlDevice(
259 IN PFILE_OBJECT FileObject,
260 IN KPROCESSOR_MODE RequestorMode,
261 IN ULONG IoControl,
262 IN PVOID InBuffer,
263 IN ULONG InSize,
264 OUT PVOID OutBuffer,
265 IN ULONG OutSize,
266 OUT PULONG BytesReturned)
267 {
268 PDEVICE_OBJECT DeviceObject;
269 KEVENT Event;
270 PIRP Irp;
271 IO_STATUS_BLOCK IoStatusBlock;
272 PIO_STACK_LOCATION IoStack;
273 NTSTATUS Status;
274
275 /* check for valid file object */
276 if (!FileObject)
277 return STATUS_INVALID_PARAMETER;
278
279 /* get device object to send the request to */
280 DeviceObject = IoGetRelatedDeviceObject(FileObject);
281 if (!DeviceObject)
282 return STATUS_UNSUCCESSFUL;
283
284 /* initialize the event */
285 KeInitializeEvent(&Event, NotificationEvent, FALSE);
286
287 /* create the irp */
288 Irp = IoBuildDeviceIoControlRequest(IoControl, DeviceObject, InBuffer, InSize, OutBuffer, OutSize, FALSE, &Event, &IoStatusBlock);
289
290 /* HACK */
291 IoStack = IoGetNextIrpStackLocation(Irp);
292 IoStack->FileObject = FileObject;
293
294 IoSetCompletionRoutine(Irp, CompletionRoutine, (PVOID)&IoStatusBlock, TRUE, TRUE, TRUE);
295
296 Status = IoCallDriver(DeviceObject, Irp);
297 if (Status == STATUS_PENDING)
298 {
299 KeWaitForSingleObject(&Event, Executive, RequestorMode, FALSE, NULL);
300 Status = IoStatusBlock.Status;
301 }
302
303 *BytesReturned = IoStatusBlock.Information;
304 return Status;
305 }
306
307
308 /*
309 @implemented
310 */
311 KSDDKAPI
312 VOID
313 NTAPI
314 KsAcquireDeviceSecurityLock(
315 IN KSDEVICE_HEADER DevHeader,
316 IN BOOLEAN Exclusive)
317 {
318 NTSTATUS Status;
319 PKSIDEVICE_HEADER Header = (PKSIDEVICE_HEADER)DevHeader;
320
321 KeEnterCriticalRegion();
322
323 if (Exclusive)
324 {
325 Status = ExAcquireResourceExclusiveLite(&Header->SecurityLock, TRUE);
326 }
327 else
328 {
329 Status = ExAcquireResourceSharedLite(&Header->SecurityLock, TRUE);
330 }
331 }
332
333 /*
334 @implemented
335 */
336 KSDDKAPI
337 VOID
338 NTAPI
339 KsReleaseDeviceSecurityLock(
340 IN KSDEVICE_HEADER DevHeader)
341 {
342 PKSIDEVICE_HEADER Header = (PKSIDEVICE_HEADER)DevHeader;
343
344 ExReleaseResourceLite(&Header->SecurityLock);
345 KeLeaveCriticalRegion();
346 }
347