merge 37282 from amd64-branch:
[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 KSDDKAPI VOID NTAPI
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 PKSIOBJECT_HEADER ObjectHeader;
269 PDEVICE_OBJECT DeviceObject;
270 KEVENT Event;
271 PIRP Irp;
272 IO_STATUS_BLOCK IoStatusBlock;
273 PIO_STACK_LOCATION IoStack;
274 NTSTATUS Status;
275
276 /* check for valid file object */
277 if (!FileObject)
278 return STATUS_INVALID_PARAMETER;
279
280 /* get device object to send the request to */
281 DeviceObject = IoGetRelatedDeviceObject(FileObject);
282 if (!DeviceObject)
283 return STATUS_UNSUCCESSFUL;
284
285 /* get object header */
286 ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext;
287 /* check if there is fast device io function */
288 if (ObjectHeader->DispatchTable.FastDeviceIoControl)
289 {
290 /* it is send the request */
291 Status = ObjectHeader->DispatchTable.FastDeviceIoControl(FileObject, TRUE, InBuffer, InSize, OutBuffer, OutSize, IoControl, &IoStatusBlock, DeviceObject);
292 /* check if the request was handled */
293 if (Status)
294 {
295 /* store bytes returned */
296 *BytesReturned = IoStatusBlock.Information;
297 /* return status */
298 return IoStatusBlock.Status;
299 }
300 }
301
302 /* initialize the event */
303 KeInitializeEvent(&Event, NotificationEvent, FALSE);
304
305 /* create the irp */
306 Irp = IoBuildDeviceIoControlRequest(IoControl, DeviceObject, InBuffer, InSize, OutBuffer, OutSize, FALSE, &Event, &IoStatusBlock);
307
308 /* HACK */
309 IoStack = IoGetNextIrpStackLocation(Irp);
310 IoStack->FileObject = FileObject;
311
312 IoSetCompletionRoutine(Irp, CompletionRoutine, (PVOID)&IoStatusBlock, TRUE, TRUE, TRUE);
313
314 Status = IoCallDriver(DeviceObject, Irp);
315 if (Status == STATUS_PENDING)
316 {
317 KeWaitForSingleObject(&Event, Executive, RequestorMode, FALSE, NULL);
318 Status = IoStatusBlock.Status;
319 }
320
321 *BytesReturned = IoStatusBlock.Information;
322 return Status;
323 }
324
325
326 /*
327 @implemented
328 */
329 KSDDKAPI
330 VOID
331 NTAPI
332 KsAcquireDeviceSecurityLock(
333 IN KSDEVICE_HEADER DevHeader,
334 IN BOOLEAN Exclusive)
335 {
336 NTSTATUS Status;
337 PKSIDEVICE_HEADER Header = (PKSIDEVICE_HEADER)DevHeader;
338
339 KeEnterCriticalRegion();
340
341 if (Exclusive)
342 {
343 Status = ExAcquireResourceExclusiveLite(&Header->SecurityLock, TRUE);
344 }
345 else
346 {
347 Status = ExAcquireResourceSharedLite(&Header->SecurityLock, TRUE);
348 }
349 }
350
351 /*
352 @implemented
353 */
354 KSDDKAPI
355 VOID
356 NTAPI
357 KsReleaseDeviceSecurityLock(
358 IN KSDEVICE_HEADER DevHeader)
359 {
360 PKSIDEVICE_HEADER Header = (PKSIDEVICE_HEADER)DevHeader;
361
362 ExReleaseResourceLite(&Header->SecurityLock);
363 KeLeaveCriticalRegion();
364 }
365