2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel Streaming
4 * FILE: drivers/wdm/audio/backpln/portcls/port_wavepci.c
5 * PURPOSE: Wave PCI Port driver
6 * PROGRAMMER: Johannes Anderwald
13 IPortWavePciVtbl
*lpVtbl
;
14 IServiceSinkVtbl
*lpVtblServiceSink
;
15 IPortEventsVtbl
*lpVtblPortEvents
;
16 ISubdeviceVtbl
*lpVtblSubDevice
;
19 IUnregisterSubdevice
*lpVtblUnregisterSubDevice
;
23 PMINIPORTWAVEPCI Miniport
;
24 PDEVICE_OBJECT pDeviceObject
;
26 PRESOURCELIST pResourceList
;
27 PSERVICEGROUP ServiceGroup
;
29 PPOWERNOTIFY pPowerNotify
;
30 PPCFILTER_DESCRIPTOR pDescriptor
;
31 PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor
;
32 IPortFilterWavePci
* Filter
;
35 KSPIN_LOCK EventListLock
;
39 static GUID InterfaceGuids
[3] =
43 0x65E8773EL
, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
46 /// KSCATEGORY_CAPTURE
47 0x65E8773DL
, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
51 0x6994AD04, 0x93EF, 0x11D0, {0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
55 DEFINE_KSPROPERTY_TOPOLOGYSET(PortFilterWavePciTopologySet
, TopologyPropertyHandler
);
56 DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(PortFilterWavePciPinSet
, PinPropertyHandler
, PinPropertyHandler
, PinPropertyHandler
);
58 KSPROPERTY_SET WavePciPropertySet
[] =
61 &KSPROPSETID_Topology
,
62 sizeof(PortFilterWavePciTopologySet
) / sizeof(KSPROPERTY_ITEM
),
63 (const KSPROPERTY_ITEM
*)&PortFilterWavePciTopologySet
,
69 sizeof(PortFilterWavePciPinSet
) / sizeof(KSPROPERTY_ITEM
),
70 (const KSPROPERTY_ITEM
*)&PortFilterWavePciPinSet
,
77 //---------------------------------------------------------------
84 IPortEvents_fnQueryInterface(
89 IPortWavePciImpl
* This
= (IPortWavePciImpl
*)CONTAINING_RECORD(iface
, IPortWavePciImpl
, lpVtblPortEvents
);
91 DPRINT("IPortEvents_fnQueryInterface entered\n");
93 if (IsEqualGUIDAligned(refiid
, &IID_IPortEvents
) ||
94 IsEqualGUIDAligned(refiid
, &IID_IUnknown
))
96 *Output
= &This
->lpVtblPortEvents
;
97 InterlockedIncrement(&This
->ref
);
98 return STATUS_SUCCESS
;
100 return STATUS_UNSUCCESSFUL
;
106 IPortEvents_fnAddRef(
109 IPortWavePciImpl
* This
= (IPortWavePciImpl
*)CONTAINING_RECORD(iface
, IPortWavePciImpl
, lpVtblPortEvents
);
110 DPRINT("IPortEvents_fnAddRef entered\n");
111 return InterlockedIncrement(&This
->ref
);
117 IPortEvents_fnRelease(
120 IPortWavePciImpl
* This
= (IPortWavePciImpl
*)CONTAINING_RECORD(iface
, IPortWavePciImpl
, lpVtblPortEvents
);
121 DPRINT("IPortEvents_fnRelease entered\n");
122 InterlockedDecrement(&This
->ref
);
126 FreeItem(This
, TAG_PORTCLASS
);
129 /* Return new reference count */
136 IPortEvents_fnAddEventToEventList(
138 IN PKSEVENT_ENTRY EventEntry
)
141 IPortWavePciImpl
* This
= (IPortWavePciImpl
*)CONTAINING_RECORD(iface
, IPortWavePciImpl
, lpVtblPortEvents
);
143 ASSERT_IRQL_EQUAL(PASSIVE_LEVEL
);
145 KeAcquireSpinLock(&This
->EventListLock
, &OldIrql
);
146 InsertTailList(&This
->EventList
, &EventEntry
->ListEntry
);
147 KeReleaseSpinLock(&This
->EventListLock
, OldIrql
);
154 IPortEvents_fnGenerateEventList(
156 IN GUID
* Set OPTIONAL
,
166 static IPortEventsVtbl vt_IPortEvents
=
168 IPortEvents_fnQueryInterface
,
169 IPortEvents_fnAddRef
,
170 IPortEvents_fnRelease
,
171 IPortEvents_fnAddEventToEventList
,
172 IPortEvents_fnGenerateEventList
175 //---------------------------------------------------------------
182 IServiceSink_fnQueryInterface(
187 IPortWavePciImpl
* This
= (IPortWavePciImpl
*)CONTAINING_RECORD(iface
, IPortWavePciImpl
, lpVtblServiceSink
);
189 DPRINT("IServiceSink_fnQueryInterface entered\n");
191 if (IsEqualGUIDAligned(refiid
, &IID_IServiceSink
) ||
192 IsEqualGUIDAligned(refiid
, &IID_IUnknown
))
194 *Output
= &This
->lpVtblServiceSink
;
195 InterlockedIncrement(&This
->ref
);
196 return STATUS_SUCCESS
;
198 return STATUS_UNSUCCESSFUL
;
204 IServiceSink_fnAddRef(
207 IPortWavePciImpl
* This
= (IPortWavePciImpl
*)CONTAINING_RECORD(iface
, IPortWavePciImpl
, lpVtblServiceSink
);
208 DPRINT("IServiceSink_fnAddRef entered\n");
209 return InterlockedIncrement(&This
->ref
);
215 IServiceSink_fnRelease(
218 IPortWavePciImpl
* This
= (IPortWavePciImpl
*)CONTAINING_RECORD(iface
, IPortWavePciImpl
, lpVtblServiceSink
);
219 DPRINT("IServiceSink_fnRelease entered\n");
220 InterlockedDecrement(&This
->ref
);
224 FreeItem(This
, TAG_PORTCLASS
);
227 /* Return new reference count */
234 IServiceSink_fnRequestService(
237 IPortWavePciImpl
* This
= (IPortWavePciImpl
*)CONTAINING_RECORD(iface
, IPortWavePciImpl
, lpVtblServiceSink
);
238 //DPRINT("IServiceSink_fnRequestService entered\n");
241 This
->Miniport
->lpVtbl
->Service(This
->Miniport
);
245 static IServiceSinkVtbl vt_IServiceSink
=
247 IServiceSink_fnQueryInterface
,
248 IServiceSink_fnAddRef
,
249 IServiceSink_fnRelease
,
250 IServiceSink_fnRequestService
253 //---------------------------------------------------------------
260 IPortWavePci_fnQueryInterface(
265 UNICODE_STRING GuidString
;
266 IPortWavePciImpl
* This
= (IPortWavePciImpl
*)iface
;
268 DPRINT("IPortWavePci_fnQueryInterface entered\n");
270 if (IsEqualGUIDAligned(refiid
, &IID_IPortWavePci
) ||
271 IsEqualGUIDAligned(refiid
, &IID_IUnknown
))
273 *Output
= &This
->lpVtbl
;
274 InterlockedIncrement(&This
->ref
);
275 return STATUS_SUCCESS
;
277 else if (IsEqualGUIDAligned(refiid
, &IID_IServiceSink
))
279 *Output
= &This
->lpVtblServiceSink
;
280 InterlockedIncrement(&This
->ref
);
281 return STATUS_SUCCESS
;
283 else if (IsEqualGUIDAligned(refiid
, &IID_IPortEvents
))
285 *Output
= &This
->lpVtblPortEvents
;
286 InterlockedIncrement(&This
->ref
);
287 return STATUS_SUCCESS
;
289 else if (IsEqualGUIDAligned(refiid
, &IID_ISubdevice
))
291 *Output
= &This
->lpVtblSubDevice
;
292 InterlockedIncrement(&This
->ref
);
293 return STATUS_SUCCESS
;
295 else if (IsEqualGUIDAligned(refiid
, &IID_IPortClsVersion
))
297 return NewPortClsVersion((PPORTCLSVERSION
*)Output
);
299 else if (IsEqualGUIDAligned(refiid
, &IID_IUnregisterSubdevice
))
301 return NewIUnregisterSubdevice((PUNREGISTERSUBDEVICE
*)Output
);
303 else if (IsEqualGUIDAligned(refiid
, &IID_IUnregisterPhysicalConnection
))
305 return NewIUnregisterPhysicalConnection((PUNREGISTERPHYSICALCONNECTION
*)Output
);
308 if (RtlStringFromGUID(refiid
, &GuidString
) == STATUS_SUCCESS
)
310 DPRINT1("IPortWavePci_fnQueryInterface no interface!!! iface %S\n", GuidString
.Buffer
);
311 RtlFreeUnicodeString(&GuidString
);
314 return STATUS_UNSUCCESSFUL
;
320 IPortWavePci_fnAddRef(
323 IPortWavePciImpl
* This
= (IPortWavePciImpl
*)iface
;
325 DPRINT("IPortWavePci_fnAddRef entered\n");
327 return InterlockedIncrement(&This
->ref
);
333 IPortWavePci_fnRelease(
336 IPortWavePciImpl
* This
= (IPortWavePciImpl
*)iface
;
338 DPRINT("IPortWavePci_fnRelease entered\n");
340 InterlockedDecrement(&This
->ref
);
344 FreeItem(This
, TAG_PORTCLASS
);
347 /* Return new reference count */
354 IN IPortWavePci
* iface
,
355 IN PDEVICE_OBJECT DeviceObject
,
357 IN PUNKNOWN UnknownMiniport
,
358 IN PUNKNOWN UnknownAdapter OPTIONAL
,
359 IN PRESOURCELIST ResourceList
)
361 IMiniportWavePci
* Miniport
;
362 PSERVICEGROUP ServiceGroup
;
365 PPOWERNOTIFY PowerNotify
;
366 IPortWavePciImpl
* This
= (IPortWavePciImpl
*)iface
;
368 DPRINT("IPortWavePci_fnInit entered with This %p, DeviceObject %p Irp %p UnknownMiniport %p, UnknownAdapter %p ResourceList %p\n",
369 This
, DeviceObject
, Irp
, UnknownMiniport
, UnknownAdapter
, ResourceList
);
370 ASSERT_IRQL_EQUAL(PASSIVE_LEVEL
);
372 if (This
->bInitialized
)
374 DPRINT("IPortWavePci_fnInit called again\n");
375 return STATUS_SUCCESS
;
378 Status
= UnknownMiniport
->lpVtbl
->QueryInterface(UnknownMiniport
, &IID_IMiniportWavePci
, (PVOID
*)&Miniport
);
379 if (!NT_SUCCESS(Status
))
381 DPRINT("IPortWavePci_fnInit called with invalid IMiniport adapter\n");
382 return STATUS_INVALID_PARAMETER
;
385 /* Initialize port object */
386 This
->Miniport
= Miniport
;
387 This
->pDeviceObject
= DeviceObject
;
388 This
->bInitialized
= TRUE
;
389 This
->pResourceList
= ResourceList
;
390 InitializeListHead(&This
->EventList
);
391 KeInitializeSpinLock(&This
->EventListLock
);
393 /* increment reference on miniport adapter */
394 Miniport
->lpVtbl
->AddRef(Miniport
);
395 /* increment reference on resource list */
396 ResourceList
->lpVtbl
->AddRef(ResourceList
);
398 Status
= Miniport
->lpVtbl
->Init(Miniport
, UnknownAdapter
, ResourceList
, iface
, &ServiceGroup
);
399 if (!NT_SUCCESS(Status
))
401 DPRINT("IPortWavePci_fnInit failed with %x\n", Status
);
402 This
->bInitialized
= FALSE
;
403 /* release reference on miniport adapter */
404 Miniport
->lpVtbl
->Release(Miniport
);
405 /* increment reference on resource list */
406 ResourceList
->lpVtbl
->Release(ResourceList
);
410 /* check if the miniport adapter provides a valid device descriptor */
411 Status
= Miniport
->lpVtbl
->GetDescription(Miniport
, &This
->pDescriptor
);
412 if (!NT_SUCCESS(Status
))
414 DPRINT1("failed to get description\n");
415 Miniport
->lpVtbl
->Release(Miniport
);
416 This
->bInitialized
= FALSE
;
420 /* create the subdevice descriptor */
421 Status
= PcCreateSubdeviceDescriptor(&This
->SubDeviceDescriptor
,
437 if (!NT_SUCCESS(Status
))
439 DPRINT1("PcCreateSubdeviceDescriptor failed with %x\n", Status
);
440 Miniport
->lpVtbl
->Release(Miniport
);
441 This
->bInitialized
= FALSE
;
445 /* did we get a service group */
448 /* store service group in context */
449 This
->ServiceGroup
= ServiceGroup
;
451 /* add ourselves to service group which is called when miniport receives an isr */
452 ServiceGroup
->lpVtbl
->AddMember(ServiceGroup
, (PSERVICESINK
)&This
->lpVtblServiceSink
);
454 /* increment reference on service group */
455 ServiceGroup
->lpVtbl
->AddRef(ServiceGroup
);
458 /* check if it supports IPinCount interface */
459 Status
= UnknownMiniport
->lpVtbl
->QueryInterface(UnknownMiniport
, &IID_IPinCount
, (PVOID
*)&PinCount
);
460 if (NT_SUCCESS(Status
))
462 /* store IPinCount interface */
463 This
->pPinCount
= PinCount
;
466 /* does the Miniport adapter support IPowerNotify interface*/
467 Status
= UnknownMiniport
->lpVtbl
->QueryInterface(UnknownMiniport
, &IID_IPowerNotify
, (PVOID
*)&PowerNotify
);
468 if (NT_SUCCESS(Status
))
470 /* store reference */
471 This
->pPowerNotify
= PowerNotify
;
474 DPRINT("IPortWavePci_Init sucessfully initialized\n");
475 return STATUS_SUCCESS
;
480 IPortWavePci_fnNewRegistryKey(
481 IN IPortWavePci
* iface
,
482 OUT PREGISTRYKEY
*OutRegistryKey
,
483 IN PUNKNOWN OuterUnknown OPTIONAL
,
484 IN ULONG RegistryKeyType
,
485 IN ACCESS_MASK DesiredAccess
,
486 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
487 IN ULONG CreateOptions OPTIONAL
,
488 OUT PULONG Disposition OPTIONAL
)
490 IPortWavePciImpl
* This
= (IPortWavePciImpl
*)iface
;
492 DPRINT("IPortWavePci_fnNewRegistryKey entered\n");
493 ASSERT_IRQL_EQUAL(PASSIVE_LEVEL
);
495 if (!This
->bInitialized
)
497 DPRINT("IPortWavePci_fnNewRegistryKey called w/o initiazed\n");
498 return STATUS_UNSUCCESSFUL
;
501 return PcNewRegistryKey(OutRegistryKey
,
514 IPortWavePci_fnGetDeviceProperty(
515 IN IPortWavePci
* iface
,
516 IN DEVICE_REGISTRY_PROPERTY DeviceRegistryProperty
,
517 IN ULONG BufferLength
,
518 OUT PVOID PropertyBuffer
,
519 OUT PULONG ReturnLength
)
521 IPortWavePciImpl
* This
= (IPortWavePciImpl
*)iface
;
523 DPRINT("IPortWavePci_fnGetDeviceProperty entered\n");
524 ASSERT_IRQL_EQUAL(PASSIVE_LEVEL
);
526 if (!This
->bInitialized
)
528 DPRINT("IPortWavePci_fnNewRegistryKey called w/o initiazed\n");
529 return STATUS_UNSUCCESSFUL
;
532 return IoGetDeviceProperty(This
->pDeviceObject
, DeviceRegistryProperty
, BufferLength
, PropertyBuffer
, ReturnLength
);
537 IPortWavePci_fnNewMasterDmaChannel(
538 IN IPortWavePci
* iface
,
539 OUT PDMACHANNEL
*DmaChannel
,
540 IN PUNKNOWN OuterUnknown OPTIONAL
,
541 IN POOL_TYPE PoolType
,
542 IN PRESOURCELIST ResourceList OPTIONAL
,
543 IN BOOLEAN ScatterGather
,
544 IN BOOLEAN Dma32BitAddresses
,
545 IN BOOLEAN Dma64BitAddresses
,
546 IN BOOLEAN IgnoreCount
,
547 IN DMA_WIDTH DmaWidth
,
548 IN DMA_SPEED DmaSpeed
,
549 IN ULONG MaximumLength
,
553 DEVICE_DESCRIPTION DeviceDescription
;
554 IPortWavePciImpl
* This
= (IPortWavePciImpl
*)iface
;
556 DPRINT("IPortWavePci_fnNewMasterDmaChannel This %p entered\n", This
);
557 ASSERT_IRQL_EQUAL(PASSIVE_LEVEL
);
559 Status
= PcDmaMasterDescription(ResourceList
, ScatterGather
, Dma32BitAddresses
, IgnoreCount
, Dma64BitAddresses
, DmaWidth
, DmaSpeed
, MaximumLength
, DmaPort
, &DeviceDescription
);
560 if (NT_SUCCESS(Status
))
562 return PcNewDmaChannel(DmaChannel
, OuterUnknown
, PoolType
, &DeviceDescription
, This
->pDeviceObject
);
570 IPortWavePci_fnNotify(
571 IN IPortWavePci
* iface
,
572 IN PSERVICEGROUP ServiceGroup
)
574 //IPortWavePciImpl * This = (IPortWavePciImpl*)iface;
576 //DPRINT("IPortWavePci_fnNotify entered %p, ServiceGroup %p\n", This, ServiceGroup);
580 ServiceGroup
->lpVtbl
->RequestService (ServiceGroup
);
584 static IPortWavePciVtbl vt_IPortWavePci
=
586 /* IUnknown methods */
587 IPortWavePci_fnQueryInterface
,
588 IPortWavePci_fnAddRef
,
589 IPortWavePci_fnRelease
,
592 IPortWavePci_fnGetDeviceProperty
,
593 IPortWavePci_fnNewRegistryKey
,
594 /* IPortWavePci methods */
595 IPortWavePci_fnNotify
,
596 IPortWavePci_fnNewMasterDmaChannel
,
599 //---------------------------------------------------------------
600 // ISubdevice interface
606 ISubDevice_fnQueryInterface(
607 IN ISubdevice
*iface
,
608 IN REFIID InterfaceId
,
611 IPortWavePciImpl
* This
= (IPortWavePciImpl
*)CONTAINING_RECORD(iface
, IPortWavePciImpl
, lpVtblSubDevice
);
613 return IPortWavePci_fnQueryInterface((IPortWavePci
*)This
, InterfaceId
, Interface
);
620 IN ISubdevice
*iface
)
622 IPortWavePciImpl
* This
= (IPortWavePciImpl
*)CONTAINING_RECORD(iface
, IPortWavePciImpl
, lpVtblSubDevice
);
624 return IPortWavePci_fnAddRef((IPortWavePci
*)This
);
630 ISubDevice_fnRelease(
631 IN ISubdevice
*iface
)
633 IPortWavePciImpl
* This
= (IPortWavePciImpl
*)CONTAINING_RECORD(iface
, IPortWavePciImpl
, lpVtblSubDevice
);
635 return IPortWavePci_fnRelease((IPortWavePci
*)This
);
641 ISubDevice_fnNewIrpTarget(
642 IN ISubdevice
*iface
,
643 OUT
struct IIrpTarget
**OutTarget
,
646 IN POOL_TYPE PoolType
,
647 IN PDEVICE_OBJECT DeviceObject
,
649 IN KSOBJECT_CREATE
*CreateObject
)
652 IPortFilterWavePci
* Filter
;
653 IPortWavePciImpl
* This
= (IPortWavePciImpl
*)CONTAINING_RECORD(iface
, IPortWavePciImpl
, lpVtblSubDevice
);
655 DPRINT("ISubDevice_NewIrpTarget this %p\n", This
);
659 *OutTarget
= (IIrpTarget
*)This
->Filter
;
660 return STATUS_SUCCESS
;
663 Status
= NewPortFilterWavePci(&Filter
);
664 if (!NT_SUCCESS(Status
))
669 Status
= Filter
->lpVtbl
->Init(Filter
, (IPortWavePci
*)This
);
670 if (!NT_SUCCESS(Status
))
672 Filter
->lpVtbl
->Release(Filter
);
676 *OutTarget
= (IIrpTarget
*)Filter
;
677 This
->Filter
= Filter
;
684 ISubDevice_fnReleaseChildren(
685 IN ISubdevice
*iface
)
687 //IPortWavePciImpl * This = (IPortWavePciImpl*)CONTAINING_RECORD(iface, IPortWavePciImpl, lpVtblSubDevice);
690 return STATUS_UNSUCCESSFUL
;
696 ISubDevice_fnGetDescriptor(
697 IN ISubdevice
*iface
,
698 IN SUBDEVICE_DESCRIPTOR
** Descriptor
)
700 IPortWavePciImpl
* This
= (IPortWavePciImpl
*)CONTAINING_RECORD(iface
, IPortWavePciImpl
, lpVtblSubDevice
);
702 DPRINT1("ISubDevice_GetDescriptor this %p\n", This
);
703 *Descriptor
= This
->SubDeviceDescriptor
;
704 return STATUS_SUCCESS
;
710 ISubDevice_fnDataRangeIntersection(
711 IN ISubdevice
*iface
,
713 IN PKSDATARANGE DataRange
,
714 IN PKSDATARANGE MatchingDataRange
,
715 IN ULONG OutputBufferLength
,
716 OUT PVOID ResultantFormat OPTIONAL
,
717 OUT PULONG ResultantFormatLength
)
719 IPortWavePciImpl
* This
= (IPortWavePciImpl
*)CONTAINING_RECORD(iface
, IPortWavePciImpl
, lpVtblSubDevice
);
721 DPRINT("ISubDevice_DataRangeIntersection this %p\n", This
);
725 return This
->Miniport
->lpVtbl
->DataRangeIntersection (This
->Miniport
, PinId
, DataRange
, MatchingDataRange
, OutputBufferLength
, ResultantFormat
, ResultantFormatLength
);
728 return STATUS_UNSUCCESSFUL
;
734 ISubDevice_fnPowerChangeNotify(
735 IN ISubdevice
*iface
,
736 IN POWER_STATE PowerState
)
738 IPortWavePciImpl
* This
= (IPortWavePciImpl
*)CONTAINING_RECORD(iface
, IPortWavePciImpl
, lpVtblSubDevice
);
740 if (This
->pPowerNotify
)
742 This
->pPowerNotify
->lpVtbl
->PowerChangeNotify(This
->pPowerNotify
, PowerState
);
745 return STATUS_SUCCESS
;
751 ISubDevice_fnPinCount(
752 IN ISubdevice
*iface
,
754 IN OUT PULONG FilterNecessary
,
755 IN OUT PULONG FilterCurrent
,
756 IN OUT PULONG FilterPossible
,
757 IN OUT PULONG GlobalCurrent
,
758 IN OUT PULONG GlobalPossible
)
760 IPortWavePciImpl
* This
= (IPortWavePciImpl
*)CONTAINING_RECORD(iface
, IPortWavePciImpl
, lpVtblSubDevice
);
764 This
->pPinCount
->lpVtbl
->PinCount(This
->pPinCount
, PinId
, FilterNecessary
, FilterCurrent
, FilterPossible
, GlobalCurrent
, GlobalPossible
);
765 return STATUS_SUCCESS
;
769 * scan filter descriptor
771 return STATUS_UNSUCCESSFUL
;
774 static ISubdeviceVtbl vt_ISubdeviceVtbl
=
776 ISubDevice_fnQueryInterface
,
778 ISubDevice_fnRelease
,
779 ISubDevice_fnNewIrpTarget
,
780 ISubDevice_fnReleaseChildren
,
781 ISubDevice_fnGetDescriptor
,
782 ISubDevice_fnDataRangeIntersection
,
783 ISubDevice_fnPowerChangeNotify
,
784 ISubDevice_fnPinCount
791 IPortWavePciImpl
* This
;
793 This
= AllocateItem(NonPagedPool
, sizeof(IPortWavePciImpl
), TAG_PORTCLASS
);
795 return STATUS_INSUFFICIENT_RESOURCES
;
797 This
->lpVtblServiceSink
= &vt_IServiceSink
;
798 This
->lpVtbl
= &vt_IPortWavePci
;
799 This
->lpVtblSubDevice
= &vt_ISubdeviceVtbl
;
800 This
->lpVtblPortEvents
= &vt_IPortEvents
;
803 *OutPort
= (PPORT
)&This
->lpVtbl
;
804 DPRINT("NewPortWavePci %p\n", *OutPort
);
805 return STATUS_SUCCESS
;
809 GetDeviceObjectFromPortWavePci(
812 IPortWavePciImpl
* This
= (IPortWavePciImpl
*)iface
;
813 return This
->pDeviceObject
;
820 IPortWavePciImpl
* This
= (IPortWavePciImpl
*)iface
;
821 return This
->Miniport
;