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
14 IN POOL_TYPE PoolType
,
15 IN SIZE_T NumberOfBytes
)
17 PVOID Item
= ExAllocatePool(PoolType
, NumberOfBytes
);
21 RtlZeroMemory(Item
, NumberOfBytes
);
35 KspForwardIrpSynchronousCompletion(
36 IN PDEVICE_OBJECT DeviceObject
,
40 if (Irp
->PendingReturned
== TRUE
)
42 KeSetEvent ((PKEVENT
) Context
, IO_NO_INCREMENT
, FALSE
);
44 return STATUS_MORE_PROCESSING_REQUIRED
;
49 KspForwardIrpSynchronous(
50 IN PDEVICE_OBJECT DeviceObject
,
55 PDEVICE_EXTENSION DeviceExtension
;
56 PKSIDEVICE_HEADER DeviceHeader
;
58 ASSERT_IRQL_EQUAL(PASSIVE_LEVEL
);
60 /* get device extension */
61 DeviceExtension
= (PDEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
62 /* get device header */
63 DeviceHeader
= DeviceExtension
->DeviceHeader
;
65 /* initialize the notification event */
66 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
68 IoCopyCurrentIrpStackLocationToNext(Irp
);
70 IoSetCompletionRoutine(Irp
, KspForwardIrpSynchronousCompletion
, (PVOID
)&Event
, TRUE
, TRUE
, TRUE
);
72 /* now call the driver */
73 Status
= IoCallDriver(DeviceHeader
->BaseDevice
, Irp
);
74 /* did the request complete yet */
75 if (Status
== STATUS_PENDING
)
77 /* not yet, lets wait a bit */
78 KeWaitForSingleObject(&Event
, Executive
, KernelMode
, FALSE
, NULL
);
79 Status
= Irp
->IoStatus
.Status
;
87 KSDDKAPI NTSTATUS NTAPI
88 KsPinDataIntersectionEx(
92 IN ULONG DescriptorsCount
,
93 IN
const KSPIN_DESCRIPTOR
* Descriptor
,
94 IN ULONG DescriptorSize
,
95 IN PFNKSINTERSECTHANDLEREX IntersectHandler OPTIONAL
,
96 IN PVOID HandlerContext OPTIONAL
)
99 return STATUS_UNSUCCESSFUL
;
104 KspCopyCreateRequest(
106 IN LPWSTR ObjectClass
,
110 PIO_STACK_LOCATION IoStack
;
111 ULONG ObjectLength
, ParametersLength
;
114 /* get current irp stack */
115 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
117 /* get object class length */
118 ObjectLength
= (wcslen(ObjectClass
) + 2) * sizeof(WCHAR
);
120 /* check for minium length requirement */
121 if (ObjectLength
+ *Size
> IoStack
->FileObject
->FileName
.MaximumLength
)
122 return STATUS_UNSUCCESSFUL
;
124 /* extract parameters length */
125 ParametersLength
= IoStack
->FileObject
->FileName
.MaximumLength
- ObjectLength
;
127 /* allocate buffer */
128 Buffer
= AllocateItem(NonPagedPool
, ParametersLength
);
130 return STATUS_INSUFFICIENT_RESOURCES
;
132 /* copy parameters */
133 RtlMoveMemory(Buffer
, &IoStack
->FileObject
->FileName
.Buffer
[ObjectLength
/ sizeof(WCHAR
)], ParametersLength
);
137 *Size
= ParametersLength
;
139 return STATUS_SUCCESS
;
148 KsGetObjectFromFileObject(
149 IN PFILE_OBJECT FileObject
)
151 PKSIOBJECT_HEADER ObjectHeader
;
153 /* get object header */
154 ObjectHeader
= (PKSIOBJECT_HEADER
)FileObject
->FsContext2
;
156 /* return associated object */
157 return ObjectHeader
->ObjectType
;
166 KsGetObjectTypeFromFileObject(
167 IN PFILE_OBJECT FileObject
)
169 PKSIOBJECT_HEADER ObjectHeader
;
171 /* get object header */
172 ObjectHeader
= (PKSIOBJECT_HEADER
)FileObject
->FsContext2
;
174 return ObjectHeader
->Type
;
182 KsGetObjectTypeFromIrp(
185 PKSIOBJECT_HEADER ObjectHeader
;
186 PIO_STACK_LOCATION IoStack
;
188 /* get current irp stack */
189 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
190 /* get object header */
191 ObjectHeader
= (PKSIOBJECT_HEADER
)IoStack
->FileObject
->FsContext2
;
193 return ObjectHeader
->Type
;
218 PKSBASIC_HEADER BasicHeader
= (PKSBASIC_HEADER
)((ULONG_PTR
)Object
- sizeof(KSBASIC_HEADER
));
220 ASSERT(BasicHeader
->Parent
.KsDevice
!= NULL
);
221 /* return object type */
222 return (PVOID
)BasicHeader
->Parent
.KsDevice
;