https://git.reactos.org/?p=reactos.git;a=commitdiff;h=6e97b4314f9550f771f38f3959b25bc5ef171bbb

commit 6e97b4314f9550f771f38f3959b25bc5ef171bbb
Author:     Victor Perevertkin <[email protected]>
AuthorDate: Wed Feb 16 01:25:25 2022 +0300
Commit:     Victor Perevertkin <[email protected]>
CommitDate: Wed Feb 16 01:31:27 2022 +0300

    [PORTCLS] Centralize AddRef/Release implementation.
    
    And make it thread-safe.
    
    Co-authored-by: Thomas Faber <[email protected]>
---
 drivers/wdm/audio/backpln/portcls/connection.cpp   | 22 +----------
 drivers/wdm/audio/backpln/portcls/dma_slave.cpp    | 23 +-----------
 drivers/wdm/audio/backpln/portcls/drm_port.cpp     | 22 +----------
 drivers/wdm/audio/backpln/portcls/filter_dmus.cpp  | 19 +---------
 .../wdm/audio/backpln/portcls/filter_topology.cpp  | 19 +---------
 .../audio/backpln/portcls/filter_wavecyclic.cpp    | 19 +---------
 .../wdm/audio/backpln/portcls/filter_wavepci.cpp   | 20 +---------
 .../wdm/audio/backpln/portcls/filter_wavert.cpp    | 20 +---------
 drivers/wdm/audio/backpln/portcls/interrupt.cpp    | 20 +---------
 drivers/wdm/audio/backpln/portcls/irpstream.cpp    | 19 +---------
 .../wdm/audio/backpln/portcls/miniport_dmus.cpp    | 43 +---------------------
 drivers/wdm/audio/backpln/portcls/pin_dmus.cpp     | 20 +---------
 .../wdm/audio/backpln/portcls/pin_wavecyclic.cpp   | 24 +-----------
 drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp  | 22 +----------
 drivers/wdm/audio/backpln/portcls/pin_wavert.cpp   | 20 +---------
 drivers/wdm/audio/backpln/portcls/port_dmus.cpp    | 21 +----------
 .../wdm/audio/backpln/portcls/port_topology.cpp    | 22 +----------
 .../wdm/audio/backpln/portcls/port_wavecyclic.cpp  | 23 +-----------
 drivers/wdm/audio/backpln/portcls/port_wavepci.cpp | 23 +-----------
 drivers/wdm/audio/backpln/portcls/port_wavert.cpp  | 24 +-----------
 .../audio/backpln/portcls/port_wavertstream.cpp    | 21 +----------
 drivers/wdm/audio/backpln/portcls/private.hpp      | 33 +++++++++++++++++
 drivers/wdm/audio/backpln/portcls/registry.cpp     | 25 +++----------
 drivers/wdm/audio/backpln/portcls/resource.cpp     | 32 ++++++----------
 .../wdm/audio/backpln/portcls/service_group.cpp    | 22 +----------
 drivers/wdm/audio/backpln/portcls/unregister.cpp   | 25 +------------
 drivers/wdm/audio/backpln/portcls/version.cpp      | 24 +-----------
 27 files changed, 80 insertions(+), 547 deletions(-)

diff --git a/drivers/wdm/audio/backpln/portcls/connection.cpp 
b/drivers/wdm/audio/backpln/portcls/connection.cpp
index ebaa8431eba..ffa71c80137 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<IUnregisterPhysicalConnection>
 {
 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 40d5132f6f4..ef71d248981 100644
--- a/drivers/wdm/audio/backpln/portcls/dma_slave.cpp
+++ b/drivers/wdm/audio/backpln/portcls/dma_slave.cpp
@@ -14,7 +14,7 @@
 
 #include <debug.h>
 
-class CDmaChannelInit : public IDmaChannelInit
+class CDmaChannelInit : public CUnknownImpl<IDmaChannelInit>
 {
 public:
     inline
@@ -29,22 +29,6 @@ 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_IDmaChannelInit;
     CDmaChannelInit(IUnknown * OuterUnknown) :
         m_pDeviceObject(nullptr),
@@ -60,8 +44,7 @@ public:
         m_Address({0}),
         m_Buffer(nullptr),
         m_Mdl(nullptr),
-        m_WriteToDevice(FALSE),
-        m_Ref(0)
+        m_WriteToDevice(FALSE)
     {
     }
     virtual ~CDmaChannelInit(){}
@@ -89,8 +72,6 @@ protected:
     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 04f694b12b2..6d10cd8d626 100644
--- a/drivers/wdm/audio/backpln/portcls/drm_port.cpp
+++ b/drivers/wdm/audio/backpln/portcls/drm_port.cpp
@@ -14,34 +14,14 @@
 
 #include <debug.h>
 
-class CDrmPort2 : public IDrmPort2
+class CDrmPort2 : public CUnknownImpl<IDrmPort2>
 {
 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 3d86166c82f..b375cd8b67e 100644
--- a/drivers/wdm/audio/backpln/portcls/filter_dmus.cpp
+++ b/drivers/wdm/audio/backpln/portcls/filter_dmus.cpp
@@ -14,27 +14,11 @@
 
 #include <debug.h>
 
-class CPortFilterDMus : public IPortFilterDMus
+class CPortFilterDMus : public CUnknownImpl<IPortFilterDMus>
 {
 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 @@ protected:
     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 8acf5fed4dd..150de8c3cab 100644
--- a/drivers/wdm/audio/backpln/portcls/filter_topology.cpp
+++ b/drivers/wdm/audio/backpln/portcls/filter_topology.cpp
@@ -14,27 +14,11 @@
 
 #include <debug.h>
 
-class CPortFilterTopology : public IPortFilterTopology
+class CPortFilterTopology : public CUnknownImpl<IPortFilterTopology>
 {
 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 @@ protected:
     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 29c9512a734..6a935da41c6 100644
--- a/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.cpp
+++ b/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.cpp
@@ -14,27 +14,11 @@
 
 #include <debug.h>
 
-class CPortFilterWaveCyclic : public IPortFilterWaveCyclic
+class CPortFilterWaveCyclic : public CUnknownImpl<IPortFilterWaveCyclic>
 {
 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 @@ protected:
     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 5c5d262956f..9bf3a9465b8 100644
--- a/drivers/wdm/audio/backpln/portcls/filter_wavepci.cpp
+++ b/drivers/wdm/audio/backpln/portcls/filter_wavepci.cpp
@@ -14,27 +14,11 @@
 
 #include <debug.h>
 
-class CPortFilterWavePci : public IPortFilterWavePci
+class CPortFilterWavePci : public CUnknownImpl<IPortFilterWavePci>
 {
 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 @@ protected:
     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 f421c2876e3..a91abafb880 100644
--- a/drivers/wdm/audio/backpln/portcls/filter_wavert.cpp
+++ b/drivers/wdm/audio/backpln/portcls/filter_wavert.cpp
@@ -14,38 +14,20 @@
 
 #include <debug.h>
 
-class CPortFilterWaveRT : public IPortFilterWaveRT
+class CPortFilterWaveRT : public CUnknownImpl<IPortFilterWaveRT>
 {
 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 05f66253baf..f733c615974 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<IInterruptSync>
 {
 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 @@ public:
     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 75f0717ec88..4e2b701eca1 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<IIrpQueue>
 {
 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 @@ protected:
 
     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 1f28043738b..f57aa72a7dc 100644
--- a/drivers/wdm/audio/backpln/portcls/miniport_dmus.cpp
+++ b/drivers/wdm/audio/backpln/portcls/miniport_dmus.cpp
@@ -66,13 +66,9 @@ const ULONG      kMPUInputBufferSize = 128;
  * so it can expose this interface and CUnknown so it automatically gets
  * reference counting and aggregation support.
  */
-class CMiniportDMusUART
-:   public IMiniportDMus,
-    public IMusicTechnology,
-    public IPowerNotify
+class CMiniportDMusUART : public CUnknownImpl<IMiniportDMus, IMusicTechnology, 
IPowerNotify>
 {
 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 +101,6 @@ private:
 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 +183,9 @@ public:
  * 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<IMXF>
 {
 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 +208,6 @@ private:
 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 106ca82a48d..ef07aabed7d 100644
--- a/drivers/wdm/audio/backpln/portcls/pin_dmus.cpp
+++ b/drivers/wdm/audio/backpln/portcls/pin_dmus.cpp
@@ -14,27 +14,11 @@
 
 #include <debug.h>
 
-class CPortPinDMus : public IPortPinDMus
+class CPortPinDMus : public CUnknownImpl<IPortPinDMus>
 {
 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 @@ protected:
     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 07451f6190a..ec67bb50ef0 100644
--- a/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp
+++ b/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp
@@ -14,8 +14,7 @@
 
 #include <debug.h>
 
-class CPortPinWaveCyclic : public IPortPinWaveCyclic,
-                           public IServiceSink
+class CPortPinWaveCyclic : public CUnknownImpl<IPortPinWaveCyclic, 
IServiceSink>
 {
 public:
     inline
@@ -30,22 +29,6 @@ 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_IPortPinWaveCyclic;
     IMP_IServiceSink;
     CPortPinWaveCyclic(IUnknown *OuterUnknown) :
@@ -73,8 +56,7 @@ public:
         m_EventListLock(0),
         m_EventList({nullptr}),
         m_ResetState(KSRESET_BEGIN),
-        m_Delay(0),
-        m_Ref(0)
+        m_Delay(0)
     {
     }
     virtual ~CPortPinWaveCyclic(){}
@@ -125,8 +107,6 @@ protected:
     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 9f681a000c2..879965edc32 100644
--- a/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp
+++ b/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp
@@ -14,29 +14,11 @@
 
 #include <debug.h>
 
-class CPortPinWavePci : public IPortPinWavePci,
-                        public IServiceSink,
-                        public IPortWavePciStream
+class CPortPinWavePci : public CUnknownImpl<IPortPinWavePci, IServiceSink, 
IPortWavePciStream>
 {
 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 +56,6 @@ protected:
 
     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 fcdfd1ce812..d259649d3c0 100644
--- a/drivers/wdm/audio/backpln/portcls/pin_wavert.cpp
+++ b/drivers/wdm/audio/backpln/portcls/pin_wavert.cpp
@@ -14,27 +14,11 @@
 
 #include <debug.h>
 
-class CPortPinWaveRT : public IPortPinWaveRT
+class CPortPinWaveRT : public CUnknownImpl<IPortPinWaveRT>
 {
 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 @@ protected:
     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 7eb94d2d6ec..8a3e8cdae13 100644
--- a/drivers/wdm/audio/backpln/portcls/port_dmus.cpp
+++ b/drivers/wdm/audio/backpln/portcls/port_dmus.cpp
@@ -14,28 +14,11 @@
 
 #include <debug.h>
 
-class CPortDMus : public IPortDMus,
-                  public ISubdevice
+class CPortDMus : public CUnknownImpl<IPortDMus, ISubdevice>
 {
 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 +38,6 @@ protected:
     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 2c5cf4333fa..32467b3d6a4 100644
--- a/drivers/wdm/audio/backpln/portcls/port_topology.cpp
+++ b/drivers/wdm/audio/backpln/portcls/port_topology.cpp
@@ -14,29 +14,11 @@
 
 #include <debug.h>
 
-class CPortTopology : public IPortTopology,
-                      public ISubdevice,
-                      public IPortEvents
+class CPortTopology : public CUnknownImpl<IPortTopology, ISubdevice, 
IPortEvents>
 {
 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 +37,6 @@ protected:
     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 cb54dcc275b..3a4f3545de7 100644
--- a/drivers/wdm/audio/backpln/portcls/port_wavecyclic.cpp
+++ b/drivers/wdm/audio/backpln/portcls/port_wavecyclic.cpp
@@ -16,32 +16,15 @@
 
 GUID IID_IDmaChannelSlave;
 
-class CPortWaveCyclic : public IPortWaveCyclic,
-                        public IPortEvents,
-                        public ISubdevice
+class CPortWaveCyclic : public CUnknownImpl<IPortWaveCyclic, IPortEvents, 
ISubdevice>
 {
 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;
-    CPortWaveCyclic(IUnknown *OuterUnknown) : m_Ref(0) {}
+    CPortWaveCyclic(IUnknown *OuterUnknown) {}
     virtual ~CPortWaveCyclic(){}
 
 protected:
@@ -53,8 +36,6 @@ protected:
     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 0186258c328..068d28256a8 100644
--- a/drivers/wdm/audio/backpln/portcls/port_wavepci.cpp
+++ b/drivers/wdm/audio/backpln/portcls/port_wavepci.cpp
@@ -14,30 +14,11 @@
 
 #include <debug.h>
 
-class CPortWavePci : public IPortWavePci,
-                     public IPortEvents,
-                     public ISubdevice,
-                     public IServiceSink
+class CPortWavePci : public CUnknownImpl<IPortWavePci, IPortEvents, 
ISubdevice, IServiceSink>
 {
 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 +40,6 @@ protected:
     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 06e97c95b9c..c7f5f7d51ab 100644
--- a/drivers/wdm/audio/backpln/portcls/port_wavert.cpp
+++ b/drivers/wdm/audio/backpln/portcls/port_wavert.cpp
@@ -14,29 +14,11 @@
 
 #include <debug.h>
 
-class CPortWaveRT : public IPortWaveRT,
-                    public IPortEvents,
-                    public ISubdevice
+class CPortWaveRT : public CUnknownImpl<IPortWaveRT, IPortEvents, ISubdevice>
 {
 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 +39,6 @@ protected:
 
     friend PMINIPORTWAVERT GetWaveRTMiniport(IN IPortWaveRT* iface);
     friend PDEVICE_OBJECT GetDeviceObjectFromPortWaveRT(PPORTWAVERT iface);
-
-    LONG m_Ref;
 };
 
 static GUID InterfaceGuids[3] =
@@ -145,7 +125,7 @@ CPortWaveRT::QueryInterface(
         IsEqualGUIDAligned(refiid, IID_IUnknown))
     {
         *Output = PVOID(PPORTWAVERT(this));
-               PUNKNOWN(*Output)->AddRef();
+        PUNKNOWN(*Output)->AddRef();
         return STATUS_SUCCESS;
     }
     else if (IsEqualGUIDAligned(refiid, IID_IPortEvents))
diff --git a/drivers/wdm/audio/backpln/portcls/port_wavertstream.cpp 
b/drivers/wdm/audio/backpln/portcls/port_wavertstream.cpp
index 3472c071f66..4689f07b609 100644
--- a/drivers/wdm/audio/backpln/portcls/port_wavertstream.cpp
+++ b/drivers/wdm/audio/backpln/portcls/port_wavertstream.cpp
@@ -14,34 +14,15 @@
 
 #include <debug.h>
 
-class CPortWaveRTStreamInit : public IPortWaveRTStreamInit
+class CPortWaveRTStreamInit : public CUnknownImpl<IPortWaveRTStreamInit>
 {
 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 75549690577..f17d0788505 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<typename... Interfaces>
+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 35b7946d384..56a8cc144c8 100644
--- a/drivers/wdm/audio/backpln/portcls/registry.cpp
+++ b/drivers/wdm/audio/backpln/portcls/registry.cpp
@@ -14,30 +14,18 @@
 
 #include <debug.h>
 
-class CRegistryKey : public IRegistryKey
+class CRegistryKey : public CUnknownImpl<IRegistryKey>
 {
 public:
     STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
 
-    STDMETHODIMP_(ULONG) AddRef()
-    {
-        InterlockedIncrement(&m_Ref);
-        return m_Ref;
-    }
-    STDMETHODIMP_(ULONG) Release()
+    IMP_IRegistryKey;
+    CRegistryKey(IUnknown * OuterUnknown, HANDLE hKey, BOOL CanDelete) :
+        m_hKey(hKey),
+        m_Deleted(FALSE),
+        m_CanDelete(CanDelete)
     {
-        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){}
     virtual ~CRegistryKey();
 
 protected:
@@ -45,7 +33,6 @@ protected:
     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 dfa4e7b7d83..19020345579 100644
--- a/drivers/wdm/audio/backpln/portcls/resource.cpp
+++ b/drivers/wdm/audio/backpln/portcls/resource.cpp
@@ -17,31 +17,22 @@
 
 #include <debug.h>
 
-class CResourceList : public IResourceList
+class CResourceList : public CUnknownImpl<IResourceList>
 {
 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 +42,6 @@ public:
     PCM_RESOURCE_LIST m_UntranslatedResourceList;
     ULONG m_NumberOfEntries;
     ULONG m_MaxEntries;
-    LONG m_Ref;
 };
 
 CResourceList::~CResourceList()
@@ -461,7 +451,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 50ebd7335a4..d3688a92c14 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<IServiceGroup>
 {
 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 @@ protected:
     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 9a3bc8cec66..ef9d7130888 100644
--- a/drivers/wdm/audio/backpln/portcls/unregister.cpp
+++ b/drivers/wdm/audio/backpln/portcls/unregister.cpp
@@ -14,37 +14,16 @@
 
 #include <debug.h>
 
-class CUnregisterSubdevice : public IUnregisterSubdevice
+class CUnregisterSubdevice : public CUnknownImpl<IUnregisterSubdevice>
 {
 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 629c74a4a6a..c3571cc7bd1 100644
--- a/drivers/wdm/audio/backpln/portcls/version.cpp
+++ b/drivers/wdm/audio/backpln/portcls/version.cpp
@@ -14,42 +14,20 @@
 
 #include <debug.h>
 
-class CPortClsVersion : public IPortClsVersion
+class CPortClsVersion : public CUnknownImpl<IPortClsVersion>
 {
 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;
-
 };
 
 

Reply via email to