- 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) OUT PHANDLE AllocatorHandle)
{ {
return KspCreateObjectType(ConnectionHandle, return KspCreateObjectType(ConnectionHandle,
L"{642F5D00-4791-11D0-A5D6-28DB04C10000}", //KSNAME_Allocator KSSTRING_Allocator,
(PVOID)AllocatorFraming, (PVOID)AllocatorFraming,
sizeof(KSALLOCATOR_FRAMING), sizeof(KSALLOCATOR_FRAMING),
GENERIC_READ, GENERIC_READ,
@ -386,15 +386,47 @@ KsCreateDefaultAllocator(
} }
/* /*
@unimplemented @implemented
*/ */
KSDDKAPI NTSTATUS NTAPI KSDDKAPI
NTSTATUS
NTAPI
KsValidateAllocatorCreateRequest( KsValidateAllocatorCreateRequest(
IN PIRP Irp, IN PIRP Irp,
OUT PKSALLOCATOR_FRAMING* AllocatorFraming) OUT PKSALLOCATOR_FRAMING* OutAllocatorFraming)
{ {
UNIMPLEMENTED; PKSALLOCATOR_FRAMING AllocatorFraming;
return STATUS_UNSUCCESSFUL; 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 NTSTATUS

View file

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

View file

@ -46,7 +46,7 @@ KsCreateClock(
OUT PHANDLE ClockHandle) OUT PHANDLE ClockHandle)
{ {
return KspCreateObjectType(ConnectionHandle, return KspCreateObjectType(ConnectionHandle,
L"{53172480-4791-11D0-A5D6-28DB04C10000}", /* KSName_Clock */ KSSTRING_Clock,
ClockCreate, ClockCreate,
sizeof(KSCLOCK_CREATE), sizeof(KSCLOCK_CREATE),
GENERIC_READ, GENERIC_READ,
@ -54,17 +54,40 @@ KsCreateClock(
} }
/* /*
@unimplemented @implemented
*/ */
KSDDKAPI KSDDKAPI
NTSTATUS NTSTATUS
NTAPI NTAPI
KsValidateClockCreateRequest( KsValidateClockCreateRequest(
IN PIRP Irp, IN PIRP Irp,
OUT PKSCLOCK_CREATE* ClockCreate) OUT PKSCLOCK_CREATE* OutClockCreate)
{ {
UNIMPLEMENTED; PKSCLOCK_CREATE ClockCreate;
return STATUS_UNSUCCESSFUL; 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 NTSTATUS

View file

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

View file

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

View file

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

View file

@ -107,4 +107,11 @@ FindMatchingCreateItem(
LPWSTR Buffer, LPWSTR Buffer,
OUT PCREATE_ITEM_ENTRY *OutCreateItem); OUT PCREATE_ITEM_ENTRY *OutCreateItem);
NTSTATUS
KspCopyCreateRequest(
IN PIRP Irp,
IN LPWSTR ObjectClass,
IN OUT PULONG Size,
OUT PVOID * Result);
#endif #endif

View file

@ -98,3 +98,44 @@ KsPinDataIntersectionEx(
UNIMPLEMENTED; UNIMPLEMENTED;
return STATUS_UNSUCCESSFUL; 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) OUT PHANDLE NodeHandle)
{ {
return KspCreateObjectType(ParentHandle, return KspCreateObjectType(ParentHandle,
L"{0621061A-EE75-11D0-B915-00A0C9223196}", KSSTRING_TopologyNode,
(PVOID)NodeCreate, (PVOID)NodeCreate,
sizeof(KSNODE_CREATE), sizeof(KSNODE_CREATE),
DesiredAccess, DesiredAccess,
@ -92,18 +92,49 @@ KsCreateTopologyNode(
} }
/* /*
@unimplemented @implemented
*/ */
KSDDKAPI NTSTATUS NTAPI KSDDKAPI
NTSTATUS
NTAPI
KsValidateTopologyNodeCreateRequest( KsValidateTopologyNodeCreateRequest(
IN PIRP Irp, IN PIRP Irp,
IN PKSTOPOLOGY Topology, IN PKSTOPOLOGY Topology,
OUT PKSNODE_CREATE* NodeCreate) OUT PKSNODE_CREATE* OutNodeCreate)
{ {
UNIMPLEMENTED; 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; return STATUS_UNSUCCESSFUL;
} }
/* store result */
*OutNodeCreate = NodeCreate;
return Status;
}
/* /*
@implemented @implemented
*/ */