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
17 DPRINT("Completing IRP %p Status %x\n", Irp
, Irp
->IoStatus
.Status
);
19 ASSERT(Irp
->IoStatus
.Status
!= STATUS_PENDING
);
22 IoCompleteRequest(Irp
, PriorityBoost
);
27 IN POOL_TYPE PoolType
,
28 IN SIZE_T NumberOfBytes
)
30 PVOID Item
= ExAllocatePool(PoolType
, NumberOfBytes
);
34 RtlZeroMemory(Item
, NumberOfBytes
);
47 KspForwardIrpSynchronousCompletion(
48 IN PDEVICE_OBJECT DeviceObject
,
52 if (Irp
->PendingReturned
== TRUE
)
54 KeSetEvent ((PKEVENT
) Context
, IO_NO_INCREMENT
, FALSE
);
56 return STATUS_MORE_PROCESSING_REQUIRED
;
61 KspForwardIrpSynchronous(
62 IN PDEVICE_OBJECT DeviceObject
,
67 PDEVICE_EXTENSION DeviceExtension
;
68 PKSIDEVICE_HEADER DeviceHeader
;
70 ASSERT_IRQL_EQUAL(PASSIVE_LEVEL
);
72 /* get device extension */
73 DeviceExtension
= (PDEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
74 /* get device header */
75 DeviceHeader
= DeviceExtension
->DeviceHeader
;
77 /* initialize the notification event */
78 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
80 IoCopyCurrentIrpStackLocationToNext(Irp
);
82 IoSetCompletionRoutine(Irp
, KspForwardIrpSynchronousCompletion
, (PVOID
)&Event
, TRUE
, TRUE
, TRUE
);
84 /* now call the driver */
85 Status
= IoCallDriver(DeviceHeader
->KsDevice
.NextDeviceObject
, Irp
);
86 /* did the request complete yet */
87 if (Status
== STATUS_PENDING
)
89 /* not yet, lets wait a bit */
90 KeWaitForSingleObject(&Event
, Executive
, KernelMode
, FALSE
, NULL
);
91 Status
= Irp
->IoStatus
.Status
;
99 IN LPWSTR ObjectClass
,
103 PIO_STACK_LOCATION IoStack
;
104 ULONG ObjectLength
, ParametersLength
;
107 /* get current irp stack */
108 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
110 /* get object class length */
111 ObjectLength
= (wcslen(ObjectClass
) + 1) * sizeof(WCHAR
);
113 /* check for minium length requirement */
114 if (ObjectLength
+ *Size
> IoStack
->FileObject
->FileName
.MaximumLength
)
115 return STATUS_UNSUCCESSFUL
;
117 /* extract parameters length */
118 ParametersLength
= IoStack
->FileObject
->FileName
.MaximumLength
- ObjectLength
;
120 /* allocate buffer */
121 Buffer
= AllocateItem(NonPagedPool
, ParametersLength
);
123 return STATUS_INSUFFICIENT_RESOURCES
;
125 /* copy parameters */
126 RtlMoveMemory(Buffer
, &IoStack
->FileObject
->FileName
.Buffer
[ObjectLength
/ sizeof(WCHAR
)], ParametersLength
);
130 *Size
= ParametersLength
;
132 return STATUS_SUCCESS
;
141 KsGetObjectFromFileObject(
142 IN PFILE_OBJECT FileObject
)
144 PKSIOBJECT_HEADER ObjectHeader
;
146 /* get object header */
147 ObjectHeader
= (PKSIOBJECT_HEADER
)FileObject
->FsContext2
;
149 /* return associated object */
150 return ObjectHeader
->ObjectType
;
159 KsGetObjectTypeFromFileObject(
160 IN PFILE_OBJECT FileObject
)
162 PKSIOBJECT_HEADER ObjectHeader
;
164 /* get object header */
165 ObjectHeader
= (PKSIOBJECT_HEADER
)FileObject
->FsContext2
;
167 return ObjectHeader
->Type
;
175 KsGetObjectTypeFromIrp(
178 PKSIOBJECT_HEADER ObjectHeader
;
179 PIO_STACK_LOCATION IoStack
;
181 /* get current irp stack */
182 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
183 /* get object header */
184 ObjectHeader
= (PKSIOBJECT_HEADER
)IoStack
->FileObject
->FsContext2
;
186 return ObjectHeader
->Type
;
197 PKSBASIC_HEADER BasicHeader
= (PKSBASIC_HEADER
)((ULONG_PTR
)Object
- sizeof(KSBASIC_HEADER
));
200 ASSERT(BasicHeader
->Type
== KsObjectTypeDevice
|| BasicHeader
->Type
== KsObjectTypeFilterFactory
||
201 BasicHeader
->Type
== KsObjectTypeFilter
|| BasicHeader
->Type
== KsObjectTypePin
);
203 /* return objects outer unknown */
204 return BasicHeader
->OuterUnknown
;
216 PKSBASIC_HEADER BasicHeader
= (PKSBASIC_HEADER
)((ULONG_PTR
)Object
- sizeof(KSBASIC_HEADER
));
218 ASSERT(BasicHeader
->Parent
.KsDevice
!= NULL
);
219 /* return object type */
220 return (PVOID
)BasicHeader
->Parent
.KsDevice
;