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
);
34 KspForwardIrpSynchronousCompletion(
35 IN PDEVICE_OBJECT DeviceObject
,
39 if (Irp
->PendingReturned
== TRUE
)
41 KeSetEvent ((PKEVENT
) Context
, IO_NO_INCREMENT
, FALSE
);
43 return STATUS_MORE_PROCESSING_REQUIRED
;
48 KspForwardIrpSynchronous(
49 IN PDEVICE_OBJECT DeviceObject
,
54 PDEVICE_EXTENSION DeviceExtension
;
55 PKSIDEVICE_HEADER DeviceHeader
;
57 ASSERT_IRQL_EQUAL(PASSIVE_LEVEL
);
59 /* get device extension */
60 DeviceExtension
= (PDEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
61 /* get device header */
62 DeviceHeader
= DeviceExtension
->DeviceHeader
;
64 /* initialize the notification event */
65 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
67 IoCopyCurrentIrpStackLocationToNext(Irp
);
69 IoSetCompletionRoutine(Irp
, KspForwardIrpSynchronousCompletion
, (PVOID
)&Event
, TRUE
, TRUE
, TRUE
);
71 /* now call the driver */
72 Status
= IoCallDriver(DeviceHeader
->KsDevice
.NextDeviceObject
, Irp
);
73 /* did the request complete yet */
74 if (Status
== STATUS_PENDING
)
76 /* not yet, lets wait a bit */
77 KeWaitForSingleObject(&Event
, Executive
, KernelMode
, FALSE
, NULL
);
78 Status
= Irp
->IoStatus
.Status
;
86 IN LPWSTR ObjectClass
,
90 PIO_STACK_LOCATION IoStack
;
91 ULONG ObjectLength
, ParametersLength
;
94 /* get current irp stack */
95 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
97 /* get object class length */
98 ObjectLength
= (wcslen(ObjectClass
) + 2) * sizeof(WCHAR
);
100 /* check for minium length requirement */
101 if (ObjectLength
+ *Size
> IoStack
->FileObject
->FileName
.MaximumLength
)
102 return STATUS_UNSUCCESSFUL
;
104 /* extract parameters length */
105 ParametersLength
= IoStack
->FileObject
->FileName
.MaximumLength
- ObjectLength
;
107 /* allocate buffer */
108 Buffer
= AllocateItem(NonPagedPool
, ParametersLength
);
110 return STATUS_INSUFFICIENT_RESOURCES
;
112 /* copy parameters */
113 RtlMoveMemory(Buffer
, &IoStack
->FileObject
->FileName
.Buffer
[ObjectLength
/ sizeof(WCHAR
)], ParametersLength
);
117 *Size
= ParametersLength
;
119 return STATUS_SUCCESS
;
128 KsGetObjectFromFileObject(
129 IN PFILE_OBJECT FileObject
)
131 PKSIOBJECT_HEADER ObjectHeader
;
133 /* get object header */
134 ObjectHeader
= (PKSIOBJECT_HEADER
)FileObject
->FsContext2
;
136 /* return associated object */
137 return ObjectHeader
->ObjectType
;
146 KsGetObjectTypeFromFileObject(
147 IN PFILE_OBJECT FileObject
)
149 PKSIOBJECT_HEADER ObjectHeader
;
151 /* get object header */
152 ObjectHeader
= (PKSIOBJECT_HEADER
)FileObject
->FsContext2
;
154 return ObjectHeader
->Type
;
162 KsGetObjectTypeFromIrp(
165 PKSIOBJECT_HEADER ObjectHeader
;
166 PIO_STACK_LOCATION IoStack
;
168 /* get current irp stack */
169 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
170 /* get object header */
171 ObjectHeader
= (PKSIOBJECT_HEADER
)IoStack
->FileObject
->FsContext2
;
173 return ObjectHeader
->Type
;
184 PKSBASIC_HEADER BasicHeader
= (PKSBASIC_HEADER
)((ULONG_PTR
)Object
- sizeof(KSBASIC_HEADER
));
187 ASSERT(BasicHeader
->Type
== KsObjectTypeDevice
|| BasicHeader
->Type
== KsObjectTypeFilterFactory
||
188 BasicHeader
->Type
== KsObjectTypeFilter
|| BasicHeader
->Type
== KsObjectTypePin
);
190 /* return objects outer unknown */
191 return BasicHeader
->OuterUnknown
;
203 PKSBASIC_HEADER BasicHeader
= (PKSBASIC_HEADER
)((ULONG_PTR
)Object
- sizeof(KSBASIC_HEADER
));
205 ASSERT(BasicHeader
->Parent
.KsDevice
!= NULL
);
206 /* return object type */
207 return (PVOID
)BasicHeader
->Parent
.KsDevice
;