mirror of
https://github.com/reactos/reactos.git
synced 2025-02-25 01:39:30 +00:00
- Use KSSTRING instead of hardcoding object class
- Implement KsValidateAllocatorCreateRequest, KsValidateClockCreateRequest, KsValidateTopologyNodeCreateRequest svn path=/trunk/; revision=42146
This commit is contained in:
parent
ddf9f8aa58
commit
f035e43e1e
9 changed files with 155 additions and 21 deletions
|
@ -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
|
||||
|
|
|
@ -779,7 +779,7 @@ KsAddObjectCreateItemToDeviceHeader(
|
|||
}
|
||||
|
||||
/*
|
||||
@unimplemented
|
||||
@implemented
|
||||
*/
|
||||
KSDDKAPI
|
||||
NTSTATUS
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -31,7 +31,7 @@ KsCreatePin(
|
|||
}
|
||||
|
||||
return KspCreateObjectType(FilterHandle,
|
||||
L"{146F1A80-4791-11D0-A5D6-28DB04C10000}", //KSNAME_Pin
|
||||
KSSTRING_Pin,
|
||||
(PVOID)Connect,
|
||||
ConnectSize,
|
||||
DesiredAccess,
|
||||
|
|
|
@ -613,7 +613,7 @@ IKsDevice_Create(
|
|||
}
|
||||
|
||||
/*
|
||||
@unimplemented
|
||||
@implemented
|
||||
*/
|
||||
KSDDKAPI
|
||||
NTSTATUS
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
#include "priv.h"
|
||||
|
||||
/*
|
||||
@unimplemented
|
||||
@implemented
|
||||
*/
|
||||
KSDDKAPI
|
||||
NTSTATUS
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in a new issue