mirror of
https://github.com/reactos/reactos.git
synced 2024-07-28 07:08:59 +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
|
@ -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
|
||||||
|
|
|
@ -779,7 +779,7 @@ KsAddObjectCreateItemToDeviceHeader(
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@unimplemented
|
@implemented
|
||||||
*/
|
*/
|
||||||
KSDDKAPI
|
KSDDKAPI
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -613,7 +613,7 @@ IKsDevice_Create(
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@unimplemented
|
@implemented
|
||||||
*/
|
*/
|
||||||
KSDDKAPI
|
KSDDKAPI
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
#include "priv.h"
|
#include "priv.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@unimplemented
|
@implemented
|
||||||
*/
|
*/
|
||||||
KSDDKAPI
|
KSDDKAPI
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,16 +92,47 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue