Author: janderwald Date: Fri Oct 2 23:55:53 2009 New Revision: 43258 URL: http://svn.reactos.org/svn/reactos?rev=43258&view=rev Log: - Add KSPROPSETID_Audio guid - Allocate data format after successful initialization of IPinWaveCyclic - Store Miniport Adapter in subdevice descriptor - Implement GUID_NULL handler for topology nodes - Implement setting / retrieving properties for topology nodes
Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/guids.cpp trunk/reactos/drivers/wdm/audio/backpln/portcls/interfaces.hpp trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.cpp trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.cpp trunk/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/guids.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/guids.cpp?rev=43258&r1=43257&r2=43258&view=diff ============================================================================== --- trunk/reactos/drivers/wdm/audio/backpln/portcls/guids.cpp [iso-8859-1] (original) +++ trunk/reactos/drivers/wdm/audio/backpln/portcls/guids.cpp [iso-8859-1] Fri Oct 2 23:55:53 2009 @@ -82,6 +82,7 @@ const GUID IID_IAllocatorMXF = {0xa5f0d62cL, 0xb30f, 0x11d2, {0xb7, 0xa3, 0x00, 0x60, 0x08, 0x33, 0x16, 0xc1}}; +const GUID KSPROPSETID_Audio = {0x45FFAAA0L, 0x6E1B, 0x11D0, {0xBC, 0xF2, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}; /// /// undocumented guids Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/interfaces.hpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/interfaces.hpp?rev=43258&r1=43257&r2=43258&view=diff ============================================================================== --- trunk/reactos/drivers/wdm/audio/backpln/portcls/interfaces.hpp [iso-8859-1] (original) +++ trunk/reactos/drivers/wdm/audio/backpln/portcls/interfaces.hpp [iso-8859-1] Fri Oct 2 23:55:53 2009 @@ -161,6 +161,8 @@ DEFINE_ABSTRACT_IRPTARGET() }; +typedef IIrpTarget *PIRPTARGET; + /***************************************************************************** * ISubdevice ***************************************************************************** @@ -212,6 +214,7 @@ LIST_ENTRY SymbolicLinkList; LIST_ENTRY PhysicalConnectionList; UNICODE_STRING RefString; + PUNKNOWN UnknownMiniport; }SUBDEVICE_DESCRIPTOR, *PSUBDEVICE_DESCRIPTOR; #undef INTERFACE Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp?rev=43258&r1=43257&r2=43258&view=diff ============================================================================== --- trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp [iso-8859-1] (original) +++ trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp [iso-8859-1] Fri Oct 2 23:55:53 2009 @@ -913,12 +913,6 @@ DPRINT("CPortPinWaveCyclic::Init entered Size %u\n", DataFormat->FormatSize); - m_Format = (PKSDATAFORMAT)ExAllocatePoolWithTag(NonPagedPool, DataFormat->FormatSize, TAG_PORTCLASS); - if (!m_Format) - return STATUS_INSUFFICIENT_RESOURCES; - - RtlMoveMemory(m_Format, DataFormat, DataFormat->FormatSize); - Status = NewIrpQueue(&m_IrpQueue); if (!NT_SUCCESS(Status)) return Status; @@ -943,7 +937,7 @@ NonPagedPool, ConnectDetails->PinId, Capture, - m_Format, + DataFormat, &m_DmaChannel, &m_ServiceGroup); #if 0 @@ -999,6 +993,13 @@ return Status; } + m_Format = (PKSDATAFORMAT)ExAllocatePoolWithTag(NonPagedPool, DataFormat->FormatSize, TAG_PORTCLASS); + if (!m_Format) + return STATUS_INSUFFICIENT_RESOURCES; + + RtlMoveMemory(m_Format, DataFormat, DataFormat->FormatSize); + + Port->AddRef(); Filter->AddRef(); Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.cpp?rev=43258&r1=43257&r2=43258&view=diff ============================================================================== --- trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.cpp [iso-8859-1] (original) +++ trunk/reactos/drivers/wdm/audio/backpln/portcls/port_topology.cpp [iso-8859-1] Fri Oct 2 23:55:53 2009 @@ -273,6 +273,12 @@ DPRINT("IPortTopology_fnInit success\n"); + if (NT_SUCCESS(Status)) + { + // store for node property requests + m_SubDeviceDescriptor->UnknownMiniport = UnknownMiniport; + } + return STATUS_SUCCESS; } @@ -455,7 +461,7 @@ DPRINT("CreatePinWorkerRoutine called\n"); // create the pin Status = WorkerContext->Filter->NewIrpTarget(&Pin, - NULL, + KSSTRING_Pin, NULL, NonPagedPool, DeviceObject, Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.cpp?rev=43258&r1=43257&r2=43258&view=diff ============================================================================== --- trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.cpp [iso-8859-1] (original) +++ trunk/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.cpp [iso-8859-1] Fri Oct 2 23:55:53 2009 @@ -298,6 +298,9 @@ return Status; } + // store for node property requests + m_SubDeviceDescriptor->UnknownMiniport = UnknownMiniport; + // check if it supports IPinCount interface Status = UnknownMiniport->QueryInterface(IID_IPinCount, (PVOID*)&PinCount); if (NT_SUCCESS(Status)) Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp?rev=43258&r1=43257&r2=43258&view=diff ============================================================================== --- trunk/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp [iso-8859-1] (original) +++ trunk/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp [iso-8859-1] Fri Oct 2 23:55:53 2009 @@ -51,8 +51,133 @@ IN PKSPROPERTY_SET PropertySet, IN PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor) { + NTSTATUS Status; + PIO_STACK_LOCATION IoStack; + PKSP_NODE Property; + PPCNODE_DESCRIPTOR Node; + PPCPROPERTY_ITEM PropertyItem; + ULONG Index; + LPGUID Buffer; + //PULONG Flags; + PPCPROPERTY_REQUEST PropertyRequest; + KSPROPERTY_ITEM_IRP_STORAGE(Irp) = (PKSPROPERTY_ITEM)SubDeviceDescriptor; - return KsPropertyHandler(Irp, PropertySetCount, PropertySet); + + /* try first KsPropertyHandler */ + Status = KsPropertyHandler(Irp, PropertySetCount, PropertySet); + + // get current irp stack location + IoStack = IoGetCurrentIrpStackLocation(Irp); + + // access property + Property = (PKSP_NODE)IoStack->Parameters.DeviceIoControl.Type3InputBuffer; + + // check if this a GUID_NULL request + if (Status == STATUS_NOT_FOUND) + { + if (IoStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(KSP_NODE)) + return Status; + + // check if its a request for a topology node + if (IsEqualGUIDAligned(Property->Property.Set, GUID_NULL) && Property->Property.Id == 0 && Property->Property.Flags == (KSPROPERTY_TYPE_SETSUPPORT | KSPROPERTY_TYPE_TOPOLOGY)) + { + if (Property->NodeId >= SubDeviceDescriptor->DeviceDescriptor->NodeCount) + { + // request is out of bounds + Irp->IoStatus.Information = 0; + return STATUS_INVALID_PARAMETER; + } + + Node = (PPCNODE_DESCRIPTOR)((ULONG_PTR)SubDeviceDescriptor->DeviceDescriptor->Nodes + (Property->NodeId * SubDeviceDescriptor->DeviceDescriptor->NodeSize)); + + PC_ASSERT(Node->AutomationTable); + PC_ASSERT(Node->AutomationTable->PropertyCount); + PC_ASSERT(Node->AutomationTable->PropertyItemSize); + + Irp->IoStatus.Information = sizeof(GUID) * Node->AutomationTable->PropertyCount; + if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(GUID) * Node->AutomationTable->PropertyCount) + { + // buffer too small + return STATUS_MORE_ENTRIES; + } + + PropertyItem = (PCPROPERTY_ITEM*)Node->AutomationTable->Properties; + Buffer = (LPGUID)Irp->UserBuffer; + + for(Index = 0; Index < Node->AutomationTable->PropertyCount; Index++) + { + RtlMoveMemory(Buffer, PropertyItem->Set, sizeof(GUID)); + Buffer++; + + PropertyItem = (PPCPROPERTY_ITEM)((ULONG_PTR)PropertyItem + Node->AutomationTable->PropertyItemSize); + } + return STATUS_SUCCESS; + } + else /*if (Property->Property.Flags == (KSPROPERTY_TYPE_BASICSUPPORT | KSPROPERTY_TYPE_TOPOLOGY) || + Property->Property.Flags == (KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_TOPOLOGY) || + Property->Property.Flags == (KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY)) */ + { + if (Property->NodeId >= SubDeviceDescriptor->DeviceDescriptor->NodeCount) + { + // request is out of bounds + Irp->IoStatus.Information = 0; + return STATUS_INVALID_PARAMETER; + } + + Node = (PPCNODE_DESCRIPTOR)((ULONG_PTR)SubDeviceDescriptor->DeviceDescriptor->Nodes + (Property->NodeId * SubDeviceDescriptor->DeviceDescriptor->NodeSize)); + + PC_ASSERT(Node->AutomationTable); + PC_ASSERT(Node->AutomationTable->PropertyCount); + PC_ASSERT(Node->AutomationTable->PropertyItemSize); + + PropertyItem = (PCPROPERTY_ITEM*)Node->AutomationTable->Properties; + //Flags = (PULONG)Irp->UserBuffer; + + for(Index = 0; Index < Node->AutomationTable->PropertyCount; Index++) + { + if (IsEqualGUIDAligned(*PropertyItem->Set, Property->Property.Set) && PropertyItem->Id == Property->Property.Id) + { + PropertyRequest = (PPCPROPERTY_REQUEST)AllocateItem(NonPagedPool, sizeof(PCPROPERTY_REQUEST), TAG_PORTCLASS); + if (!PropertyRequest) + return STATUS_INSUFFICIENT_RESOURCES; + + PC_ASSERT(SubDeviceDescriptor->UnknownMiniport); + PropertyRequest->MajorTarget = SubDeviceDescriptor->UnknownMiniport; + //PropertyRequest->MinorTarget = (PUNKNOWN)0xABADCAFE; + PropertyRequest->Irp = Irp; + PropertyRequest->Node = Property->NodeId; + PropertyRequest->PropertyItem = PropertyItem; + PropertyRequest->Verb = Property->Property.Flags; + PropertyRequest->InstanceSize = IoStack->Parameters.DeviceIoControl.InputBufferLength - sizeof(KSNODEPROPERTY); + PropertyRequest->Instance = (PVOID)((ULONG_PTR)IoStack->Parameters.DeviceIoControl.Type3InputBuffer + sizeof(KSNODEPROPERTY)); + PropertyRequest->ValueSize = IoStack->Parameters.DeviceIoControl.OutputBufferLength; + PropertyRequest->Value = Irp->UserBuffer; + + Status = PropertyItem->Handler(PropertyRequest); + + if (Status != STATUS_PENDING) + { + //DPRINT1("Status %x ValueSize %u + + Irp->IoStatus.Information = PropertyRequest->ValueSize; + ExFreePool(PropertyRequest); + } + return Status; + } + PropertyItem = (PPCPROPERTY_ITEM)((ULONG_PTR)PropertyItem + Node->AutomationTable->PropertyItemSize); + } + } +#if 0 + else + { + UNICODE_STRING GuidString; + RtlStringFromGUID(Property->Property.Set, &GuidString); + DPRINT1("Id %u Flags %x Set %S\n", Property->Property.Id, Property->Property.Flags, GuidString.Buffer); + DbgBreakPoint(); + } +#endif + } + return Status; } VOID @@ -102,6 +227,39 @@ { UNIMPLEMENTED; return STATUS_NOT_IMPLEMENTED; +} + +VOID +DumpFilterDescriptor( + IN PPCFILTER_DESCRIPTOR FilterDescription) +{ + ULONG Index; + PPCPROPERTY_ITEM PropertyItem; + UNICODE_STRING GuidString; + + DPRINT1("======================\n"); + DPRINT1("Descriptor Automation Table%p\n",FilterDescription->AutomationTable); + + if (FilterDescription->AutomationTable) + { + DPRINT1("FilterPropertiesCount %u FilterPropertySize %u Expected %u\n", FilterDescription->AutomationTable->PropertyCount, FilterDescription->AutomationTable->PropertyItemSize, sizeof(PCPROPERTY_ITEM)); + if (FilterDescription->AutomationTable->PropertyCount) + { + PropertyItem = (PPCPROPERTY_ITEM)FilterDescription->AutomationTable->Properties; + + for(Index = 0; Index < FilterDescription->AutomationTable->PropertyCount; Index++) + { + RtlStringFromGUID(*PropertyItem->Set, &GuidString); + DPRINT1("Index %u GUID %S Id %u Flags %x\n", Index, GuidString.Buffer, PropertyItem->Id, PropertyItem->Flags); + + PropertyItem = (PPCPROPERTY_ITEM)((ULONG_PTR)PropertyItem + FilterDescription->AutomationTable->PropertyItemSize); + } + } + } + + + DPRINT1("======================\n"); + DbgBreakPoint(); } NTSTATUS @@ -147,6 +305,9 @@ { /// FIXME /// handle driver properties + + //DumpFilterDescriptor(FilterDescription); + Descriptor->FilterPropertySet = (PKSPROPERTY_SET)AllocateItem(NonPagedPool, sizeof(KSPROPERTY_SET) * FilterPropertiesCount, TAG_PORTCLASS); if (! Descriptor->FilterPropertySet) goto cleanup;