From 7f8d4df605edaa1df38a0b5ab580fde852cec9a5 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Tue, 17 Feb 2009 03:07:30 +0000 Subject: [PATCH] - Implement KsPinPropertyHandler svn path=/trunk/; revision=39633 --- reactos/drivers/ksfilter/ks/connectivity.c | 200 ++++++++++++++++++++- 1 file changed, 198 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/ksfilter/ks/connectivity.c b/reactos/drivers/ksfilter/ks/connectivity.c index 0274df46d09..7cb54bd1ee7 100644 --- a/reactos/drivers/ksfilter/ks/connectivity.c +++ b/reactos/drivers/ksfilter/ks/connectivity.c @@ -34,7 +34,9 @@ KsValidateConnectRequest( return STATUS_SUCCESS; } -KSDDKAPI NTSTATUS NTAPI +KSDDKAPI +NTSTATUS +NTAPI KsPinPropertyHandler( IN PIRP Irp, IN PKSPROPERTY Property, @@ -42,7 +44,201 @@ KsPinPropertyHandler( IN ULONG DescriptorsCount, IN const KSPIN_DESCRIPTOR* Descriptor) { - return STATUS_SUCCESS; + KSP_PIN * Pin; + KSMULTIPLE_ITEM * Item; + PIO_STACK_LOCATION IoStack; + ULONG Size; + PVOID Buffer; + + IoStack = IoGetCurrentIrpStackLocation(Irp); + Buffer = Irp->UserBuffer; + + if (Property->Flags != KSPROPERTY_TYPE_GET) + { + Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; + Irp->IoStatus.Information = 0; + return STATUS_NOT_IMPLEMENTED; + } + + switch(Property->Id) + { + case KSPROPERTY_PIN_CTYPES: + (*(PULONG)Buffer) = DescriptorsCount; + Irp->IoStatus.Information = sizeof(ULONG); + Irp->IoStatus.Status = STATUS_SUCCESS; + break; + case KSPROPERTY_PIN_DATAFLOW: + Pin = (KSP_PIN*)Property; + if (Pin->PinId >= DescriptorsCount) + { + Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; + Irp->IoStatus.Information = 0; + break; + } + Size = sizeof(KSPIN_DATAFLOW); + if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < Size) + { + Irp->IoStatus.Information = Size; + Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; + break; + } + + *((KSPIN_DATAFLOW*)Buffer) = Descriptor[Pin->PinId].DataFlow; + Irp->IoStatus.Information = sizeof(KSPIN_DATAFLOW); + Irp->IoStatus.Status = STATUS_SUCCESS; + break; + + case KSPROPERTY_PIN_DATARANGES: + Pin = (KSP_PIN*)Property; + if (Pin->PinId >= DescriptorsCount) + { + Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; + Irp->IoStatus.Information = 0; + break; + } + + Size = sizeof(KSMULTIPLE_ITEM) + sizeof(KSDATARANGE) * Descriptor[Pin->PinId].DataRangesCount; + + if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < Size) + { + Irp->IoStatus.Information = Size; + Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; + break; + } + + Item = (KSMULTIPLE_ITEM*)Buffer; + Item->Size = Size; + Item->Count = Descriptor[Pin->PinId].DataRangesCount; + RtlMoveMemory((PVOID)(Item + 1), Descriptor[Pin->PinId].DataRanges, Descriptor[Pin->PinId].DataRangesCount * sizeof(KSDATARANGE)); + + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = Size; + break; + case KSPROPERTY_PIN_INTERFACES: + Pin = (KSP_PIN*)Property; + if (Pin->PinId >= DescriptorsCount) + { + Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; + Irp->IoStatus.Information = 0; + break; + } + + Size = sizeof(KSMULTIPLE_ITEM) + sizeof(KSPIN_INTERFACE) * Descriptor[Pin->PinId].InterfacesCount; + + if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < Size) + { + Irp->IoStatus.Information = Size; + Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; + break; + } + + Item = (KSMULTIPLE_ITEM*)Buffer; + Item->Size = Size; + Item->Count = Descriptor[Pin->PinId].InterfacesCount; + RtlMoveMemory((PVOID)(Item + 1), Descriptor[Pin->PinId].Interfaces, Descriptor[Pin->PinId].InterfacesCount * sizeof(KSDATARANGE)); + + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = Size; + break; + case KSPROPERTY_PIN_MEDIUMS: + Pin = (KSP_PIN*)Property; + if (Pin->PinId >= DescriptorsCount) + { + Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; + Irp->IoStatus.Information = 0; + break; + } + + Size = sizeof(KSMULTIPLE_ITEM) + sizeof(KSPIN_MEDIUM) * Descriptor[Pin->PinId].MediumsCount; + if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < Size) + { + Irp->IoStatus.Information = Size; + Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; + break; + } + + Item = (KSMULTIPLE_ITEM*)Buffer; + Item->Size = Size; + Item->Count = Descriptor[Pin->PinId].MediumsCount; + RtlMoveMemory((PVOID)(Item + 1), Descriptor[Pin->PinId].Mediums, Descriptor[Pin->PinId].MediumsCount * sizeof(KSDATARANGE)); + + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = Size; + break; + + case KSPROPERTY_PIN_COMMUNICATION: + Pin = (KSP_PIN*)Property; + if (Pin->PinId >= DescriptorsCount) + { + Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; + Irp->IoStatus.Information = 0; + break; + } + + Size = sizeof(KSPIN_COMMUNICATION); + if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < Size) + { + Irp->IoStatus.Information = Size; + Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; + break; + } + + *((KSPIN_COMMUNICATION*)Buffer) = Descriptor[Pin->PinId].Communication; + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = Size; + break; + + case KSPROPERTY_PIN_CATEGORY: + Pin = (KSP_PIN*)Property; + if (Pin->PinId >= DescriptorsCount) + { + Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; + Irp->IoStatus.Information = 0; + break; + } + + Size = sizeof(GUID); + if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < Size) + { + Irp->IoStatus.Information = Size; + Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; + break; + } + + RtlMoveMemory(Buffer, &Descriptor[Pin->PinId].Category, sizeof(GUID)); + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = Size; + break; + + case KSPROPERTY_PIN_NAME: + Pin = (KSP_PIN*)Property; + if (Pin->PinId >= DescriptorsCount) + { + Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; + Irp->IoStatus.Information = 0; + break; + } + + Size = sizeof(GUID); + if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < Size) + { + Irp->IoStatus.Information = Size; + Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; + break; + } + + + RtlMoveMemory(Buffer, &Descriptor[Pin->PinId].Name, sizeof(GUID)); + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = Size; + break; + default: + DPRINT1("Unhandled property request %x\n", Property->Id); + Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; + Irp->IoStatus.Information = 0; + } + + return Irp->IoStatus.Status; } KSDDKAPI NTSTATUS NTAPI