- Implement KsCreateTopologyNode, KsCreatePin

svn path=/trunk/; revision=39546
This commit is contained in:
Johannes Anderwald 2009-02-11 09:34:32 +00:00
parent f6fa8b2376
commit 335a11923d
3 changed files with 86 additions and 8 deletions

View file

@ -7,7 +7,21 @@ KsCreatePin(
IN ACCESS_MASK DesiredAccess, IN ACCESS_MASK DesiredAccess,
OUT PHANDLE ConnectionHandle) OUT PHANDLE ConnectionHandle)
{ {
return STATUS_SUCCESS; UINT ConnectSize = sizeof(KSPIN_CONNECT);
PKSDATAFORMAT_WAVEFORMATEX Format = (PKSDATAFORMAT_WAVEFORMATEX)(Connect + 1);
if (Format->DataFormat.FormatSize == sizeof(KSDATAFORMAT) ||
Format->DataFormat.FormatSize == sizeof(KSDATAFORMAT) + sizeof(WAVEFORMATEX))
{
ConnectSize += Format->DataFormat.FormatSize;
}
return KspCreateObjectType(FilterHandle,
L"{146F1A80-4791-11D0-A5D6-28DB04C10000}",
(PVOID)Connect,
ConnectSize,
DesiredAccess,
ConnectionHandle);
} }
KSDDKAPI NTSTATUS NTAPI KSDDKAPI NTSTATUS NTAPI

View file

@ -11,7 +11,15 @@ NewIKsDevice(IKsDevice** OutDevice);
#define TAG_KSDEVICE TAG('K', 'S', 'E', 'D') #define TAG_KSDEVICE TAG('K', 'S', 'E', 'D')
#define TAG_KSOBJECT_TAG TAG('K', 'S', 'O', 'H') #define TAG_KSOBJECT_TAG TAG('K', 'S', 'O', 'H')
NTSTATUS
NTAPI
KspCreateObjectType(
IN HANDLE ParentHandle,
IN LPWSTR ObjectType,
PVOID CreateParameters,
UINT CreateParametersSize,
IN ACCESS_MASK DesiredAccess,
OUT PHANDLE NodeHandle);

View file

@ -1,13 +1,65 @@
#include <ntddk.h> #include "priv.h"
#include <debug.h>
#include <ks.h>
/* =============================================================== /* ===============================================================
Topology Functions Topology Functions
*/ */
NTSTATUS
NTAPI
KspCreateObjectType(
IN HANDLE ParentHandle,
IN LPWSTR ObjectType,
PVOID CreateParameters,
UINT CreateParametersSize,
IN ACCESS_MASK DesiredAccess,
OUT PHANDLE NodeHandle)
{
NTSTATUS Status;
IO_STATUS_BLOCK IoStatusBlock;
OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING Name;
Name.Length = (wcslen(ObjectType) + 1) * sizeof(WCHAR) + CreateParametersSize;
Name.MaximumLength += sizeof(WCHAR);
Name.Buffer = ExAllocatePool(NonPagedPool, Name.MaximumLength);
if (!Name.Buffer)
{
return STATUS_INSUFFICIENT_RESOURCES;
}
wcscpy(Name.Buffer, ObjectType);
Name.Buffer[wcslen(ObjectType)] = '\\';
RtlMoveMemory(Name.Buffer + wcslen(ObjectType) +1, CreateParameters, CreateParametersSize);
Name.Buffer[Name.Length / 2] = L'\0';
InitializeObjectAttributes(&ObjectAttributes, &Name, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, ParentHandle, NULL);
Status = IoCreateFile(NodeHandle,
DesiredAccess,
&ObjectAttributes,
&IoStatusBlock,
NULL,
0,
0,
FILE_OPEN,
FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
0,
CreateFileTypeNone,
NULL,
IO_NO_PARAMETER_CHECKING | IO_FORCE_ACCESS_CHECK);
ExFreePool(Name.Buffer);
return Status;
}
/* /*
@unimplemented @implemented
*/ */
KSDDKAPI NTSTATUS NTAPI KSDDKAPI NTSTATUS NTAPI
KsCreateTopologyNode( KsCreateTopologyNode(
@ -16,8 +68,12 @@ KsCreateTopologyNode(
IN ACCESS_MASK DesiredAccess, IN ACCESS_MASK DesiredAccess,
OUT PHANDLE NodeHandle) OUT PHANDLE NodeHandle)
{ {
UNIMPLEMENTED; return KspCreateObjectType(ParentHandle,
return STATUS_UNSUCCESSFUL; L"{0621061A-EE75-11D0-B915-00A0C9223196}",
(PVOID)NodeCreate,
sizeof(KSNODE_CREATE),
DesiredAccess,
NodeHandle);
} }
/* /*