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
->KsDevice
.NextDeviceObject
, 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 IN LPWSTR ObjectClass
,
91 PIO_STACK_LOCATION IoStack
;
92 ULONG ObjectLength
, ParametersLength
;
95 /* get current irp stack */
96 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
98 /* get object class length */
99 ObjectLength
= (wcslen(ObjectClass
) + 2) * sizeof(WCHAR
);
101 /* check for minium length requirement */
102 if (ObjectLength
+ *Size
> IoStack
->FileObject
->FileName
.MaximumLength
)
103 return STATUS_UNSUCCESSFUL
;
105 /* extract parameters length */
106 ParametersLength
= IoStack
->FileObject
->FileName
.MaximumLength
- ObjectLength
;
108 /* allocate buffer */
109 Buffer
= AllocateItem(NonPagedPool
, ParametersLength
);
111 return STATUS_INSUFFICIENT_RESOURCES
;
113 /* copy parameters */
114 RtlMoveMemory(Buffer
, &IoStack
->FileObject
->FileName
.Buffer
[ObjectLength
/ sizeof(WCHAR
)], ParametersLength
);
118 *Size
= ParametersLength
;
120 return STATUS_SUCCESS
;
129 KsGetObjectFromFileObject(
130 IN PFILE_OBJECT FileObject
)
132 PKSIOBJECT_HEADER ObjectHeader
;
134 /* get object header */
135 ObjectHeader
= (PKSIOBJECT_HEADER
)FileObject
->FsContext2
;
137 /* return associated object */
138 return ObjectHeader
->ObjectType
;
147 KsGetObjectTypeFromFileObject(
148 IN PFILE_OBJECT FileObject
)
150 PKSIOBJECT_HEADER ObjectHeader
;
152 /* get object header */
153 ObjectHeader
= (PKSIOBJECT_HEADER
)FileObject
->FsContext2
;
155 return ObjectHeader
->Type
;
163 KsGetObjectTypeFromIrp(
166 PKSIOBJECT_HEADER ObjectHeader
;
167 PIO_STACK_LOCATION IoStack
;
169 /* get current irp stack */
170 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
171 /* get object header */
172 ObjectHeader
= (PKSIOBJECT_HEADER
)IoStack
->FileObject
->FsContext2
;
174 return ObjectHeader
->Type
;
199 PKSBASIC_HEADER BasicHeader
= (PKSBASIC_HEADER
)((ULONG_PTR
)Object
- sizeof(KSBASIC_HEADER
));
201 ASSERT(BasicHeader
->Parent
.KsDevice
!= NULL
);
202 /* return object type */
203 return (PVOID
)BasicHeader
->Parent
.KsDevice
;