diff --git a/reactos/drivers/ksfilter/ks/allocators.c b/reactos/drivers/ksfilter/ks/allocators.c index 20ef49826d6..9880dea7ce8 100644 --- a/reactos/drivers/ksfilter/ks/allocators.c +++ b/reactos/drivers/ksfilter/ks/allocators.c @@ -368,7 +368,7 @@ KsCreateAllocator( OUT PHANDLE AllocatorHandle) { return KspCreateObjectType(ConnectionHandle, - L"{642F5D00-4791-11D0-A5D6-28DB04C10000}", //KSNAME_Allocator + KSSTRING_Allocator, (PVOID)AllocatorFraming, sizeof(KSALLOCATOR_FRAMING), GENERIC_READ, @@ -386,15 +386,47 @@ KsCreateDefaultAllocator( } /* - @unimplemented + @implemented */ -KSDDKAPI NTSTATUS NTAPI +KSDDKAPI +NTSTATUS +NTAPI KsValidateAllocatorCreateRequest( IN PIRP Irp, - OUT PKSALLOCATOR_FRAMING* AllocatorFraming) + OUT PKSALLOCATOR_FRAMING* OutAllocatorFraming) { - UNIMPLEMENTED; - return STATUS_UNSUCCESSFUL; + PKSALLOCATOR_FRAMING AllocatorFraming; + ULONG Size; + NTSTATUS Status; + ULONG SupportedFlags; + + /* set minimum request size */ + Size = sizeof(KSALLOCATOR_FRAMING); + + Status = KspCopyCreateRequest(Irp, + KSSTRING_Allocator, + &Size, + (PVOID*)&AllocatorFraming); + + if (!NT_SUCCESS(Status)) + return Status; + + /* allowed supported flags */ + SupportedFlags = (KSALLOCATOR_OPTIONF_COMPATIBLE | KSALLOCATOR_OPTIONF_SYSTEM_MEMORY | + KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER | KSALLOCATOR_REQUIREMENTF_SYSTEM_MEMORY | KSALLOCATOR_REQUIREMENTF_FRAME_INTEGRITY | + KSALLOCATOR_REQUIREMENTF_MUST_ALLOCATE); + + + if (!AllocatorFraming->FrameSize || (AllocatorFraming->OptionsFlags & (~SupportedFlags))) + { + FreeItem(AllocatorFraming); + return STATUS_INVALID_PARAMETER; + } + + /* store result */ + *OutAllocatorFraming = AllocatorFraming; + + return Status; } NTSTATUS diff --git a/reactos/drivers/ksfilter/ks/api.c b/reactos/drivers/ksfilter/ks/api.c index 2a051f03770..8a34ac8d008 100644 --- a/reactos/drivers/ksfilter/ks/api.c +++ b/reactos/drivers/ksfilter/ks/api.c @@ -779,7 +779,7 @@ KsAddObjectCreateItemToDeviceHeader( } /* - @unimplemented + @implemented */ KSDDKAPI NTSTATUS diff --git a/reactos/drivers/ksfilter/ks/clocks.c b/reactos/drivers/ksfilter/ks/clocks.c index 57d15bea71d..39611935076 100644 --- a/reactos/drivers/ksfilter/ks/clocks.c +++ b/reactos/drivers/ksfilter/ks/clocks.c @@ -46,7 +46,7 @@ KsCreateClock( OUT PHANDLE ClockHandle) { return KspCreateObjectType(ConnectionHandle, - L"{53172480-4791-11D0-A5D6-28DB04C10000}", /* KSName_Clock */ + KSSTRING_Clock, ClockCreate, sizeof(KSCLOCK_CREATE), GENERIC_READ, @@ -54,17 +54,40 @@ KsCreateClock( } /* - @unimplemented + @implemented */ KSDDKAPI NTSTATUS NTAPI KsValidateClockCreateRequest( IN PIRP Irp, - OUT PKSCLOCK_CREATE* ClockCreate) + OUT PKSCLOCK_CREATE* OutClockCreate) { - UNIMPLEMENTED; - return STATUS_UNSUCCESSFUL; + PKSCLOCK_CREATE ClockCreate; + NTSTATUS Status; + ULONG Size; + + /* minimum request size */ + Size = sizeof(KSCLOCK_CREATE); + + /* copy create request */ + Status = KspCopyCreateRequest(Irp, + KSSTRING_Clock, + &Size, + (PVOID*)&ClockCreate); + + if (!NT_SUCCESS(Status)) + return Status; + + if (ClockCreate->CreateFlags != 0) + { + /* flags must be zero */ + FreeItem(ClockCreate); + return STATUS_INVALID_PARAMETER; + } + + *OutClockCreate = ClockCreate; + return STATUS_SUCCESS; } NTSTATUS diff --git a/reactos/drivers/ksfilter/ks/connectivity.c b/reactos/drivers/ksfilter/ks/connectivity.c index 13e26b53906..7b79f51e38a 100644 --- a/reactos/drivers/ksfilter/ks/connectivity.c +++ b/reactos/drivers/ksfilter/ks/connectivity.c @@ -31,7 +31,7 @@ KsCreatePin( } return KspCreateObjectType(FilterHandle, - L"{146F1A80-4791-11D0-A5D6-28DB04C10000}", //KSNAME_Pin + KSSTRING_Pin, (PVOID)Connect, ConnectSize, DesiredAccess, diff --git a/reactos/drivers/ksfilter/ks/device.c b/reactos/drivers/ksfilter/ks/device.c index 32b1ee2112f..33811e14e7b 100644 --- a/reactos/drivers/ksfilter/ks/device.c +++ b/reactos/drivers/ksfilter/ks/device.c @@ -613,7 +613,7 @@ IKsDevice_Create( } /* - @unimplemented + @implemented */ KSDDKAPI NTSTATUS diff --git a/reactos/drivers/ksfilter/ks/image.c b/reactos/drivers/ksfilter/ks/image.c index db004c404eb..39df5e240e1 100644 --- a/reactos/drivers/ksfilter/ks/image.c +++ b/reactos/drivers/ksfilter/ks/image.c @@ -9,7 +9,7 @@ #include "priv.h" /* - @unimplemented + @implemented */ KSDDKAPI NTSTATUS diff --git a/reactos/drivers/ksfilter/ks/ksfunc.h b/reactos/drivers/ksfilter/ks/ksfunc.h index 28b18d54390..72c9f487861 100644 --- a/reactos/drivers/ksfilter/ks/ksfunc.h +++ b/reactos/drivers/ksfilter/ks/ksfunc.h @@ -107,4 +107,11 @@ FindMatchingCreateItem( LPWSTR Buffer, OUT PCREATE_ITEM_ENTRY *OutCreateItem); +NTSTATUS +KspCopyCreateRequest( + IN PIRP Irp, + IN LPWSTR ObjectClass, + IN OUT PULONG Size, + OUT PVOID * Result); + #endif diff --git a/reactos/drivers/ksfilter/ks/misc.c b/reactos/drivers/ksfilter/ks/misc.c index f0a5acaed14..6f6218d069a 100644 --- a/reactos/drivers/ksfilter/ks/misc.c +++ b/reactos/drivers/ksfilter/ks/misc.c @@ -98,3 +98,44 @@ KsPinDataIntersectionEx( UNIMPLEMENTED; return STATUS_UNSUCCESSFUL; } + + +NTSTATUS +KspCopyCreateRequest( + IN PIRP Irp, + IN LPWSTR ObjectClass, + IN OUT PULONG Size, + OUT PVOID * Result) +{ + PIO_STACK_LOCATION IoStack; + ULONG ObjectLength, ParametersLength; + PVOID Buffer; + + /* 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; +} + diff --git a/reactos/drivers/ksfilter/ks/topology.c b/reactos/drivers/ksfilter/ks/topology.c index 48342c0fbf6..3b3f34020a5 100644 --- a/reactos/drivers/ksfilter/ks/topology.c +++ b/reactos/drivers/ksfilter/ks/topology.c @@ -84,7 +84,7 @@ KsCreateTopologyNode( OUT PHANDLE NodeHandle) { return KspCreateObjectType(ParentHandle, - L"{0621061A-EE75-11D0-B915-00A0C9223196}", + KSSTRING_TopologyNode, (PVOID)NodeCreate, sizeof(KSNODE_CREATE), DesiredAccess, @@ -92,16 +92,47 @@ KsCreateTopologyNode( } /* - @unimplemented + @implemented */ -KSDDKAPI NTSTATUS NTAPI +KSDDKAPI +NTSTATUS +NTAPI KsValidateTopologyNodeCreateRequest( IN PIRP Irp, IN PKSTOPOLOGY Topology, - OUT PKSNODE_CREATE* NodeCreate) + OUT PKSNODE_CREATE* OutNodeCreate) { - UNIMPLEMENTED; - return STATUS_UNSUCCESSFUL; + PKSNODE_CREATE NodeCreate; + ULONG Size; + NTSTATUS Status; + + /* did the caller miss the topology */ + if (!Topology) + return STATUS_INVALID_PARAMETER; + + /* set create param size */ + Size = sizeof(KSNODE_CREATE); + + /* fetch create parameters */ + Status = KspCopyCreateRequest(Irp, + KSSTRING_TopologyNode, + &Size, + (PVOID*)&NodeCreate); + + if (!NT_SUCCESS(Status)) + return Status; + + if (NodeCreate->CreateFlags != 0 || (NodeCreate->Node >= Topology->TopologyNodesCount && NodeCreate->Node != (ULONG)-1)) + { + /* invalid node create */ + FreeItem(NodeCreate); + return STATUS_UNSUCCESSFUL; + } + + /* store result */ + *OutNodeCreate = NodeCreate; + + return Status; } /*