+/*
+ * 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
+ */
+
+
#include "priv.h"
-/* ===============================================================
- Misc. Helper Functions
-*/
+PVOID
+AllocateItem(
+ IN POOL_TYPE PoolType,
+ IN SIZE_T NumberOfBytes)
+{
+ PVOID Item = ExAllocatePool(PoolType, NumberOfBytes);
+ if (!Item)
+ return Item;
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsCacheMedium(
- IN PUNICODE_STRING SymbolicLink,
- IN PKSPIN_MEDIUM Medium,
- IN ULONG PinDirection)
+ RtlZeroMemory(Item, NumberOfBytes);
+ return Item;
+}
+
+VOID
+FreeItem(
+ IN PVOID Item)
{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
+
+ ExFreePool(Item);
}
-/*
- @unimplemented
-*/
+NTSTATUS
+NTAPI
+KspForwardIrpSynchronousCompletion(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN PVOID Context)
+{
+ if (Irp->PendingReturned == TRUE)
+ {
+ KeSetEvent ((PKEVENT) Context, IO_NO_INCREMENT, FALSE);
+ }
+ return STATUS_MORE_PROCESSING_REQUIRED;
+}
-KSDDKAPI NTSTATUS NTAPI
-KsDefaultDispatchPnp(
+
+NTSTATUS
+KspForwardIrpSynchronous(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
- PIO_STACK_LOCATION IoStack;
- NTSTATUS Status = STATUS_SUCCESS;
+ KEVENT Event;
+ NTSTATUS Status;
+ PDEVICE_EXTENSION DeviceExtension;
+ PKSIDEVICE_HEADER DeviceHeader;
- IoStack = IoGetCurrentIrpStackLocation(Irp);
+ ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
- DPRINT1("KsDefaultDispatchPnp entered with func %x\n", IoStack->MinorFunction);
+ /* get device extension */
+ DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ /* get device header */
+ DeviceHeader = DeviceExtension->DeviceHeader;
- switch(IoStack->MinorFunction)
+ /* initialize the notification event */
+ KeInitializeEvent(&Event, NotificationEvent, FALSE);
+
+ IoCopyCurrentIrpStackLocationToNext(Irp);
+
+ IoSetCompletionRoutine(Irp, KspForwardIrpSynchronousCompletion, (PVOID)&Event, TRUE, TRUE, TRUE);
+
+ /* now call the driver */
+ Status = IoCallDriver(DeviceHeader->BaseDevice, Irp);
+ /* did the request complete yet */
+ if (Status == STATUS_PENDING)
{
- case IRP_MN_QUERY_DEVICE_RELATIONS:
- Irp->IoStatus.Information = 0;
- Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
- return STATUS_INSUFFICIENT_RESOURCES;
- case IRP_MN_REMOVE_DEVICE:
- // FIXME
- // destroy device header, detach device and delete device
- case IRP_MN_START_DEVICE:
- case IRP_MN_QUERY_REMOVE_DEVICE:
- case IRP_MN_CANCEL_STOP_DEVICE:
- case IRP_MN_SURPRISE_REMOVAL:
- Irp->IoStatus.Information = 0;
- Irp->IoStatus.Status = STATUS_SUCCESS;
- return STATUS_SUCCESS;
- default:
- Irp->IoStatus.Information = 0;
- Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
- //Status = IoCallDriver(NULL /* PnpBaseObject */, Irp);
+ /* not yet, lets wait a bit */
+ KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
+ Status = Irp->IoStatus.Status;
}
-
return Status;
}
-/*
- @unimplemented
-*/
-KSDDKAPI VOID NTAPI
-KsSetDevicePnpAndBaseObject(
- IN KSDEVICE_HEADER Header,
- IN PDEVICE_OBJECT PnpDeviceObject,
- IN PDEVICE_OBJECT BaseDevice)
+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
-KsDefaultDispatchPower(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
+ /* get current irp stack */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
-/*
- @unimplemented
-*/
-KSDDKAPI VOID NTAPI
-KsSetPowerDispatch(
- IN KSOBJECT_HEADER Header,
- IN PFNKSCONTEXT_DISPATCH PowerDispatch OPTIONAL,
- IN PVOID PowerContext OPTIONAL)
-{
- UNIMPLEMENTED;
-}
+ /* get object class length */
+ ObjectLength = (wcslen(ObjectClass) + 2) * sizeof(WCHAR);
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsReferenceBusObject(
- IN KSDEVICE_HEADER Header)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
+ /* check for minium length requirement */
+ if (ObjectLength + *Size > IoStack->FileObject->FileName.MaximumLength)
+ return STATUS_UNSUCCESSFUL;
-/*
- @unimplemented
-*/
-KSDDKAPI VOID NTAPI
-KsDereferenceBusObject(
- IN KSDEVICE_HEADER Header)
-{
- UNIMPLEMENTED;
-}
+ /* extract parameters length */
+ ParametersLength = IoStack->FileObject->FileName.MaximumLength - ObjectLength;
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsFreeObjectCreateItem(
- IN KSDEVICE_HEADER Header,
- IN PUNICODE_STRING CreateItem)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
+ /* allocate buffer */
+ Buffer = AllocateItem(NonPagedPool, ParametersLength);
+ if (!Buffer)
+ return STATUS_INSUFFICIENT_RESOURCES;
-/*
- @unimplemented
-*/
-KSDDKAPI NTSTATUS NTAPI
-KsFreeObjectCreateItemsByContext(
- IN KSDEVICE_HEADER Header,
- IN PVOID Context)
-{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
+ /* copy parameters */
+ RtlMoveMemory(Buffer, &IoStack->FileObject->FileName.Buffer[ObjectLength / sizeof(WCHAR)], ParametersLength);
-/*
- @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;
-}
+ /* store result */
+ *Result = Buffer;
+ *Size = ParametersLength;
-/*
- @unimplemented
-*/
-VOID
-KsNullDriverUnload(
- IN PDRIVER_OBJECT DriverObject)
-{
- UNIMPLEMENTED;
+ return STATUS_SUCCESS;
}
/*
- @unimplemented
+ @implemented
*/
-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)
+KSDDKAPI
+PVOID
+NTAPI
+KsGetObjectFromFileObject(
+ IN PFILE_OBJECT FileObject)
{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
+ PKSIOBJECT_HEADER ObjectHeader;
-/*
- @unimplemented
-*/
-KSDDKAPI PDEVICE_OBJECT NTAPI
-KsQueryDevicePnpObject(
- IN KSDEVICE_HEADER Header)
-{
- UNIMPLEMENTED;
- return NULL;
-}
+ /* get object header */
+ ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext2;
-/*
- @unimplemented
-*/
-KSDDKAPI VOID NTAPI
-KsRecalculateStackDepth(
- IN KSDEVICE_HEADER Header,
- IN BOOLEAN ReuseStackLocation)
-{
- UNIMPLEMENTED;
+ /* return associated object */
+ return ObjectHeader->ObjectType;
}
/*
- @unimplemented
+ @implemented
*/
-KSDDKAPI VOID NTAPI
-KsSetTargetDeviceObject(
- IN KSOBJECT_HEADER Header,
- IN PDEVICE_OBJECT TargetDevice OPTIONAL)
+KSDDKAPI
+KSOBJECTTYPE
+NTAPI
+KsGetObjectTypeFromFileObject(
+ IN PFILE_OBJECT FileObject)
{
- UNIMPLEMENTED;
-}
+ PKSIOBJECT_HEADER ObjectHeader;
-/*
- @unimplemented
-*/
-KSDDKAPI VOID NTAPI
-KsSetTargetState(
- IN KSOBJECT_HEADER Header,
- IN KSTARGET_STATE TargetState)
-{
- UNIMPLEMENTED;
+ /* get object header */
+ ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext2;
+ /* return type */
+ return ObjectHeader->Type;
}
/*
- @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)
+KSOBJECTTYPE
+NTAPI
+KsGetObjectTypeFromIrp(
+ IN PIRP Irp)
{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
-}
+ 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;
+}
/*
- @implemented
+ @unimplemented
*/
-KSDDKAPI
-VOID
+PUNKNOWN
NTAPI
-KsAcquireDeviceSecurityLock(
- IN KSDEVICE_HEADER DevHeader,
- IN BOOLEAN Exclusive)
+KsGetOuterUnknown(
+ IN PVOID Object)
{
- NTSTATUS Status;
- PKSIDEVICE_HEADER Header = (PKSIDEVICE_HEADER)DevHeader;
-
- KeEnterCriticalRegion();
+ UNIMPLEMENTED
+ return NULL;
- if (Exclusive)
- {
- Status = ExAcquireResourceExclusiveLite(&Header->SecurityLock, TRUE);
- }
- else
- {
- Status = ExAcquireResourceSharedLite(&Header->SecurityLock, TRUE);
- }
}
/*
@implemented
*/
KSDDKAPI
-VOID
+PVOID
NTAPI
-KsReleaseDeviceSecurityLock(
- IN KSDEVICE_HEADER DevHeader)
+KsGetParent(
+ IN PVOID Object)
{
- PKSIDEVICE_HEADER Header = (PKSIDEVICE_HEADER)DevHeader;
-
- ExReleaseResourceLite(&Header->SecurityLock);
- KeLeaveCriticalRegion();
+ 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;
}
+