diff --git a/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.c b/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.c index f0649f0818f..c017d19d004 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.c @@ -33,13 +33,19 @@ IPortFilterWaveCyclic_fnQueryInterface( IPortFilterWaveCyclicImpl * This = (IPortFilterWaveCyclicImpl*)iface; if (IsEqualGUIDAligned(refiid, &IID_IIrpTarget) || - //IsEqualGUIDAligned(refiid, &IID_IPortFilterWaveCyclic) || IsEqualGUIDAligned(refiid, &IID_IUnknown)) { *Output = &This->lpVtbl; InterlockedIncrement(&This->ref); return STATUS_SUCCESS; } + else if (IsEqualGUIDAligned(refiid, &IID_IPort)) + { + *Output = This->Port; + This->Port->lpVtbl->AddRef(This->Port); + return STATUS_SUCCESS; + } + return STATUS_UNSUCCESSFUL; } diff --git a/reactos/drivers/wdm/audio/backpln/portcls/propertyhandler.c b/reactos/drivers/wdm/audio/backpln/portcls/propertyhandler.c index 75b97a5a049..b040ed082c9 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/propertyhandler.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/propertyhandler.c @@ -65,6 +65,74 @@ HandleNecessaryPropertyInstances( return STATUS_SUCCESS; } +NTSTATUS +HandleDataIntersection( + IN PIRP Irp, + IN PKSIDENTIFIER Request, + IN OUT PVOID Data, + IN PSUBDEVICE_DESCRIPTOR Descriptor) +{ + IIrpTarget * IrpTarget; + IPort *Port; + ISubdevice *SubDevice; + KSP_PIN * Pin = (KSP_PIN*)Request; + PKSOBJECT_CREATE_ITEM CreateItem; + PKSMULTIPLE_ITEM MultipleItem; + PKSDATARANGE DataRange; + PIO_STACK_LOCATION IoStack; + NTSTATUS Status; + ULONG Index, Length; + + /* Access the create item */ + CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp); + /* Get the IrpTarget */ + IrpTarget = (IIrpTarget*)CreateItem->Context; + /* Get the parent */ + Status = IrpTarget->lpVtbl->QueryInterface(IrpTarget, &IID_IPort, (PVOID*)&Port); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to obtain IPort interface from filter\n"); + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + return STATUS_UNSUCCESSFUL; + } + + /* Get private ISubdevice interface */ + Status = Port->lpVtbl->QueryInterface(Port, &IID_ISubdevice, (PVOID*)&SubDevice); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to obtain ISubdevice interface from port driver\n"); + KeBugCheck(0); + } + + /* Access parameters */ + MultipleItem = (PKSMULTIPLE_ITEM)(Request + 1); + DataRange = (PKSDATARANGE)(MultipleItem + 1); + + /* Get current stack location */ + IoStack = IoGetCurrentIrpStackLocation(Irp); + + for(Index = 0; Index < MultipleItem->Count; Index++) + { + /* Call miniport's properitary handler */ + Status = SubDevice->lpVtbl->DataRangeIntersection(SubDevice, Pin->PinId, DataRange, (PKSDATARANGE)&Descriptor->Factory.KsPinDescriptor[Pin->PinId].DataRanges[0], + IoStack->Parameters.DeviceIoControl.OutputBufferLength, Data, &Length); + + if (Status == STATUS_SUCCESS) + { + Irp->IoStatus.Information = Length; + break; + } + DataRange = UlongToPtr(PtrToUlong(DataRange) + DataRange->FormatSize); + } + + /* Release reference */ + Port->lpVtbl->Release(Port); + + Irp->IoStatus.Status = Status; + return Status; +} + NTSTATUS NTAPI @@ -103,6 +171,8 @@ PinPropertyHandler( break; case KSPROPERTY_PIN_DATAINTERSECTION: + Status = HandleDataIntersection(Irp, Request, Data, Descriptor); + break; case KSPROPERTY_PIN_PHYSICALCONNECTION: case KSPROPERTY_PIN_CONSTRAINEDDATARANGES: DPRINT1("Unhandled %x\n", Request->Id); @@ -141,7 +211,7 @@ PcPropertyHandler( PFNKSHANDLER PropertyHandler = NULL; UNICODE_STRING GuidString; NTSTATUS Status = STATUS_UNSUCCESSFUL; - PCPROPERTY_REQUEST PropertyRequest; + PPCPROPERTY_REQUEST PropertyRequest; IoStack = IoGetCurrentIrpStackLocation(Irp); @@ -159,17 +229,25 @@ PcPropertyHandler( { if(Descriptor->DeviceDescriptor->AutomationTable->Properties[Index].Flags & Property->Flags) { - RtlZeroMemory(&PropertyRequest, sizeof(PCPROPERTY_REQUEST)); - PropertyRequest.PropertyItem = &Descriptor->DeviceDescriptor->AutomationTable->Properties[Index]; - PropertyRequest.Verb = Property->Flags; - PropertyRequest.Value = Irp->UserBuffer; - PropertyRequest.ValueSize = IoStack->Parameters.DeviceIoControl.OutputBufferLength; - PropertyRequest.Irp = Irp; + PropertyRequest = ExAllocatePool(NonPagedPool, sizeof(PCPROPERTY_REQUEST)); + if (!PropertyRequest) + { + /* no memory */ + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_INSUFFICIENT_RESOURCES; + } + RtlZeroMemory(PropertyRequest, sizeof(PCPROPERTY_REQUEST)); + PropertyRequest->PropertyItem = &Descriptor->DeviceDescriptor->AutomationTable->Properties[Index]; + PropertyRequest->Verb = Property->Flags; + PropertyRequest->Value = Irp->UserBuffer; + PropertyRequest->ValueSize = IoStack->Parameters.DeviceIoControl.OutputBufferLength; + PropertyRequest->Irp = Irp; DPRINT("Calling handler %p\n", Descriptor->DeviceDescriptor->AutomationTable->Properties[Index].Handler); - Status = Descriptor->DeviceDescriptor->AutomationTable->Properties[Index].Handler(&PropertyRequest); + Status = Descriptor->DeviceDescriptor->AutomationTable->Properties[Index].Handler(PropertyRequest); - Irp->IoStatus.Information = PropertyRequest.ValueSize; Irp->IoStatus.Status = Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); return Status; @@ -236,5 +314,3 @@ PcPropertyHandler( IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_NOT_IMPLEMENTED; } - -