- Use KSSTRING instead of hardcoding object class

- Implement KsValidateAllocatorCreateRequest, KsValidateClockCreateRequest, KsValidateTopologyNodeCreateRequest

svn path=/trunk/; revision=42146
This commit is contained in:
Johannes Anderwald 2009-07-22 19:08:57 +00:00
parent ddf9f8aa58
commit f035e43e1e
9 changed files with 155 additions and 21 deletions

View file

@ -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

View file

@ -779,7 +779,7 @@ KsAddObjectCreateItemToDeviceHeader(
}
/*
@unimplemented
@implemented
*/
KSDDKAPI
NTSTATUS

View file

@ -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

View file

@ -31,7 +31,7 @@ KsCreatePin(
}
return KspCreateObjectType(FilterHandle,
L"{146F1A80-4791-11D0-A5D6-28DB04C10000}", //KSNAME_Pin
KSSTRING_Pin,
(PVOID)Connect,
ConnectSize,
DesiredAccess,

View file

@ -613,7 +613,7 @@ IKsDevice_Create(
}
/*
@unimplemented
@implemented
*/
KSDDKAPI
NTSTATUS

View file

@ -9,7 +9,7 @@
#include "priv.h"
/*
@unimplemented
@implemented
*/
KSDDKAPI
NTSTATUS

View file

@ -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

View file

@ -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;
}

View file

@ -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;
}
/*