- Rewrite KsDefaultDispatchPnp to make it actually work
[reactos.git] / reactos / drivers / ksfilter / ks / misc.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel Streaming
4 * FILE: drivers/ksfilter/ks/misc.c
5 * PURPOSE: KS Allocator functions
6 * PROGRAMMER: Johannes Anderwald
7 */
8
9
10 #include "priv.h"
11
12 PVOID
13 AllocateItem(
14 IN POOL_TYPE PoolType,
15 IN SIZE_T NumberOfBytes)
16 {
17 PVOID Item = ExAllocatePool(PoolType, NumberOfBytes);
18 if (!Item)
19 return Item;
20
21 RtlZeroMemory(Item, NumberOfBytes);
22 return Item;
23 }
24
25 VOID
26 FreeItem(
27 IN PVOID Item)
28 {
29
30 ExFreePool(Item);
31 }
32
33 NTSTATUS
34 NTAPI
35 KspForwardIrpSynchronousCompletion(
36 IN PDEVICE_OBJECT DeviceObject,
37 IN PIRP Irp,
38 IN PVOID Context)
39 {
40 if (Irp->PendingReturned == TRUE)
41 {
42 KeSetEvent ((PKEVENT) Context, IO_NO_INCREMENT, FALSE);
43 }
44 return STATUS_MORE_PROCESSING_REQUIRED;
45 }
46
47
48 NTSTATUS
49 KspForwardIrpSynchronous(
50 IN PDEVICE_OBJECT DeviceObject,
51 IN PIRP Irp)
52 {
53 KEVENT Event;
54 NTSTATUS Status;
55 PDEVICE_EXTENSION DeviceExtension;
56 PKSIDEVICE_HEADER DeviceHeader;
57
58 ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
59
60 /* get device extension */
61 DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
62 /* get device header */
63 DeviceHeader = DeviceExtension->DeviceHeader;
64
65 /* initialize the notification event */
66 KeInitializeEvent(&Event, NotificationEvent, FALSE);
67
68 IoCopyCurrentIrpStackLocationToNext(Irp);
69
70 IoSetCompletionRoutine(Irp, KspForwardIrpSynchronousCompletion, (PVOID)&Event, TRUE, TRUE, TRUE);
71
72 /* now call the driver */
73 Status = IoCallDriver(DeviceHeader->BaseDevice, Irp);
74 /* did the request complete yet */
75 if (Status == STATUS_PENDING)
76 {
77 /* not yet, lets wait a bit */
78 KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
79 Status = Irp->IoStatus.Status;
80 }
81 return Status;
82 }
83
84 /*
85 @unimplemented
86 */
87 KSDDKAPI NTSTATUS NTAPI
88 KsPinDataIntersectionEx(
89 IN PIRP Irp,
90 IN PKSP_PIN Pin,
91 OUT PVOID Data,
92 IN ULONG DescriptorsCount,
93 IN const KSPIN_DESCRIPTOR* Descriptor,
94 IN ULONG DescriptorSize,
95 IN PFNKSINTERSECTHANDLEREX IntersectHandler OPTIONAL,
96 IN PVOID HandlerContext OPTIONAL)
97 {
98 UNIMPLEMENTED;
99 return STATUS_UNSUCCESSFUL;
100 }