-#include <ntddk.h>
-#include <debug.h>
-#include <ks.h>
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/ksfilter/ks/misc.c
+ * PURPOSE: KS Allocator functions
+ * PROGRAMMER: Johannes Anderwald
+ */
-/* ===============================================================
- Misc. Helper Functions
-*/
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsCacheMedium(
- IN PUNICODE_STRING SymbolicLink,
- IN PKSPIN_MEDIUM Medium,
- IN ULONG PinDirection)
+#include "priv.h"
+
+PVOID
+AllocateItem(
+ IN POOL_TYPE PoolType,
+ IN SIZE_T NumberOfBytes)
{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
+ PVOID Item = ExAllocatePool(PoolType, NumberOfBytes);
+ if (!Item)
+ return Item;
+
+ RtlZeroMemory(Item, NumberOfBytes);
+ return Item;
}
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsDefaultDispatchPnp(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
+VOID
+FreeItem(
+ IN PVOID Item)
{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
+
+ ExFreePool(Item);
}
-/*
- @unimplemented
-*/
-KSDDKAPI VOID NTAPI
-KsSetDevicePnpAndBaseObject(
- IN KSDEVICE_HEADER Header,
- IN PDEVICE_OBJECT PnpDeviceObject,
- IN PDEVICE_OBJECT BaseDevice)
+NTSTATUS
+NTAPI
+KspForwardIrpSynchronousCompletion(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN PVOID Context)
{
- UNIMPLEMENTED;
+ if (Irp->PendingReturned == TRUE)
+ {
+ KeSetEvent ((PKEVENT) Context, IO_NO_INCREMENT, FALSE);
+ }
+ return STATUS_MORE_PROCESSING_REQUIRED;
}
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsDefaultDispatchPower(
+
+NTSTATUS
+KspForwardIrpSynchronous(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
+ KEVENT Event;
+ NTSTATUS Status;
+ PDEVICE_EXTENSION DeviceExtension;
+ PKSIDEVICE_HEADER DeviceHeader;
-/*
- @unimplemented
-*/
-KSDDKAPI VOID NTAPI
-KsSetPowerDispatch(
- IN KSOBJECT_HEADER Header,
- IN PFNKSCONTEXT_DISPATCH PowerDispatch OPTIONAL,
- IN PVOID PowerContext OPTIONAL)
-{
- UNIMPLEMENTED;
-}
+ ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsReferenceBusObject(
- IN KSDEVICE_HEADER Header)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
+ /* get device extension */
+ DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ /* get device header */
+ DeviceHeader = DeviceExtension->DeviceHeader;
-/*
- @unimplemented
-*/
-KSDDKAPI VOID NTAPI
-KsDereferenceBusObject(
- IN KSDEVICE_HEADER Header)
-{
- UNIMPLEMENTED;
-}
+ /* initialize the notification event */
+ KeInitializeEvent(&Event, NotificationEvent, FALSE);
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsFreeObjectCreateItem(
- IN KSDEVICE_HEADER Header,
- IN PUNICODE_STRING CreateItem)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
+ IoCopyCurrentIrpStackLocationToNext(Irp);
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsFreeObjectCreateItemsByContext(
- IN KSDEVICE_HEADER Header,
- IN PVOID Context)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
+ IoSetCompletionRoutine(Irp, KspForwardIrpSynchronousCompletion, (PVOID)&Event, TRUE, TRUE, TRUE);
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsLoadResource(
- IN PVOID ImageBase,
- IN POOL_TYPE PoolType,
- IN ULONG_PTR ResourceName,
- IN ULONG ResourceType,
- OUT PVOID* Resource,
- OUT PULONG ResourceSize)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
+ /* now call the driver */
+ Status = IoCallDriver(DeviceHeader->BaseDevice, Irp);
+ /* did the request complete yet */
+ if (Status == STATUS_PENDING)
+ {
+ /* not yet, lets wait a bit */
+ KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
+ Status = Irp->IoStatus.Status;
+ }
+ return Status;
}
-/*
- @unimplemented
-*/
-VOID
-KsNullDriverUnload(
- IN PDRIVER_OBJECT DriverObject)
+NTSTATUS
+KspCopyCreateRequest(
+ IN PIRP Irp,
+ IN LPWSTR ObjectClass,
+ IN OUT PULONG Size,
+ OUT PVOID * Result)
{
- UNIMPLEMENTED;
-}
+ PIO_STACK_LOCATION IoStack;
+ ULONG ObjectLength, ParametersLength;
+ PVOID Buffer;
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsPinDataIntersectionEx(
- IN PIRP Irp,
- IN PKSP_PIN Pin,
- OUT PVOID Data,
- IN ULONG DescriptorsCount,
- IN const KSPIN_DESCRIPTOR* Descriptor,
- IN ULONG DescriptorSize,
- IN PFNKSINTERSECTHANDLEREX IntersectHandler OPTIONAL,
- IN PVOID HandlerContext OPTIONAL)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
+ /* get current irp stack */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ /* get object class length */
+ ObjectLength = (wcslen(ObjectClass) + 2) * sizeof(WCHAR);
+
+ /* check for minium length requirement */
+ if (ObjectLength + *Size > IoStack->FileObject->FileName.MaximumLength)
+ return STATUS_UNSUCCESSFUL;
+
+ /* extract parameters length */
+ ParametersLength = IoStack->FileObject->FileName.MaximumLength - ObjectLength;
+
+ /* allocate buffer */
+ Buffer = AllocateItem(NonPagedPool, ParametersLength);
+ if (!Buffer)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ /* copy parameters */
+ RtlMoveMemory(Buffer, &IoStack->FileObject->FileName.Buffer[ObjectLength / sizeof(WCHAR)], ParametersLength);
+
+ /* store result */
+ *Result = Buffer;
+ *Size = ParametersLength;
+
+ return STATUS_SUCCESS;
}
/*
- @unimplemented
+ @implemented
*/
-KSDDKAPI PDEVICE_OBJECT NTAPI
-KsQueryDevicePnpObject(
- IN KSDEVICE_HEADER Header)
+KSDDKAPI
+PVOID
+NTAPI
+KsGetObjectFromFileObject(
+ IN PFILE_OBJECT FileObject)
{
- UNIMPLEMENTED;
- return NULL;
+ PKSIOBJECT_HEADER ObjectHeader;
+
+ /* get object header */
+ ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext2;
+
+ /* return associated object */
+ return ObjectHeader->ObjectType;
}
/*
- @unimplemented
+ @implemented
*/
-KSDDKAPI VOID NTAPI
-KsRecalculateStackDepth(
- IN KSDEVICE_HEADER Header,
- IN BOOLEAN ReuseStackLocation)
+KSDDKAPI
+KSOBJECTTYPE
+NTAPI
+KsGetObjectTypeFromFileObject(
+ IN PFILE_OBJECT FileObject)
{
- UNIMPLEMENTED;
+ PKSIOBJECT_HEADER ObjectHeader;
+
+ /* get object header */
+ ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext2;
+ /* return type */
+ return ObjectHeader->Type;
}
/*
- @unimplemented
+ @implemented
*/
-KSDDKAPI VOID NTAPI
-KsSetTargetDeviceObject(
- IN KSOBJECT_HEADER Header,
- IN PDEVICE_OBJECT TargetDevice OPTIONAL)
+KSOBJECTTYPE
+NTAPI
+KsGetObjectTypeFromIrp(
+ IN PIRP Irp)
{
- UNIMPLEMENTED;
+ PKSIOBJECT_HEADER ObjectHeader;
+ PIO_STACK_LOCATION IoStack;
+
+ /* get current irp stack */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+ /* get object header */
+ ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2;
+ /* return type */
+ return ObjectHeader->Type;
}
/*
@unimplemented
*/
-KSDDKAPI VOID NTAPI
-KsSetTargetState(
- IN KSOBJECT_HEADER Header,
- IN KSTARGET_STATE TargetState)
+PUNKNOWN
+NTAPI
+KsGetOuterUnknown(
+ IN PVOID Object)
{
- UNIMPLEMENTED;
+ UNIMPLEMENTED
+ return NULL;
+
}
/*
- @unimplemented
+ @implemented
*/
-KSDDKAPI NTSTATUS NTAPI
-KsSynchronousIoControlDevice(
- IN PFILE_OBJECT FileObject,
- IN KPROCESSOR_MODE RequestorMode,
- IN ULONG IoControl,
- IN PVOID InBuffer,
- IN ULONG InSize,
- OUT PVOID OutBuffer,
- IN ULONG OUtSize,
- OUT PULONG BytesReturned)
+KSDDKAPI
+PVOID
+NTAPI
+KsGetParent(
+ IN PVOID Object)
{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
+ PKSBASIC_HEADER BasicHeader = (PKSBASIC_HEADER)((ULONG_PTR)Object - sizeof(KSBASIC_HEADER));
+ /* sanity check */
+ ASSERT(BasicHeader->Parent.KsDevice != NULL);
+ /* return object type */
+ return (PVOID)BasicHeader->Parent.KsDevice;
}
-