- Start implementing KsValidateConnectRequest

- Pass OBJ_OPENIF flag to KspCreateObjectType
- KsCreatePin works now

svn path=/trunk/; revision=39650
This commit is contained in:
Johannes Anderwald 2009-02-17 19:30:40 +00:00
parent 3b2c9f5d55
commit 26f9765e9c
2 changed files with 72 additions and 5 deletions

View file

@ -1,6 +1,11 @@
#include "priv.h" #include "priv.h"
KSDDKAPI NTSTATUS NTAPI /*
@implemented
*/
KSDDKAPI
NTSTATUS
NTAPI
KsCreatePin( KsCreatePin(
IN HANDLE FilterHandle, IN HANDLE FilterHandle,
IN PKSPIN_CONNECT Connect, IN PKSPIN_CONNECT Connect,
@ -17,23 +22,83 @@ KsCreatePin(
} }
return KspCreateObjectType(FilterHandle, return KspCreateObjectType(FilterHandle,
L"{146F1A80-4791-11D0-A5D6-28DB04C10000}", L"{146F1A80-4791-11D0-A5D6-28DB04C10000}", //KSNAME_Pin
(PVOID)Connect, (PVOID)Connect,
ConnectSize, ConnectSize,
DesiredAccess, DesiredAccess,
ConnectionHandle); ConnectionHandle);
} }
KSDDKAPI NTSTATUS NTAPI /*
@unimplemented
*/
KSDDKAPI
NTSTATUS
NTAPI
KsValidateConnectRequest( KsValidateConnectRequest(
IN PIRP Irp, IN PIRP Irp,
IN ULONG DescriptorsCount, IN ULONG DescriptorsCount,
IN KSPIN_DESCRIPTOR* Descriptor, IN KSPIN_DESCRIPTOR* Descriptor,
OUT PKSPIN_CONNECT* Connect) OUT PKSPIN_CONNECT* Connect)
{ {
PIO_STACK_LOCATION IoStack;
PKSPIN_CONNECT ConnectDetails;
LPWSTR PinName = L"{146F1A80-4791-11D0-A5D6-28DB04C10000}\\";
PKSDATAFORMAT DataFormat;
IoStack = IoGetCurrentIrpStackLocation(Irp);
if (!IoStack->FileObject->FileName.Buffer)
return STATUS_INVALID_PARAMETER;
if (wcsncmp(IoStack->FileObject->FileName.Buffer, PinName, wcslen(PinName)))
return STATUS_INVALID_PARAMETER;
ConnectDetails = (PKSPIN_CONNECT)(IoStack->FileObject->FileName.Buffer + wcslen(PinName));
if (ConnectDetails->PinToHandle != NULL)
{
UNIMPLEMENTED
return STATUS_NOT_IMPLEMENTED;
}
if (IoStack->FileObject->FileName.Length < wcslen(PinName) + sizeof(KSPIN_CONNECT) + sizeof(KSDATAFORMAT))
return STATUS_INVALID_PARAMETER;
ConnectDetails = (PKSPIN_CONNECT)(IoStack->FileObject->FileName.Buffer + wcslen(PinName));
if (ConnectDetails->PinId >= DescriptorsCount)
return STATUS_INVALID_PARAMETER;
#if 0
if (!IsEqualGUIDAligned(&ConnectDetails->Interface.Set, &KSINTERFACESETID_Standard) &&
ConnectDetails->Interface.Id != KSINTERFACE_STANDARD_STREAMING)
{
//FIXME
// validate provided interface set
DPRINT1("FIXME\n");
}
if (!IsEqualGUIDAligned(&ConnectDetails->Medium.Set, &KSMEDIUMSETID_Standard) &&
ConnectDetails->Medium.Id != KSMEDIUM_TYPE_ANYINSTANCE)
{
//FIXME
// validate provided medium set
DPRINT1("FIXME\n");
}
#endif
/// FIXME
/// implement format checking
DataFormat = (PKSDATAFORMAT) (ConnectDetails + 1);
*Connect = ConnectDetails;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
/*
@implemented
*/
KSDDKAPI KSDDKAPI
NTSTATUS NTSTATUS
NTAPI NTAPI
@ -241,6 +306,9 @@ KsPinPropertyHandler(
return Irp->IoStatus.Status; return Irp->IoStatus.Status;
} }
/*
@implemented
*/
KSDDKAPI KSDDKAPI
NTSTATUS NTSTATUS
NTAPI NTAPI

View file

@ -34,8 +34,7 @@ KspCreateObjectType(
RtlMoveMemory(Name.Buffer + wcslen(ObjectType) +1, CreateParameters, CreateParametersSize); RtlMoveMemory(Name.Buffer + wcslen(ObjectType) +1, CreateParameters, CreateParametersSize);
Name.Buffer[Name.Length / 2] = L'\0'; Name.Buffer[Name.Length / 2] = L'\0';
InitializeObjectAttributes(&ObjectAttributes, &Name, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE | OBJ_OPENIF, ParentHandle, NULL);
InitializeObjectAttributes(&ObjectAttributes, &Name, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, ParentHandle, NULL);
Status = IoCreateFile(NodeHandle, Status = IoCreateFile(NodeHandle,