From eacb6ae11a02bf520abba8a86ecc39412b45ba0a Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sun, 18 Jan 2009 23:46:09 +0000 Subject: [PATCH] - Register all device interfaces identified in the subdevice descriptor - Add IUnknown to IInteruptSync interface - Handle IRP_MN_QUERY_INTERFACE - Create a subdevice descriptor for IPortWavePci, IPortWaveCyclic and IPortTopology and handle the respective ISubDevice::GetDescriptor - Always request PCFILTER_DESCRIPTOR regardless of present IPinCount interface - Check if IMiniportWavePci omits a IServiceGroup - Implement ISubDevice interface for IPortWavePci port driver - Add primitive implementation of PcCreateSubdeviceDescriptor - Intel AC97 audio driver now successfully initializes under Vbox svn path=/trunk/; revision=38923 --- .../wdm/audio/backpln/portcls/adapter.c | 34 +-- .../wdm/audio/backpln/portcls/interfaces.h | 8 +- .../wdm/audio/backpln/portcls/interrupt.c | 22 +- .../drivers/wdm/audio/backpln/portcls/irp.c | 14 +- .../wdm/audio/backpln/portcls/port_topology.c | 55 +++- .../audio/backpln/portcls/port_wavecyclic.c | 85 +++++- .../wdm/audio/backpln/portcls/port_wavepci.c | 264 +++++++++++++++++- .../wdm/audio/backpln/portcls/private.h | 18 +- .../wdm/audio/backpln/portcls/registry.c | 4 +- .../drivers/wdm/audio/backpln/portcls/undoc.c | 49 +++- 10 files changed, 486 insertions(+), 67 deletions(-) diff --git a/reactos/drivers/wdm/audio/backpln/portcls/adapter.c b/reactos/drivers/wdm/audio/backpln/portcls/adapter.c index 4232d4a030a..3d2eece742b 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/adapter.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/adapter.c @@ -260,8 +260,9 @@ PcRegisterSubdevice( PCExtension* DeviceExt; NTSTATUS Status; ISubdevice *SubDevice; - UNICODE_STRING ReferenceString; UNICODE_STRING SymbolicLinkName; + SUBDEVICE_DESCRIPTOR * SubDeviceDescriptor; + ULONG Index; DPRINT1("PcRegisterSubdevice DeviceObject %p Name %S Unknown %p\n", DeviceObject, Name, Unknown); @@ -293,25 +294,26 @@ PcRegisterSubdevice( } #endif - /* FIXME retrieve guid from subdescriptor */ - RtlInitUnicodeString(&ReferenceString, Name); - /* register device interface */ - Status = IoRegisterDeviceInterface(DeviceExt->PhysicalDeviceObject, - &GUID_DEVCLASS_SOUND, //FIXME - &ReferenceString, - &SymbolicLinkName); - if (NT_SUCCESS(Status)) + Status = SubDevice->lpVtbl->GetDescriptor(SubDevice, &SubDeviceDescriptor); + if (!NT_SUCCESS(Status)) { - Status = IoSetDeviceInterfaceState(&SymbolicLinkName, TRUE); - RtlFreeUnicodeString(&SymbolicLinkName); + DPRINT1("Failed to get subdevice descriptor %x\n", Status); + SubDevice->lpVtbl->Release(SubDevice); } - DPRINT1("PcRegisterSubdevice Status %x\n", Status); + for(Index = 0; Index < SubDeviceDescriptor->InterfaceCount; Index++) + { + Status = IoRegisterDeviceInterface(DeviceExt->PhysicalDeviceObject, + &SubDeviceDescriptor->Interfaces[Index], + NULL, + &SymbolicLinkName); + if (NT_SUCCESS(Status)) + { + IoSetDeviceInterfaceState(&SymbolicLinkName, TRUE); + RtlFreeUnicodeString(&SymbolicLinkName); + } + } - /// HACK - /// IoRegisterDeviceInterface fails with - /// STATUS_OBJECT_PATH_NOT_FOUND - /// return Status; return STATUS_SUCCESS; } diff --git a/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h b/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h index 0cbe4070e4a..20ec322dd98 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h +++ b/reactos/drivers/wdm/audio/backpln/portcls/interfaces.h @@ -96,8 +96,12 @@ DECLARE_INTERFACE_(IIrpTarget, IUnknown) */ struct IIrpTargetFactory; -struct SUBDEVICE_DESCRIPTOR; +typedef struct +{ + ULONG InterfaceCount; + GUID *Interfaces; +}SUBDEVICE_DESCRIPTOR, *PSUBDEVICE_DESCRIPTOR; #undef INTERFACE #define INTERFACE ISubdevice @@ -123,7 +127,7 @@ DECLARE_INTERFACE_(ISubdevice, IUnknown) STDMETHOD_(NTSTATUS, ReleaseChildren)(THIS) PURE; STDMETHOD_(NTSTATUS, GetDescriptor)(THIS_ - IN struct SUBDEVICE_DESCRIPTOR **) PURE; + IN SUBDEVICE_DESCRIPTOR **) PURE; STDMETHOD_(NTSTATUS, DataRangeIntersection)(THIS_ IN ULONG PinId, diff --git a/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c b/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c index eb2032b58bd..dbd416441bb 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/interrupt.c @@ -41,10 +41,11 @@ IInterruptSync_fnQueryInterface( DPRINT1("IInterruptSync_fnQueryInterface: This %p\n", This); - if (IsEqualGUIDAligned(refiid, &IID_IInterruptSync)) + if (IsEqualGUIDAligned(refiid, &IID_IInterruptSync) || + IsEqualGUIDAligned(refiid, &IID_IUnknown)) { *Output = &This->lpVtbl; - _InterlockedIncrement(&This->ref); + InterlockedIncrement(&This->ref); return STATUS_SUCCESS; } DPRINT1("IInterruptSync_fnQueryInterface: This %p UNKNOWN interface requested\n", This); @@ -60,7 +61,7 @@ IInterruptSync_fnAddRef( DPRINT1("IInterruptSync_AddRef: This %p\n", This); - return _InterlockedIncrement(&This->ref); + return InterlockedIncrement(&This->ref); } ULONG @@ -72,7 +73,7 @@ IInterruptSync_fnRelease( PSYNC_ENTRY Entry; IInterruptSyncImpl * This = (IInterruptSyncImpl*)iface; - _InterlockedDecrement(&This->ref); + InterlockedDecrement(&This->ref); DPRINT1("IInterruptSync_Release: This %p new ref %u\n", This, This->ref); @@ -105,7 +106,7 @@ IInterruptSynchronizedRoutine( IN PVOID ServiceContext) { IInterruptSyncImpl * This = (IInterruptSyncImpl*)ServiceContext; - DPRINT1("IInterruptSynchronizedRoutine This %p SyncRoutine%p\n", This, This->SyncRoutine); + DPRINT1("IInterruptSynchronizedRoutine This %p SyncRoutine %p Context %p\n", This, This->SyncRoutine, This->DynamicContext); return This->SyncRoutine((IInterruptSync*)&This->lpVtbl, This->DynamicContext); } @@ -241,14 +242,16 @@ IInterruptSync_fnConnect( Status = IoConnectInterrupt(&This->Interrupt, IInterruptServiceRoutine, (PVOID)This, - &This->Lock, Descriptor->u.Interrupt.Vector, + &This->Lock, + Descriptor->u.Interrupt.Vector, Descriptor->u.Interrupt.Level, Descriptor->u.Interrupt.Level, //FIXME LevelSensitive, //FIXME - TRUE, //FIXME + TRUE, Descriptor->u.Interrupt.Affinity, FALSE); + DPRINT1("IInterruptSync_fnConnect result %x\n", Status); return Status; } @@ -314,7 +317,7 @@ static IInterruptSyncVtbl vt_IInterruptSyncVtbl = }; /* - * @unimplemented + * @implemented */ NTSTATUS NTAPI PcNewInterruptSync( @@ -326,7 +329,8 @@ PcNewInterruptSync( { IInterruptSyncImpl * This; - DPRINT1("PcNewInterruptSync entered\n"); + DPRINT1("PcNewInterruptSync entered OutInterruptSync %p OuterUnknown %p ResourceList %p ResourceIndex %u Mode %d\n", + OutInterruptSync, OuterUnknown, ResourceList, ResourceIndex, Mode); if (!OutInterruptSync || !ResourceList || Mode > InterruptSyncModeRepeat || Mode < 0) return STATUS_INVALID_PARAMETER; diff --git a/reactos/drivers/wdm/audio/backpln/portcls/irp.c b/reactos/drivers/wdm/audio/backpln/portcls/irp.c index 2b382d0dc41..712e5578e33 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/irp.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/irp.c @@ -129,6 +129,7 @@ PortClsPnp( Irp->IoStatus.Status = STATUS_SUCCESS; IoCompleteRequest(Irp, IO_NO_INCREMENT); + return status; } else if ( irp_stack->MinorFunction == IRP_MN_REMOVE_DEVICE ) { @@ -140,6 +141,7 @@ PortClsPnp( /* Do not complete? */ Irp->IoStatus.Status = STATUS_SUCCESS; + return STATUS_SUCCESS; } else if ( irp_stack->MinorFunction == IRP_MN_QUERY_INTERFACE ) { @@ -148,7 +150,11 @@ PortClsPnp( Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; return Irp->IoStatus.Status; } - + else if ( irp_stack->MinorFunction == IRP_MN_QUERY_DEVICE_RELATIONS) + { + Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + return Irp->IoStatus.Status; + } DPRINT1("unhandled function %u\n", irp_stack->MinorFunction); return STATUS_SUCCESS; @@ -302,11 +308,13 @@ return STATUS_SUCCESS; /* initialize the notification event */ KeInitializeEvent(&Event, NotificationEvent, FALSE); + /* setup a completion routine */ + IoSetCompletionRoutine(Irp, IrpCompletionRoutine, (PVOID)&Event, TRUE, FALSE, FALSE); + /* copy the current stack location */ IoCopyCurrentIrpStackLocationToNext(Irp); - /* setup a completion routine */ - IoSetCompletionRoutine(Irp, IrpCompletionRoutine, (PVOID)&Event, TRUE, FALSE, FALSE); + DPRINT1("PcForwardIrpSynchronous %p Irp %p\n", DeviceExt->PrevDeviceObject, Irp); /* now call the driver */ Status = IoCallDriver(DeviceExt->PrevDeviceObject, Irp); diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c b/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c index e32a2ad55a7..150ab270156 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/port_topology.c @@ -13,9 +13,23 @@ typedef struct PPINCOUNT pPinCount; PPOWERNOTIFY pPowerNotify; + PPCFILTER_DESCRIPTOR pDescriptor; + PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor; }IPortTopologyImpl; +static GUID InterfaceGuids[3] = +{ + { + /// KS_CATEGORY_TOPOLOGY + 0xDDA54A40, 0x1E4C, 0x11D1, {0xA0, 0x50, 0x40, 0x57, 0x05, 0xC1, 0x00, 0x00} + }, + { + /// KS_CATEGORY_AUDIO + 0x6994AD04, 0x93EF, 0x11D0, {0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96} + } +}; + #if 0 static KSPROPERTY_SET PinPropertySet = @@ -72,11 +86,10 @@ IPortTopology_fnQueryInterface( { return NewPortClsVersion((PPORTCLSVERSION*)Output); } + StringFromCLSID(refiid, Buffer); DPRINT1("IPortTopology_fnQueryInterface no iface %S\n", Buffer); - StringFromCLSID(&IID_IUnknown, Buffer); - DPRINT1("IPortTopology_fnQueryInterface IUnknown %S\n", Buffer); - + KeBugCheckEx(0, 0, 0, 0, 0); return STATUS_UNSUCCESSFUL; } @@ -168,16 +181,43 @@ IPortTopology_fnInit( This->pDeviceObject = DeviceObject; This->bInitialized = TRUE; + /* increment reference on miniport adapter */ + Miniport->lpVtbl->AddRef(Miniport); + Status = Miniport->lpVtbl->Init(Miniport, UnknownAdapter, ResourceList, iface); if (!NT_SUCCESS(Status)) { DPRINT1("IPortTopology_Init failed with %x\n", Status); This->bInitialized = FALSE; + Miniport->lpVtbl->Release(Miniport); return Status; } - /* increment reference on miniport adapter */ - Miniport->lpVtbl->AddRef(Miniport); + /* get the miniport device descriptor */ + Status = Miniport->lpVtbl->GetDescription(Miniport, &This->pDescriptor); + if (!NT_SUCCESS(Status)) + { + DPRINT1("failed to get description\n"); + Miniport->lpVtbl->Release(Miniport); + This->bInitialized = FALSE; + return Status; + } + + /* create the subdevice descriptor */ + Status = PcCreateSubdeviceDescriptor(&This->SubDeviceDescriptor, + 2, + InterfaceGuids, + 0, + NULL, + 0, + NULL, + 0, + 0, + 0, + NULL, + 0, + NULL, + This->pDescriptor); DPRINT1("IPortTopology_fnInit success\n"); @@ -302,12 +342,13 @@ NTSTATUS NTAPI ISubDevice_fnGetDescriptor( IN ISubdevice *iface, - IN struct SUBDEVICE_DESCRIPTOR ** Descriptor) + IN SUBDEVICE_DESCRIPTOR ** Descriptor) { IPortTopologyImpl * This = (IPortTopologyImpl*)CONTAINING_RECORD(iface, IPortTopologyImpl, lpVtblSubDevice); DPRINT1("ISubDevice_GetDescriptor this %p\n", This); - return STATUS_UNSUCCESSFUL; + *Descriptor = This->SubDeviceDescriptor; + return STATUS_SUCCESS; } static diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c b/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c index 5e69657cdde..22c5ba6ad77 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/port_wavecyclic.c @@ -18,11 +18,40 @@ typedef struct PPINCOUNT pPinCount; PPOWERNOTIFY pPowerNotify; PPCFILTER_DESCRIPTOR pDescriptor; - + PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor; }IPortWaveCyclicImpl; +static GUID InterfaceGuids[3] = +{ + { + /// KSCATEGORY_RENDER + 0x65E8773EL, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96} + }, + { + /// KSCATEGORY_CAPTURE + 0x65E8773DL, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96} + }, + { + /// KS_CATEGORY_AUDIO + 0x6994AD04, 0x93EF, 0x11D0, {0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96} + } +}; -const GUID GUID_DEVCLASS_SOUND; //FIXME +#if 0 +static const KSIDENTIFIER Identifiers[] = +{ + { + &KSINTERFACESETID_Standard, + 0, + 0 + }, + { + &KSINTERFACESETID_Standard, + 1, + 0 + } +}; +#endif //--------------------------------------------------------------- // IPortEvents @@ -276,6 +305,41 @@ IPortWaveCyclic_fnInit( return Status; } + + /* get the miniport device descriptor */ + Status = Miniport->lpVtbl->GetDescription(Miniport, &This->pDescriptor); + if (!NT_SUCCESS(Status)) + { + DPRINT1("failed to get description\n"); + Miniport->lpVtbl->Release(Miniport); + This->bInitialized = FALSE; + return Status; + } + + /* create the subdevice descriptor */ + Status = PcCreateSubdeviceDescriptor(&This->SubDeviceDescriptor, + 3, + InterfaceGuids, + 0, + NULL, + 0, + NULL, + 0, + 0, + 0, + NULL, + 0, + NULL, + This->pDescriptor); + + if (!NT_SUCCESS(Status)) + { + DPRINT1("PcCreateSubdeviceDescriptor failed with %x\n", Status); + Miniport->lpVtbl->Release(Miniport); + This->bInitialized = FALSE; + return Status; + } + /* check if it supports IPinCount interface */ Status = UnknownMiniport->lpVtbl->QueryInterface(UnknownMiniport, &IID_IPinCount, (PVOID*)&PinCount); if (NT_SUCCESS(Status)) @@ -283,17 +347,6 @@ IPortWaveCyclic_fnInit( /* store IPinCount interface */ This->pPinCount = PinCount; } - else - { - /* check if the miniport adapter provides a valid device descriptor */ - Status = Miniport->lpVtbl->GetDescription(Miniport, &This->pDescriptor); - if (!NT_SUCCESS(Status)) - { - DPRINT1("failed to get description\n"); - Miniport->lpVtbl->Release(Miniport); - return Status; - } - } /* does the Miniport adapter support IPowerNotify interface*/ Status = UnknownMiniport->lpVtbl->QueryInterface(UnknownMiniport, &IID_IPowerNotify, (PVOID*)&PowerNotify); @@ -510,12 +563,14 @@ NTSTATUS NTAPI ISubDevice_fnGetDescriptor( IN ISubdevice *iface, - IN struct SUBDEVICE_DESCRIPTOR ** Descriptor) + IN SUBDEVICE_DESCRIPTOR ** Descriptor) { IPortWaveCyclicImpl * This = (IPortWaveCyclicImpl*)CONTAINING_RECORD(iface, IPortWaveCyclicImpl, lpVtblSubDevice); + *Descriptor = This->SubDeviceDescriptor; + DPRINT1("ISubDevice_GetDescriptor this %p\n", This); - return STATUS_UNSUCCESSFUL; + return STATUS_SUCCESS; } static diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c b/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c index 1ff5bccb708..0611957fd3a 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.c @@ -5,6 +5,7 @@ typedef struct IPortWavePciVtbl *lpVtbl; IServiceSinkVtbl *lpVtblServiceSink; IPortEventsVtbl *lpVtblPortEvents; + ISubdeviceVtbl *lpVtblSubDevice; #if 0 IUnregisterSubdevice *lpVtblUnregisterSubDevice; @@ -17,8 +18,28 @@ typedef struct BOOL bInitialized; PRESOURCELIST pResourceList; PSERVICEGROUP ServiceGroup; + PPINCOUNT pPinCount; + PPOWERNOTIFY pPowerNotify; + PPCFILTER_DESCRIPTOR pDescriptor; + PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor; }IPortWavePciImpl; +static GUID InterfaceGuids[3] = +{ + { + /// KSCATEGORY_RENDER + 0x65E8773EL, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96} + }, + { + /// KSCATEGORY_CAPTURE + 0x65E8773DL, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96} + }, + { + /// KS_CATEGORY_AUDIO + 0x6994AD04, 0x93EF, 0x11D0, {0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96} + } +}; + //--------------------------------------------------------------- // IPortEvents @@ -225,6 +246,12 @@ IPortWavePci_fnQueryInterface( InterlockedIncrement(&This->ref); return STATUS_SUCCESS; } + else if (IsEqualGUIDAligned(refiid, &IID_ISubdevice)) + { + *Output = &This->lpVtblSubDevice; + InterlockedIncrement(&This->ref); + return STATUS_SUCCESS; + } else if (IsEqualGUIDAligned(refiid, &IID_IPortClsVersion)) { return NewPortClsVersion((PPORTCLSVERSION*)Output); @@ -303,6 +330,8 @@ IPortWavePci_fnInit( IMiniportWavePci * Miniport; PSERVICEGROUP ServiceGroup; NTSTATUS Status; + PPINCOUNT PinCount; + PPOWERNOTIFY PowerNotify; IPortWavePciImpl * This = (IPortWavePciImpl*)iface; DPRINT1("IPortWavePci_fnInit entered with This %p, DeviceObject %p Irp %p UnknownMiniport %p, UnknownAdapter %p ResourceList %p\n", @@ -348,17 +377,70 @@ IPortWavePci_fnInit( return Status; } - /* store service group */ - This->ServiceGroup = ServiceGroup; + /* check if the miniport adapter provides a valid device descriptor */ + Status = Miniport->lpVtbl->GetDescription(Miniport, &This->pDescriptor); + if (!NT_SUCCESS(Status)) + { + DPRINT1("failed to get description\n"); + Miniport->lpVtbl->Release(Miniport); + This->bInitialized = FALSE; + return Status; + } - /* add ourselves to service group which is called when miniport receives an isr */ - ServiceGroup->lpVtbl->AddMember(ServiceGroup, (PSERVICESINK)&This->lpVtblServiceSink); + /* create the subdevice descriptor */ + Status = PcCreateSubdeviceDescriptor(&This->SubDeviceDescriptor, + 3, + InterfaceGuids, + 0, + NULL, + 0, + NULL, + 0, + 0, + 0, + NULL, + 0, + NULL, + This->pDescriptor); - /* increment reference on service group */ - ServiceGroup->lpVtbl->AddRef(ServiceGroup); + if (!NT_SUCCESS(Status)) + { + DPRINT1("PcCreateSubdeviceDescriptor failed with %x\n", Status); + Miniport->lpVtbl->Release(Miniport); + This->bInitialized = FALSE; + return Status; + } + /* did we get a service group */ + if (ServiceGroup) + { + /* store service group in context */ + This->ServiceGroup = ServiceGroup; - DPRINT("IPortWaveCyclic_Init sucessfully initialized\n"); + /* add ourselves to service group which is called when miniport receives an isr */ + ServiceGroup->lpVtbl->AddMember(ServiceGroup, (PSERVICESINK)&This->lpVtblServiceSink); + + /* increment reference on service group */ + ServiceGroup->lpVtbl->AddRef(ServiceGroup); + } + + /* check if it supports IPinCount interface */ + Status = UnknownMiniport->lpVtbl->QueryInterface(UnknownMiniport, &IID_IPinCount, (PVOID*)&PinCount); + if (NT_SUCCESS(Status)) + { + /* store IPinCount interface */ + This->pPinCount = PinCount; + } + + /* does the Miniport adapter support IPowerNotify interface*/ + Status = UnknownMiniport->lpVtbl->QueryInterface(UnknownMiniport, &IID_IPowerNotify, (PVOID*)&PowerNotify); + if (NT_SUCCESS(Status)) + { + /* store reference */ + This->pPowerNotify = PowerNotify; + } + + DPRINT("IPortWavePci_Init sucessfully initialized\n"); return STATUS_SUCCESS; } @@ -380,7 +462,7 @@ IPortWavePci_fnNewRegistryKey( if (!This->bInitialized) { - DPRINT("IPortWaveCyclic_fnNewRegistryKey called w/o initiazed\n"); + DPRINT("IPortWavePci_fnNewRegistryKey called w/o initiazed\n"); return STATUS_UNSUCCESSFUL; } @@ -410,7 +492,7 @@ IPortWavePci_fnGetDeviceProperty( if (!This->bInitialized) { - DPRINT("IPortWaveCyclic_fnNewRegistryKey called w/o initiazed\n"); + DPRINT("IPortWavePci_fnNewRegistryKey called w/o initiazed\n"); return STATUS_UNSUCCESSFUL; } @@ -483,6 +565,169 @@ static IPortWavePciVtbl vt_IPortWavePci = IPortWavePci_fnNewMasterDmaChannel, }; +//--------------------------------------------------------------- +// ISubdevice interface +// + +static +NTSTATUS +NTAPI +ISubDevice_fnQueryInterface( + IN ISubdevice *iface, + IN REFIID InterfaceId, + IN PVOID* Interface) +{ + IPortWavePciImpl * This = (IPortWavePciImpl*)CONTAINING_RECORD(iface, IPortWavePciImpl, lpVtblSubDevice); + + return IPortWavePci_fnQueryInterface((IPortWavePci*)This, InterfaceId, Interface); +} + +static +ULONG +NTAPI +ISubDevice_fnAddRef( + IN ISubdevice *iface) +{ + IPortWavePciImpl * This = (IPortWavePciImpl*)CONTAINING_RECORD(iface, IPortWavePciImpl, lpVtblSubDevice); + + return IPortWavePci_fnAddRef((IPortWavePci*)This); +} + +static +ULONG +NTAPI +ISubDevice_fnRelease( + IN ISubdevice *iface) +{ + IPortWavePciImpl * This = (IPortWavePciImpl*)CONTAINING_RECORD(iface, IPortWavePciImpl, lpVtblSubDevice); + + return IPortWavePci_fnRelease((IPortWavePci*)This); +} + +static +NTSTATUS +NTAPI +ISubDevice_fnNewIrpTarget( + IN ISubdevice *iface, + OUT struct IIrpTarget **OutTarget, + IN WCHAR * Name, + IN PUNKNOWN Unknown, + IN POOL_TYPE PoolType, + IN PDEVICE_OBJECT * DeviceObject, + IN PIRP Irp, + IN KSOBJECT_CREATE *CreateObject) +{ + IPortWavePciImpl * This = (IPortWavePciImpl*)CONTAINING_RECORD(iface, IPortWavePciImpl, lpVtblSubDevice); + + DPRINT1("ISubDevice_NewIrpTarget this %p\n", This); + return STATUS_UNSUCCESSFUL; +} + +static +NTSTATUS +NTAPI +ISubDevice_fnReleaseChildren( + IN ISubdevice *iface) +{ + IPortWavePciImpl * This = (IPortWavePciImpl*)CONTAINING_RECORD(iface, IPortWavePciImpl, lpVtblSubDevice); + + DPRINT1("ISubDevice_ReleaseChildren this %p\n", This); + return STATUS_UNSUCCESSFUL; +} + +static +NTSTATUS +NTAPI +ISubDevice_fnGetDescriptor( + IN ISubdevice *iface, + IN SUBDEVICE_DESCRIPTOR ** Descriptor) +{ + IPortWavePciImpl * This = (IPortWavePciImpl*)CONTAINING_RECORD(iface, IPortWavePciImpl, lpVtblSubDevice); + + DPRINT1("ISubDevice_GetDescriptor this %p\n", This); + *Descriptor = This->SubDeviceDescriptor; + return STATUS_SUCCESS; +} + +static +NTSTATUS +NTAPI +ISubDevice_fnDataRangeIntersection( + IN ISubdevice *iface, + IN ULONG PinId, + IN PKSDATARANGE DataRange, + IN PKSDATARANGE MatchingDataRange, + IN ULONG OutputBufferLength, + OUT PVOID ResultantFormat OPTIONAL, + OUT PULONG ResultantFormatLength) +{ + IPortWavePciImpl * This = (IPortWavePciImpl*)CONTAINING_RECORD(iface, IPortWavePciImpl, lpVtblSubDevice); + + DPRINT("ISubDevice_DataRangeIntersection this %p\n", This); + + if (This->Miniport) + { + return This->Miniport->lpVtbl->DataRangeIntersection (This->Miniport, PinId, DataRange, MatchingDataRange, OutputBufferLength, ResultantFormat, ResultantFormatLength); + } + + return STATUS_UNSUCCESSFUL; +} + +static +NTSTATUS +NTAPI +ISubDevice_fnPowerChangeNotify( + IN ISubdevice *iface, + IN POWER_STATE PowerState) +{ + IPortWavePciImpl * This = (IPortWavePciImpl*)CONTAINING_RECORD(iface, IPortWavePciImpl, lpVtblSubDevice); + + if (This->pPowerNotify) + { + This->pPowerNotify->lpVtbl->PowerChangeNotify(This->pPowerNotify, PowerState); + } + + return STATUS_SUCCESS; +} + +static +NTSTATUS +NTAPI +ISubDevice_fnPinCount( + IN ISubdevice *iface, + IN ULONG PinId, + IN OUT PULONG FilterNecessary, + IN OUT PULONG FilterCurrent, + IN OUT PULONG FilterPossible, + IN OUT PULONG GlobalCurrent, + IN OUT PULONG GlobalPossible) +{ + IPortWavePciImpl * This = (IPortWavePciImpl*)CONTAINING_RECORD(iface, IPortWavePciImpl, lpVtblSubDevice); + + if (This->pPinCount) + { + This->pPinCount->lpVtbl->PinCount(This->pPinCount, PinId, FilterNecessary, FilterCurrent, FilterPossible, GlobalCurrent, GlobalPossible); + return STATUS_SUCCESS; + } + + /* FIXME + * scan filter descriptor + */ + return STATUS_UNSUCCESSFUL; +} + +static ISubdeviceVtbl vt_ISubdeviceVtbl = +{ + ISubDevice_fnQueryInterface, + ISubDevice_fnAddRef, + ISubDevice_fnRelease, + ISubDevice_fnNewIrpTarget, + ISubDevice_fnReleaseChildren, + ISubDevice_fnGetDescriptor, + ISubDevice_fnDataRangeIntersection, + ISubDevice_fnPowerChangeNotify, + ISubDevice_fnPinCount +}; NTSTATUS NewPortWavePci( @@ -496,6 +741,7 @@ NewPortWavePci( This->lpVtblServiceSink = &vt_IServiceSink; This->lpVtbl = &vt_IPortWavePci; + This->lpVtblSubDevice = &vt_ISubdeviceVtbl; This->lpVtblPortEvents = &vt_IPortEvents; This->ref = 1; diff --git a/reactos/drivers/wdm/audio/backpln/portcls/private.h b/reactos/drivers/wdm/audio/backpln/portcls/private.h index ff8f432e3ca..6f7cc78cb47 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/private.h +++ b/reactos/drivers/wdm/audio/backpln/portcls/private.h @@ -157,6 +157,22 @@ PcDmaSlaveDescription( IN ULONG DmaPort, OUT PDEVICE_DESCRIPTION DeviceDescription); - +NTSTATUS +NTAPI +PcCreateSubdeviceDescriptor( + OUT SUBDEVICE_DESCRIPTOR ** OutSubdeviceDescriptor, + IN ULONG InterfaceCount, + IN GUID * InterfaceGuids, + IN ULONG IdentifierCount, + IN KSIDENTIFIER *Identifier, + IN ULONG FilterPropertiesCount, + IN KSPROPERTY_SET * FilterProperties, + IN ULONG Unknown1, + IN ULONG Unknown2, + IN ULONG PinPropertiesCount, + IN KSPROPERTY_SET * PinProperties, + IN ULONG EventSetCount, + IN KSEVENT_SET * EventSet, + IN PPCFILTER_DESCRIPTOR FilterDescription); #endif diff --git a/reactos/drivers/wdm/audio/backpln/portcls/registry.c b/reactos/drivers/wdm/audio/backpln/portcls/registry.c index 59ceb29e276..175d41b0898 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/registry.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/registry.c @@ -22,7 +22,7 @@ IRegistryKey_fnAddRef( DPRINT("IRegistryKey_AddRef: This %p\n", This); - return _InterlockedIncrement(&This->ref); + return InterlockedIncrement(&This->ref); } ULONG @@ -32,7 +32,7 @@ IRegistryKey_fnRelease( { IRegistryKeyImpl * This = (IRegistryKeyImpl*)iface; - _InterlockedDecrement(&This->ref); + InterlockedDecrement(&This->ref); DPRINT1("IRegistryKey_fnRelease ref %u this %p entered\n", This->ref, This); if (This->ref == 0) { diff --git a/reactos/drivers/wdm/audio/backpln/portcls/undoc.c b/reactos/drivers/wdm/audio/backpln/portcls/undoc.c index 3b579049ab0..13e110ad448 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/undoc.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/undoc.c @@ -79,12 +79,55 @@ PcCaptureFormat( return STATUS_NOT_IMPLEMENTED; } + +/* + * @unimplemented + */ NTSTATUS +NTAPI PcCreateSubdeviceDescriptor( - /* TODO */ ) + OUT SUBDEVICE_DESCRIPTOR ** OutSubdeviceDescriptor, + IN ULONG InterfaceCount, + IN GUID * InterfaceGuids, + IN ULONG IdentifierCount, + IN KSIDENTIFIER *Identifier, + IN ULONG FilterPropertiesCount, + IN KSPROPERTY_SET * FilterProperties, + IN ULONG Unknown1, + IN ULONG Unknown2, + IN ULONG PinPropertiesCount, + IN KSPROPERTY_SET * PinProperties, + IN ULONG EventSetCount, + IN KSEVENT_SET * EventSet, + IN PPCFILTER_DESCRIPTOR FilterDescription) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + SUBDEVICE_DESCRIPTOR * Descriptor; + NTSTATUS Status = STATUS_INSUFFICIENT_RESOURCES; + + Descriptor = AllocateItem(NonPagedPool, sizeof(SUBDEVICE_DESCRIPTOR), TAG_PORTCLASS); + if (!Descriptor) + return STATUS_INSUFFICIENT_RESOURCES; + + Descriptor->Interfaces = AllocateItem(NonPagedPool, sizeof(GUID) * InterfaceCount, TAG_PORTCLASS); + if (!Descriptor->Interfaces) + goto cleanup; + + /* copy interface guids */ + RtlCopyMemory(Descriptor->Interfaces, InterfaceGuids, sizeof(GUID) * InterfaceCount); + Descriptor->InterfaceCount = InterfaceCount; + + *OutSubdeviceDescriptor = Descriptor; + return STATUS_SUCCESS; + +cleanup: + if (Descriptor) + { + if (Descriptor->Interfaces) + FreeItem(Descriptor->Interfaces, TAG_PORTCLASS); + + FreeItem(Descriptor, TAG_PORTCLASS); + } + return Status; } /* PcDeleteSubdeviceDescriptor */