From 99fa38809fd8ed38d4d59fa1fcf3babb3216b895 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 25 May 2019 12:22:04 +0200 Subject: [PATCH] [STDUNK][PORTCLS][CMIDriver] Fix issue with operator new/delete Fix for MSVC warning "C2323: 'operator new': non-member operator new or delete functions may not be declared static or in a namespace other than the global namespace." See https://docs.microsoft.com/en-us/cpp/porting/visual-cpp-what-s-new-2003-through-2015?view=vs-2019 section "Overloaded operator new and operator delete" --- CMakeLists.txt | 1 + .../wdm/audio/backpln/portcls/dma_slave.cpp | 10 ++++ .../wdm/audio/backpln/portcls/miniport.cpp | 26 ++++++++++ .../audio/backpln/portcls/miniport_dmus.cpp | 2 +- .../audio/backpln/portcls/pin_wavecyclic.cpp | 10 ++++ drivers/wdm/audio/backpln/portcls/private.hpp | 7 +++ drivers/wdm/audio/drivers/CMIDriver/precomp.h | 7 +++ sdk/include/ddk/stdunk.h | 2 +- sdk/lib/drivers/libusb/libusb.h | 1 - sdk/lib/drivers/sound/stdunk/cunknown.cpp | 52 +++++++++++++++++++ 10 files changed, 115 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 48b3b18a488..d7bf0a55574 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -186,6 +186,7 @@ else() endif() # Other + add_definitions(-D_NEW_DELETE_OPERATORS_) if(ARCH STREQUAL "i386") add_definitions(-DUSE_COMPILER_EXCEPTIONS -D_USE_32BIT_TIME_T) elseif(ARCH STREQUAL "amd64") diff --git a/drivers/wdm/audio/backpln/portcls/dma_slave.cpp b/drivers/wdm/audio/backpln/portcls/dma_slave.cpp index f299d3c57b4..a68d2779128 100644 --- a/drivers/wdm/audio/backpln/portcls/dma_slave.cpp +++ b/drivers/wdm/audio/backpln/portcls/dma_slave.cpp @@ -17,6 +17,16 @@ class CDmaChannelInit : public IDmaChannelInit { public: + inline + PVOID + operator new( + size_t Size, + POOL_TYPE PoolType, + ULONG Tag) + { + return ExAllocatePoolWithTag(PoolType, Size, Tag); + } + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); STDMETHODIMP_(ULONG) AddRef() diff --git a/drivers/wdm/audio/backpln/portcls/miniport.cpp b/drivers/wdm/audio/backpln/portcls/miniport.cpp index 992e29ea1e7..526a012c7b1 100644 --- a/drivers/wdm/audio/backpln/portcls/miniport.cpp +++ b/drivers/wdm/audio/backpln/portcls/miniport.cpp @@ -14,6 +14,32 @@ #include +PVOID +__cdecl +operator new( + size_t Size, + POOL_TYPE PoolType, + ULONG Tag) +{ + return ExAllocatePoolWithTag(PoolType, Size, Tag); +} + +void +__cdecl +operator delete( + PVOID ptr) +{ + ExFreePool(ptr); +} + +void +__cdecl +operator delete( + PVOID ptr, UINT_PTR) +{ + ExFreePool(ptr); +} + NTSTATUS NTAPI PcNewMiniport( diff --git a/drivers/wdm/audio/backpln/portcls/miniport_dmus.cpp b/drivers/wdm/audio/backpln/portcls/miniport_dmus.cpp index e13e0c48be8..957c84cf7ba 100644 --- a/drivers/wdm/audio/backpln/portcls/miniport_dmus.cpp +++ b/drivers/wdm/audio/backpln/portcls/miniport_dmus.cpp @@ -1708,7 +1708,7 @@ NewStream ) { CMiniportDMusUARTStream *pStream = - new(PoolType) CMiniportDMusUARTStream(); + new(PoolType, 'wNcP') CMiniportDMusUARTStream(); if (pStream) { diff --git a/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp b/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp index c9f86c34271..993ea92674b 100644 --- a/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp +++ b/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp @@ -18,6 +18,16 @@ class CPortPinWaveCyclic : public IPortPinWaveCyclic, public IServiceSink { public: + inline + PVOID + operator new( + size_t Size, + POOL_TYPE PoolType, + ULONG Tag) + { + return ExAllocatePoolWithTag(PoolType, Size, Tag); + } + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); STDMETHODIMP_(ULONG) AddRef() diff --git a/drivers/wdm/audio/backpln/portcls/private.hpp b/drivers/wdm/audio/backpln/portcls/private.hpp index ed756959fc3..17caee08bde 100644 --- a/drivers/wdm/audio/backpln/portcls/private.hpp +++ b/drivers/wdm/audio/backpln/portcls/private.hpp @@ -30,6 +30,13 @@ #define PC_ASSERT_IRQL(x) PC_ASSERT(KeGetCurrentIrql() <= (x)) #define PC_ASSERT_IRQL_EQUAL(x) PC_ASSERT(KeGetCurrentIrql()==(x)) +PVOID +__cdecl +operator new( + size_t Size, + POOL_TYPE PoolType, + ULONG Tag); + extern "C" NTSTATUS diff --git a/drivers/wdm/audio/drivers/CMIDriver/precomp.h b/drivers/wdm/audio/drivers/CMIDriver/precomp.h index 57b4be66e24..21599bca7b6 100644 --- a/drivers/wdm/audio/drivers/CMIDriver/precomp.h +++ b/drivers/wdm/audio/drivers/CMIDriver/precomp.h @@ -6,4 +6,11 @@ #include "debug.hpp" +PVOID +__cdecl +operator new( + size_t size, + POOL_TYPE pool_type, + ULONG tag); + #endif /* _CMIDRIVER_PCH_ */ diff --git a/sdk/include/ddk/stdunk.h b/sdk/include/ddk/stdunk.h index 67ce3d8fcc8..6649bf99524 100644 --- a/sdk/include/ddk/stdunk.h +++ b/sdk/include/ddk/stdunk.h @@ -211,7 +211,7 @@ operator delete( ExFreePool(ptr); } -#endif /* ALLOCATION_OPERATORS_DEFINED */ +#endif /* _NEW_DELETE_OPERATORS_ */ #else /* Being compiled with C */ diff --git a/sdk/lib/drivers/libusb/libusb.h b/sdk/lib/drivers/libusb/libusb.h index 004c2f0a25d..ee0bf584d55 100644 --- a/sdk/lib/drivers/libusb/libusb.h +++ b/sdk/lib/drivers/libusb/libusb.h @@ -22,7 +22,6 @@ extern "C" // the following includes are required to get kcom to compile // #include -#define _NEW_DELETE_OPERATORS_ #include PVOID diff --git a/sdk/lib/drivers/sound/stdunk/cunknown.cpp b/sdk/lib/drivers/sound/stdunk/cunknown.cpp index d97e6405481..1296247fb9f 100644 --- a/sdk/lib/drivers/sound/stdunk/cunknown.cpp +++ b/sdk/lib/drivers/sound/stdunk/cunknown.cpp @@ -11,6 +11,58 @@ #include +inline +PVOID +KCOM_New( + size_t size, + POOL_TYPE pool_type, + ULONG tag) +{ + PVOID result; + + result = ExAllocatePoolWithTag(pool_type, size, tag); + + if (result) + RtlZeroMemory(result, size); + + return result; +} + +PVOID +__cdecl +operator new( + size_t size, + POOL_TYPE pool_type) +{ + return KCOM_New(size, pool_type, 'wNcP'); +} + +PVOID +__cdecl +operator new( + size_t size, + POOL_TYPE pool_type, + ULONG tag) +{ + return KCOM_New(size, pool_type, tag); +} + +void +__cdecl +operator delete( + PVOID ptr) +{ + ExFreePool(ptr); +} + +void +__cdecl +operator delete( + PVOID ptr, UINT_PTR) +{ + ExFreePool(ptr); +} + CUnknown::CUnknown(PUNKNOWN outer_unknown) { m_ref_count = 0;