From 3b8301e9358ef846ca34c92a31e33678d634da89 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sun, 16 Jan 2022 09:44:36 -0500 Subject: [PATCH] [PORTCLS] Centralize AddRef/Release implementation and make it thread-safe. --- .../wdm/audio/backpln/portcls/connection.cpp | 22 +--------- .../wdm/audio/backpln/portcls/dma_slave.cpp | 20 +-------- .../wdm/audio/backpln/portcls/drm_port.cpp | 22 +--------- .../wdm/audio/backpln/portcls/filter_dmus.cpp | 19 +------- .../audio/backpln/portcls/filter_topology.cpp | 19 +------- .../backpln/portcls/filter_wavecyclic.cpp | 19 +------- .../audio/backpln/portcls/filter_wavepci.cpp | 20 +-------- .../audio/backpln/portcls/filter_wavert.cpp | 20 +-------- .../wdm/audio/backpln/portcls/interrupt.cpp | 20 +-------- .../wdm/audio/backpln/portcls/irpstream.cpp | 19 +------- .../audio/backpln/portcls/miniport_dmus.cpp | 44 ++----------------- .../wdm/audio/backpln/portcls/pin_dmus.cpp | 20 +-------- .../audio/backpln/portcls/pin_wavecyclic.cpp | 22 +--------- .../wdm/audio/backpln/portcls/pin_wavepci.cpp | 24 ++-------- .../wdm/audio/backpln/portcls/pin_wavert.cpp | 20 +-------- .../wdm/audio/backpln/portcls/port_dmus.cpp | 22 +--------- .../audio/backpln/portcls/port_topology.cpp | 24 ++-------- .../audio/backpln/portcls/port_wavecyclic.cpp | 23 ++-------- .../audio/backpln/portcls/port_wavepci.cpp | 26 ++--------- .../wdm/audio/backpln/portcls/port_wavert.cpp | 24 ++-------- .../backpln/portcls/port_wavertstream.cpp | 21 +-------- drivers/wdm/audio/backpln/portcls/private.hpp | 33 ++++++++++++++ .../wdm/audio/backpln/portcls/registry.cpp | 22 +--------- .../wdm/audio/backpln/portcls/resource.cpp | 24 ++-------- .../audio/backpln/portcls/service_group.cpp | 22 +--------- .../wdm/audio/backpln/portcls/unregister.cpp | 25 +---------- drivers/wdm/audio/backpln/portcls/version.cpp | 24 +--------- 27 files changed, 79 insertions(+), 541 deletions(-) diff --git a/drivers/wdm/audio/backpln/portcls/connection.cpp b/drivers/wdm/audio/backpln/portcls/connection.cpp index ebaa8431eba0..ffa71c801374 100644 --- a/drivers/wdm/audio/backpln/portcls/connection.cpp +++ b/drivers/wdm/audio/backpln/portcls/connection.cpp @@ -25,36 +25,16 @@ RtlCreateUnicodeString( ); -class CUnregisterPhysicalConnection : public IUnregisterPhysicalConnection +class CUnregisterPhysicalConnection : public CUnknownImpl { public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); - STDMETHODIMP_(ULONG) AddRef() - { - InterlockedIncrement(&m_Ref); - return m_Ref; - } - STDMETHODIMP_(ULONG) Release() - { - InterlockedDecrement(&m_Ref); - - if (!m_Ref) - { - delete this; - return 0; - } - return m_Ref; - } IMP_IUnregisterPhysicalConnection; CUnregisterPhysicalConnection(IUnknown *OuterUnknown){} virtual ~CUnregisterPhysicalConnection(){} - -protected: - LONG m_Ref; - }; NTSTATUS diff --git a/drivers/wdm/audio/backpln/portcls/dma_slave.cpp b/drivers/wdm/audio/backpln/portcls/dma_slave.cpp index 4a0553b3ba8b..76511eddd9ff 100644 --- a/drivers/wdm/audio/backpln/portcls/dma_slave.cpp +++ b/drivers/wdm/audio/backpln/portcls/dma_slave.cpp @@ -14,7 +14,7 @@ #include -class CDmaChannelInit : public IDmaChannelInit +class CDmaChannelInit : public CUnknownImpl { public: inline @@ -32,22 +32,6 @@ class CDmaChannelInit : public IDmaChannelInit STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); - STDMETHODIMP_(ULONG) AddRef() - { - InterlockedIncrement(&m_Ref); - return m_Ref; - } - STDMETHODIMP_(ULONG) Release() - { - InterlockedDecrement(&m_Ref); - - if (!m_Ref) - { - delete this; - return 0; - } - return m_Ref; - } IMP_IDmaChannelInit; CDmaChannelInit(IUnknown * OuterUnknown){} virtual ~CDmaChannelInit(){} @@ -75,8 +59,6 @@ class CDmaChannelInit : public IDmaChannelInit BOOLEAN m_WriteToDevice; friend IO_ALLOCATION_ACTION NTAPI AdapterControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID MapRegisterBase, IN PVOID Context); - - LONG m_Ref; }; diff --git a/drivers/wdm/audio/backpln/portcls/drm_port.cpp b/drivers/wdm/audio/backpln/portcls/drm_port.cpp index 04f694b12b26..6d10cd8d626b 100644 --- a/drivers/wdm/audio/backpln/portcls/drm_port.cpp +++ b/drivers/wdm/audio/backpln/portcls/drm_port.cpp @@ -14,34 +14,14 @@ #include -class CDrmPort2 : public IDrmPort2 +class CDrmPort2 : public CUnknownImpl { public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); - STDMETHODIMP_(ULONG) AddRef() - { - InterlockedIncrement(&m_Ref); - return m_Ref; - } - STDMETHODIMP_(ULONG) Release() - { - InterlockedDecrement(&m_Ref); - - if (!m_Ref) - { - delete this; - return 0; - } - return m_Ref; - } IMP_IDrmPort2; CDrmPort2(IUnknown *OuterUnknown){} virtual ~CDrmPort2(){} - -protected: - LONG m_Ref; - }; NTSTATUS diff --git a/drivers/wdm/audio/backpln/portcls/filter_dmus.cpp b/drivers/wdm/audio/backpln/portcls/filter_dmus.cpp index 3d86166c82fd..b375cd8b67e3 100644 --- a/drivers/wdm/audio/backpln/portcls/filter_dmus.cpp +++ b/drivers/wdm/audio/backpln/portcls/filter_dmus.cpp @@ -14,27 +14,11 @@ #include -class CPortFilterDMus : public IPortFilterDMus +class CPortFilterDMus : public CUnknownImpl { public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); - STDMETHODIMP_(ULONG) AddRef() - { - InterlockedIncrement(&m_Ref); - return m_Ref; - } - STDMETHODIMP_(ULONG) Release() - { - InterlockedDecrement(&m_Ref); - - if (!m_Ref) - { - delete this; - return 0; - } - return m_Ref; - } IMP_IPortFilterDMus; CPortFilterDMus(IUnknown *OuterUnknown){} virtual ~CPortFilterDMus(){} @@ -43,7 +27,6 @@ class CPortFilterDMus : public IPortFilterDMus IPortDMus* m_Port; IPortPinDMus ** m_Pins; SUBDEVICE_DESCRIPTOR * m_Descriptor; - LONG m_Ref; }; NTSTATUS diff --git a/drivers/wdm/audio/backpln/portcls/filter_topology.cpp b/drivers/wdm/audio/backpln/portcls/filter_topology.cpp index 8acf5fed4dd2..150de8c3cab7 100644 --- a/drivers/wdm/audio/backpln/portcls/filter_topology.cpp +++ b/drivers/wdm/audio/backpln/portcls/filter_topology.cpp @@ -14,27 +14,11 @@ #include -class CPortFilterTopology : public IPortFilterTopology +class CPortFilterTopology : public CUnknownImpl { public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); - STDMETHODIMP_(ULONG) AddRef() - { - InterlockedIncrement(&m_Ref); - return m_Ref; - } - STDMETHODIMP_(ULONG) Release() - { - InterlockedDecrement(&m_Ref); - - if (!m_Ref) - { - delete this; - return 0; - } - return m_Ref; - } IMP_IPortFilterTopology; CPortFilterTopology(IUnknown *OuterUnknown){} virtual ~CPortFilterTopology(){} @@ -43,7 +27,6 @@ class CPortFilterTopology : public IPortFilterTopology IPortTopology * m_Port; SUBDEVICE_DESCRIPTOR * m_Descriptor; ISubdevice * m_SubDevice; - LONG m_Ref; }; diff --git a/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.cpp b/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.cpp index 29c9512a734d..6a935da41c66 100644 --- a/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.cpp +++ b/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.cpp @@ -14,27 +14,11 @@ #include -class CPortFilterWaveCyclic : public IPortFilterWaveCyclic +class CPortFilterWaveCyclic : public CUnknownImpl { public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); - STDMETHODIMP_(ULONG) AddRef() - { - InterlockedIncrement(&m_Ref); - return m_Ref; - } - STDMETHODIMP_(ULONG) Release() - { - InterlockedDecrement(&m_Ref); - - if (!m_Ref) - { - delete this; - return 0; - } - return m_Ref; - } IMP_IPortFilterWaveCyclic; CPortFilterWaveCyclic(IUnknown *OuterUnknown){} virtual ~CPortFilterWaveCyclic(){} @@ -44,7 +28,6 @@ class CPortFilterWaveCyclic : public IPortFilterWaveCyclic IPortPinWaveCyclic ** m_Pins; SUBDEVICE_DESCRIPTOR * m_Descriptor; ISubdevice * m_SubDevice; - LONG m_Ref; }; NTSTATUS diff --git a/drivers/wdm/audio/backpln/portcls/filter_wavepci.cpp b/drivers/wdm/audio/backpln/portcls/filter_wavepci.cpp index 5c5d262956fd..9bf3a9465b88 100644 --- a/drivers/wdm/audio/backpln/portcls/filter_wavepci.cpp +++ b/drivers/wdm/audio/backpln/portcls/filter_wavepci.cpp @@ -14,27 +14,11 @@ #include -class CPortFilterWavePci : public IPortFilterWavePci +class CPortFilterWavePci : public CUnknownImpl { public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); - STDMETHODIMP_(ULONG) AddRef() - { - InterlockedIncrement(&m_Ref); - return m_Ref; - } - STDMETHODIMP_(ULONG) Release() - { - InterlockedDecrement(&m_Ref); - - if (!m_Ref) - { - delete this; - return 0; - } - return m_Ref; - } IMP_IPortFilterPci; CPortFilterWavePci(IUnknown *OuterUnknown){} virtual ~CPortFilterWavePci(){} @@ -43,8 +27,6 @@ class CPortFilterWavePci : public IPortFilterWavePci IPortWavePci* m_Port; IPortPinWavePci ** m_Pins; SUBDEVICE_DESCRIPTOR * m_Descriptor; - - LONG m_Ref; }; NTSTATUS diff --git a/drivers/wdm/audio/backpln/portcls/filter_wavert.cpp b/drivers/wdm/audio/backpln/portcls/filter_wavert.cpp index f421c2876e36..a91abafb8809 100644 --- a/drivers/wdm/audio/backpln/portcls/filter_wavert.cpp +++ b/drivers/wdm/audio/backpln/portcls/filter_wavert.cpp @@ -14,38 +14,20 @@ #include -class CPortFilterWaveRT : public IPortFilterWaveRT +class CPortFilterWaveRT : public CUnknownImpl { public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); - STDMETHODIMP_(ULONG) AddRef() - { - InterlockedIncrement(&m_Ref); - return m_Ref; - } - STDMETHODIMP_(ULONG) Release() - { - InterlockedDecrement(&m_Ref); - - if (!m_Ref) - { - delete this; - return 0; - } - return m_Ref; - } IMP_IPortFilterWaveRT; CPortFilterWaveRT(IUnknown *OuterUnknown){} virtual ~CPortFilterWaveRT(){} protected: - IPortWaveRT* m_Port; IPortPinWaveRT ** m_Pins; SUBDEVICE_DESCRIPTOR * m_Descriptor; - LONG m_Ref; }; NTSTATUS diff --git a/drivers/wdm/audio/backpln/portcls/interrupt.cpp b/drivers/wdm/audio/backpln/portcls/interrupt.cpp index 05f66253baf3..f733c6159747 100644 --- a/drivers/wdm/audio/backpln/portcls/interrupt.cpp +++ b/drivers/wdm/audio/backpln/portcls/interrupt.cpp @@ -21,27 +21,11 @@ typedef struct PVOID DynamicContext; }SYNC_ENTRY, *PSYNC_ENTRY; -class CInterruptSync : public IInterruptSync +class CInterruptSync : public CUnknownImpl { public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); - STDMETHODIMP_(ULONG) AddRef() - { - InterlockedIncrement(&m_Ref); - return m_Ref; - } - STDMETHODIMP_(ULONG) Release() - { - InterlockedDecrement(&m_Ref); - - if (!m_Ref) - { - delete this; - return 0; - } - return m_Ref; - } IMP_IInterruptSync; CInterruptSync(IUnknown *OuterUnknown){} virtual ~CInterruptSync(){} @@ -59,8 +43,6 @@ class CInterruptSync : public IInterruptSync PVOID m_DynamicContext; NTSTATUS m_Status; - LONG m_Ref; - friend BOOLEAN NTAPI CInterruptSynchronizedRoutine(IN PVOID ServiceContext); friend BOOLEAN NTAPI IInterruptServiceRoutine(IN PKINTERRUPT Interrupt, IN PVOID ServiceContext); }; diff --git a/drivers/wdm/audio/backpln/portcls/irpstream.cpp b/drivers/wdm/audio/backpln/portcls/irpstream.cpp index 75f0717ec885..4e2b701eca1f 100644 --- a/drivers/wdm/audio/backpln/portcls/irpstream.cpp +++ b/drivers/wdm/audio/backpln/portcls/irpstream.cpp @@ -39,27 +39,11 @@ RemoveHeadList_IRP( /* no non canceled irp has been found */ return NULL; } -class CIrpQueue : public IIrpQueue +class CIrpQueue : public CUnknownImpl { public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); - STDMETHODIMP_(ULONG) AddRef() - { - InterlockedIncrement(&m_Ref); - return m_Ref; - } - STDMETHODIMP_(ULONG) Release() - { - InterlockedDecrement(&m_Ref); - - if (!m_Ref) - { - delete this; - return 0; - } - return m_Ref; - } IMP_IIrpQueue; CIrpQueue(IUnknown *OuterUnknown){} virtual ~CIrpQueue(){} @@ -83,7 +67,6 @@ class CIrpQueue : public IIrpQueue ULONG m_CurrentOffset; PIRP m_Irp; - volatile LONG m_Ref; }; typedef struct diff --git a/drivers/wdm/audio/backpln/portcls/miniport_dmus.cpp b/drivers/wdm/audio/backpln/portcls/miniport_dmus.cpp index 1f28043738b1..2d59a97d67cc 100644 --- a/drivers/wdm/audio/backpln/portcls/miniport_dmus.cpp +++ b/drivers/wdm/audio/backpln/portcls/miniport_dmus.cpp @@ -67,12 +67,11 @@ const ULONG kMPUInputBufferSize = 128; * reference counting and aggregation support. */ class CMiniportDMusUART -: public IMiniportDMus, - public IMusicTechnology, - public IPowerNotify +: public CUnknownImpl { private: - LONG m_Ref; // Reference count KSSTATE m_KSStateInput; // Miniport state (RUN/PAUSE/ACQUIRE/STOP) PPORTDMUS m_pPort; // Callback interface. PUCHAR m_pPortBase; // Base port address. @@ -105,23 +104,6 @@ class CMiniportDMusUART public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); - STDMETHODIMP_(ULONG) AddRef() - { - InterlockedIncrement(&m_Ref); - return m_Ref; - } - STDMETHODIMP_(ULONG) Release() - { - InterlockedDecrement(&m_Ref); - - if (!m_Ref) - { - delete this; - return 0; - } - return m_Ref; - } - CMiniportDMusUART(IUnknown * Unknown){} virtual ~CMiniportDMusUART(); @@ -204,10 +186,9 @@ class CMiniportDMusUART * so it can expose this interface and CUnknown so it automatically gets * reference counting and aggregation support. */ -class CMiniportDMusUARTStream : public IMXF +class CMiniportDMusUARTStream : public CUnknownImpl { private: - LONG m_Ref; // Reference Count CMiniportDMusUART * m_pMiniport; // Parent. REFERENCE_TIME m_SnapshotTimeStamp; // Current snapshot of miniport's input timestamp. PUCHAR m_pPortBase; // Base port address. @@ -230,23 +211,6 @@ class CMiniportDMusUARTStream : public IMXF public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); - STDMETHODIMP_(ULONG) AddRef() - { - InterlockedIncrement(&m_Ref); - return m_Ref; - } - STDMETHODIMP_(ULONG) Release() - { - InterlockedDecrement(&m_Ref); - - if (!m_Ref) - { - delete this; - return 0; - } - return m_Ref; - } - virtual ~CMiniportDMusUARTStream(); STDMETHODIMP_(NTSTATUS) Init diff --git a/drivers/wdm/audio/backpln/portcls/pin_dmus.cpp b/drivers/wdm/audio/backpln/portcls/pin_dmus.cpp index 106ca82a48db..ef07aabed7de 100644 --- a/drivers/wdm/audio/backpln/portcls/pin_dmus.cpp +++ b/drivers/wdm/audio/backpln/portcls/pin_dmus.cpp @@ -14,27 +14,11 @@ #include -class CPortPinDMus : public IPortPinDMus +class CPortPinDMus : public CUnknownImpl { public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); - STDMETHODIMP_(ULONG) AddRef() - { - InterlockedIncrement(&m_Ref); - return m_Ref; - } - STDMETHODIMP_(ULONG) Release() - { - InterlockedDecrement(&m_Ref); - - if (!m_Ref) - { - delete this; - return 0; - } - return m_Ref; - } IMP_IPortPinDMus; IMP_IServiceSink; IMP_IMasterClock; @@ -76,8 +60,6 @@ class CPortPinDMus : public IPortPinDMus ULONG m_PostCompleted; ULONG m_LastTag; - - LONG m_Ref; }; typedef struct diff --git a/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp b/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp index 56eba19a4384..c6b3e72dff77 100644 --- a/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp +++ b/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp @@ -14,8 +14,8 @@ #include -class CPortPinWaveCyclic : public IPortPinWaveCyclic, - public IServiceSink +class CPortPinWaveCyclic : public CUnknownImpl { public: inline @@ -33,22 +33,6 @@ class CPortPinWaveCyclic : public IPortPinWaveCyclic, STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); - STDMETHODIMP_(ULONG) AddRef() - { - InterlockedIncrement(&m_Ref); - return m_Ref; - } - STDMETHODIMP_(ULONG) Release() - { - InterlockedDecrement(&m_Ref); - - if (!m_Ref) - { - delete this; - return 0; - } - return m_Ref; - } IMP_IPortPinWaveCyclic; IMP_IServiceSink; CPortPinWaveCyclic(IUnknown *OuterUnknown){} @@ -100,8 +84,6 @@ class CPortPinWaveCyclic : public IPortPinWaveCyclic, KSRESET m_ResetState; ULONG m_Delay; - - LONG m_Ref; }; diff --git a/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp b/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp index 9f681a000c2d..3eb9dcefeade 100644 --- a/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp +++ b/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp @@ -14,29 +14,13 @@ #include -class CPortPinWavePci : public IPortPinWavePci, - public IServiceSink, - public IPortWavePciStream +class CPortPinWavePci : public CUnknownImpl { public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); - STDMETHODIMP_(ULONG) AddRef() - { - InterlockedIncrement(&m_Ref); - return m_Ref; - } - STDMETHODIMP_(ULONG) Release() - { - InterlockedDecrement(&m_Ref); - - if (!m_Ref) - { - delete this; - return 0; - } - return m_Ref; - } IMP_IPortPinWavePci; IMP_IServiceSink; IMP_IPortWavePciStream; @@ -74,8 +58,6 @@ class CPortPinWavePci : public IPortPinWavePci, KSALLOCATOR_FRAMING m_AllocatorFraming; - LONG m_Ref; - NTSTATUS NTAPI HandleKsProperty(IN PIRP Irp); NTSTATUS NTAPI HandleKsStream(IN PIRP Irp); }; diff --git a/drivers/wdm/audio/backpln/portcls/pin_wavert.cpp b/drivers/wdm/audio/backpln/portcls/pin_wavert.cpp index fcdfd1ce8126..d259649d3c07 100644 --- a/drivers/wdm/audio/backpln/portcls/pin_wavert.cpp +++ b/drivers/wdm/audio/backpln/portcls/pin_wavert.cpp @@ -14,27 +14,11 @@ #include -class CPortPinWaveRT : public IPortPinWaveRT +class CPortPinWaveRT : public CUnknownImpl { public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); - STDMETHODIMP_(ULONG) AddRef() - { - InterlockedIncrement(&m_Ref); - return m_Ref; - } - STDMETHODIMP_(ULONG) Release() - { - InterlockedDecrement(&m_Ref); - - if (!m_Ref) - { - delete this; - return 0; - } - return m_Ref; - } IMP_IPortPinWaveRT; CPortPinWaveRT(IUnknown *OuterUnknown){} virtual ~CPortPinWaveRT(){} @@ -68,8 +52,6 @@ class CPortPinWaveRT : public IPortPinWaveRT MEMORY_CACHING_TYPE m_CacheType; PMDL m_Mdl; - LONG m_Ref; - NTSTATUS NTAPI HandleKsProperty(IN PIRP Irp); NTSTATUS NTAPI HandleKsStream(IN PIRP Irp); VOID NTAPI SetStreamState(IN KSSTATE State); diff --git a/drivers/wdm/audio/backpln/portcls/port_dmus.cpp b/drivers/wdm/audio/backpln/portcls/port_dmus.cpp index 7eb94d2d6ecd..1d699fb35ad2 100644 --- a/drivers/wdm/audio/backpln/portcls/port_dmus.cpp +++ b/drivers/wdm/audio/backpln/portcls/port_dmus.cpp @@ -14,28 +14,12 @@ #include -class CPortDMus : public IPortDMus, - public ISubdevice +class CPortDMus : public CUnknownImpl { public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); - STDMETHODIMP_(ULONG) AddRef() - { - InterlockedIncrement(&m_Ref); - return m_Ref; - } - STDMETHODIMP_(ULONG) Release() - { - InterlockedDecrement(&m_Ref); - - if (!m_Ref) - { - delete this; - return 0; - } - return m_Ref; - } IMP_IPortDMus; IMP_ISubdevice; CPortDMus(IUnknown *OuterUnknown){} @@ -55,8 +39,6 @@ class CPortDMus : public IPortDMus, PPCFILTER_DESCRIPTOR m_pDescriptor; PSUBDEVICE_DESCRIPTOR m_SubDeviceDescriptor; - LONG m_Ref; - friend VOID GetDMusMiniport(IN IPortDMus * iface, IN PMINIPORTDMUS * Miniport, IN PMINIPORTMIDI * MidiMiniport); }; diff --git a/drivers/wdm/audio/backpln/portcls/port_topology.cpp b/drivers/wdm/audio/backpln/portcls/port_topology.cpp index 2c5cf4333faf..96e04c536ef8 100644 --- a/drivers/wdm/audio/backpln/portcls/port_topology.cpp +++ b/drivers/wdm/audio/backpln/portcls/port_topology.cpp @@ -14,29 +14,13 @@ #include -class CPortTopology : public IPortTopology, - public ISubdevice, - public IPortEvents +class CPortTopology : public CUnknownImpl { public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); - STDMETHODIMP_(ULONG) AddRef() - { - InterlockedIncrement(&m_Ref); - return m_Ref; - } - STDMETHODIMP_(ULONG) Release() - { - InterlockedDecrement(&m_Ref); - - if (!m_Ref) - { - delete this; - return 0; - } - return m_Ref; - } IMP_IPortTopology; IMP_ISubdevice; IMP_IPortEvents; @@ -55,8 +39,6 @@ class CPortTopology : public IPortTopology, PSUBDEVICE_DESCRIPTOR m_SubDeviceDescriptor; IPortFilterTopology * m_Filter; - LONG m_Ref; - friend PMINIPORTTOPOLOGY GetTopologyMiniport(PPORTTOPOLOGY Port); }; diff --git a/drivers/wdm/audio/backpln/portcls/port_wavecyclic.cpp b/drivers/wdm/audio/backpln/portcls/port_wavecyclic.cpp index f7c0afcb30cf..39ced79baf74 100644 --- a/drivers/wdm/audio/backpln/portcls/port_wavecyclic.cpp +++ b/drivers/wdm/audio/backpln/portcls/port_wavecyclic.cpp @@ -16,28 +16,13 @@ GUID IID_IDmaChannelSlave; -class CPortWaveCyclic : public IPortWaveCyclic, - public IPortEvents, - public ISubdevice +class CPortWaveCyclic : public CUnknownImpl { public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); - STDMETHODIMP_(ULONG) AddRef() - { - InterlockedIncrement(&m_Ref); - return m_Ref; - } - STDMETHODIMP_(ULONG) Release() - { - InterlockedDecrement(&m_Ref); - if (!m_Ref) - { - //delete this; - return 0; - } - return m_Ref; - } IMP_IPortWaveCyclic; IMP_ISubdevice; IMP_IPortEvents; @@ -53,8 +38,6 @@ class CPortWaveCyclic : public IPortWaveCyclic, PSUBDEVICE_DESCRIPTOR m_SubDeviceDescriptor; IPortFilterWaveCyclic * m_Filter; - LONG m_Ref; - friend PMINIPORTWAVECYCLIC GetWaveCyclicMiniport(IN IPortWaveCyclic* iface); friend PDEVICE_OBJECT GetDeviceObject(PPORTWAVECYCLIC iface); }; diff --git a/drivers/wdm/audio/backpln/portcls/port_wavepci.cpp b/drivers/wdm/audio/backpln/portcls/port_wavepci.cpp index 0186258c3285..090422e2b754 100644 --- a/drivers/wdm/audio/backpln/portcls/port_wavepci.cpp +++ b/drivers/wdm/audio/backpln/portcls/port_wavepci.cpp @@ -14,30 +14,14 @@ #include -class CPortWavePci : public IPortWavePci, - public IPortEvents, - public ISubdevice, - public IServiceSink +class CPortWavePci : public CUnknownImpl { public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); - STDMETHODIMP_(ULONG) AddRef() - { - InterlockedIncrement(&m_Ref); - return m_Ref; - } - STDMETHODIMP_(ULONG) Release() - { - InterlockedDecrement(&m_Ref); - - if (!m_Ref) - { - delete this; - return 0; - } - return m_Ref; - } IMP_IPortWavePci; IMP_ISubdevice; IMP_IPortEvents; @@ -59,8 +43,6 @@ class CPortWavePci : public IPortWavePci, LIST_ENTRY m_EventList; KSPIN_LOCK m_EventListLock; - LONG m_Ref; - friend PDEVICE_OBJECT GetDeviceObjectFromPortWavePci(IPortWavePci* iface); friend PMINIPORTWAVEPCI GetWavePciMiniport(PPORTWAVEPCI iface); diff --git a/drivers/wdm/audio/backpln/portcls/port_wavert.cpp b/drivers/wdm/audio/backpln/portcls/port_wavert.cpp index 06e97c95b9c4..44405360e74b 100644 --- a/drivers/wdm/audio/backpln/portcls/port_wavert.cpp +++ b/drivers/wdm/audio/backpln/portcls/port_wavert.cpp @@ -14,29 +14,13 @@ #include -class CPortWaveRT : public IPortWaveRT, - public IPortEvents, - public ISubdevice +class CPortWaveRT : public CUnknownImpl { public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); - STDMETHODIMP_(ULONG) AddRef() - { - InterlockedIncrement(&m_Ref); - return m_Ref; - } - STDMETHODIMP_(ULONG) Release() - { - InterlockedDecrement(&m_Ref); - - if (!m_Ref) - { - delete this; - return 0; - } - return m_Ref; - } IMP_IPortWaveRT; IMP_ISubdevice; IMP_IPortEvents; @@ -57,8 +41,6 @@ class CPortWaveRT : public IPortWaveRT, friend PMINIPORTWAVERT GetWaveRTMiniport(IN IPortWaveRT* iface); friend PDEVICE_OBJECT GetDeviceObjectFromPortWaveRT(PPORTWAVERT iface); - - LONG m_Ref; }; static GUID InterfaceGuids[3] = diff --git a/drivers/wdm/audio/backpln/portcls/port_wavertstream.cpp b/drivers/wdm/audio/backpln/portcls/port_wavertstream.cpp index 3472c071f66e..4689f07b609d 100644 --- a/drivers/wdm/audio/backpln/portcls/port_wavertstream.cpp +++ b/drivers/wdm/audio/backpln/portcls/port_wavertstream.cpp @@ -14,34 +14,15 @@ #include -class CPortWaveRTStreamInit : public IPortWaveRTStreamInit +class CPortWaveRTStreamInit : public CUnknownImpl { public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); - STDMETHODIMP_(ULONG) AddRef() - { - InterlockedIncrement(&m_Ref); - return m_Ref; - } - STDMETHODIMP_(ULONG) Release() - { - InterlockedDecrement(&m_Ref); - - if (!m_Ref) - { - delete this; - return 0; - } - return m_Ref; - } IMP_IPortWaveRTStreamInit; CPortWaveRTStreamInit(IUnknown *OuterUnknown) {} virtual ~CPortWaveRTStreamInit() {} -protected: - LONG m_Ref; - }; NTSTATUS diff --git a/drivers/wdm/audio/backpln/portcls/private.hpp b/drivers/wdm/audio/backpln/portcls/private.hpp index 75549690577b..f17d0788505d 100644 --- a/drivers/wdm/audio/backpln/portcls/private.hpp +++ b/drivers/wdm/audio/backpln/portcls/private.hpp @@ -439,4 +439,37 @@ typedef struct PKSOBJECT_CREATE_ITEM CreateItem; }DISPATCH_CONTEXT, *PDISPATCH_CONTEXT; +template +class CUnknownImpl : public Interfaces... +{ +private: + volatile LONG m_Ref; +protected: + CUnknownImpl() : + m_Ref(0) + { + } + virtual ~CUnknownImpl() + { + } +public: + STDMETHODIMP_(ULONG) AddRef() + { + ULONG Ref = InterlockedIncrement(&m_Ref); + ASSERT(Ref < 0x10000); + return Ref; + } + STDMETHODIMP_(ULONG) Release() + { + ULONG Ref = InterlockedDecrement(&m_Ref); + ASSERT(Ref < 0x10000); + if (!Ref) + { + delete this; + return 0; + } + return Ref; + } +}; + #endif /* PORTCLS_PRIVATE_H */ diff --git a/drivers/wdm/audio/backpln/portcls/registry.cpp b/drivers/wdm/audio/backpln/portcls/registry.cpp index 35b7946d384e..6e21b0715089 100644 --- a/drivers/wdm/audio/backpln/portcls/registry.cpp +++ b/drivers/wdm/audio/backpln/portcls/registry.cpp @@ -14,30 +14,13 @@ #include -class CRegistryKey : public IRegistryKey +class CRegistryKey : public CUnknownImpl { public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); - STDMETHODIMP_(ULONG) AddRef() - { - InterlockedIncrement(&m_Ref); - return m_Ref; - } - STDMETHODIMP_(ULONG) Release() - { - InterlockedDecrement(&m_Ref); - - if (!m_Ref) - { - delete this; - return 0; - } - return m_Ref; - } - IMP_IRegistryKey; - CRegistryKey(IUnknown * OuterUnknown, HANDLE hKey, BOOL CanDelete) : m_hKey(hKey), m_Deleted(FALSE), m_CanDelete(CanDelete), m_Ref(0){} + CRegistryKey(IUnknown * OuterUnknown, HANDLE hKey, BOOL CanDelete) : m_hKey(hKey), m_Deleted(FALSE), m_CanDelete(CanDelete) {} virtual ~CRegistryKey(); protected: @@ -45,7 +28,6 @@ class CRegistryKey : public IRegistryKey HANDLE m_hKey; BOOL m_Deleted; BOOL m_CanDelete; - LONG m_Ref; }; CRegistryKey::~CRegistryKey() diff --git a/drivers/wdm/audio/backpln/portcls/resource.cpp b/drivers/wdm/audio/backpln/portcls/resource.cpp index dfa4e7b7d83d..e47766287a35 100644 --- a/drivers/wdm/audio/backpln/portcls/resource.cpp +++ b/drivers/wdm/audio/backpln/portcls/resource.cpp @@ -17,31 +17,14 @@ #include -class CResourceList : public IResourceList +class CResourceList : public CUnknownImpl { public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); - STDMETHODIMP_(ULONG) AddRef() - { - InterlockedIncrement(&m_Ref); - return m_Ref; - } - STDMETHODIMP_(ULONG) Release() - { - InterlockedDecrement(&m_Ref); - - if (!m_Ref) - { - delete this; - return 0; - } - return m_Ref; - } - IMP_IResourceList; - CResourceList(IUnknown * OuterUnknown) : m_OuterUnknown(OuterUnknown), m_PoolType(NonPagedPool), m_TranslatedResourceList(0), m_UntranslatedResourceList(0), m_NumberOfEntries(0), m_MaxEntries(0), m_Ref(0) {} + CResourceList(IUnknown * OuterUnknown) : m_OuterUnknown(OuterUnknown), m_PoolType(NonPagedPool), m_TranslatedResourceList(0), m_UntranslatedResourceList(0), m_NumberOfEntries(0), m_MaxEntries(0) {} virtual ~CResourceList(); public: @@ -51,7 +34,6 @@ class CResourceList : public IResourceList PCM_RESOURCE_LIST m_UntranslatedResourceList; ULONG m_NumberOfEntries; ULONG m_MaxEntries; - LONG m_Ref; }; CResourceList::~CResourceList() @@ -461,7 +443,7 @@ PcNewResourceSublist( /* Store members */ NewList->m_OuterUnknown = OuterUnknown; NewList->m_PoolType = PoolType; - NewList->m_Ref = 1; + NewList->AddRef(); NewList->m_NumberOfEntries = 0; NewList->m_MaxEntries = MaximumEntries; diff --git a/drivers/wdm/audio/backpln/portcls/service_group.cpp b/drivers/wdm/audio/backpln/portcls/service_group.cpp index 50ebd7335a4f..d3688a92c14d 100644 --- a/drivers/wdm/audio/backpln/portcls/service_group.cpp +++ b/drivers/wdm/audio/backpln/portcls/service_group.cpp @@ -29,28 +29,11 @@ typedef struct IN PSERVICESINK pServiceSink; }GROUP_ENTRY, *PGROUP_ENTRY; -class CServiceGroup : public IServiceGroup +class CServiceGroup : public CUnknownImpl { public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); - STDMETHODIMP_(ULONG) AddRef() - { - InterlockedIncrement(&m_Ref); - return m_Ref; - } - STDMETHODIMP_(ULONG) Release() - { - InterlockedDecrement(&m_Ref); - - if (!m_Ref) - { - delete this; - return 0; - } - return m_Ref; - } - IMP_IServiceGroup; CServiceGroup(IUnknown * OuterUnknown); virtual ~CServiceGroup() {} @@ -65,9 +48,6 @@ class CServiceGroup : public IServiceGroup KSPIN_LOCK m_Lock; friend VOID NTAPI IServiceGroupDpc(IN struct _KDPC *Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2); - - LONG m_Ref; - }; diff --git a/drivers/wdm/audio/backpln/portcls/unregister.cpp b/drivers/wdm/audio/backpln/portcls/unregister.cpp index 9a3bc8cec662..ef9d71308888 100644 --- a/drivers/wdm/audio/backpln/portcls/unregister.cpp +++ b/drivers/wdm/audio/backpln/portcls/unregister.cpp @@ -14,37 +14,16 @@ #include -class CUnregisterSubdevice : public IUnregisterSubdevice +class CUnregisterSubdevice : public CUnknownImpl { public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); - STDMETHODIMP_(ULONG) AddRef() - { - InterlockedIncrement(&m_Ref); - return m_Ref; - } - STDMETHODIMP_(ULONG) Release() - { - InterlockedDecrement(&m_Ref); - - if (!m_Ref) - { - delete this; - return 0; - } - return m_Ref; - } - - IMP_IUnregisterSubdevice; - CUnregisterSubdevice(IUnknown * OuterUnknown) : m_Ref(0) {} + CUnregisterSubdevice(IUnknown * OuterUnknown) {} virtual ~CUnregisterSubdevice(){} -protected: - LONG m_Ref; - }; NTSTATUS diff --git a/drivers/wdm/audio/backpln/portcls/version.cpp b/drivers/wdm/audio/backpln/portcls/version.cpp index 629c74a4a6a5..c3571cc7bd1d 100644 --- a/drivers/wdm/audio/backpln/portcls/version.cpp +++ b/drivers/wdm/audio/backpln/portcls/version.cpp @@ -14,42 +14,20 @@ #include -class CPortClsVersion : public IPortClsVersion +class CPortClsVersion : public CUnknownImpl { public: STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); - STDMETHODIMP_(ULONG) AddRef() - { - InterlockedIncrement(&m_Ref); - return m_Ref; - } - STDMETHODIMP_(ULONG) Release() - { - InterlockedDecrement(&m_Ref); - - if (!m_Ref) - { - delete this; - return 0; - } - return m_Ref; - } - IMP_IPortClsVersion; CPortClsVersion(IUnknown *OuterUnknown) { - m_Ref = 0; } virtual ~CPortClsVersion() { } - -protected: - LONG m_Ref; - };