Reactos
at listview 124 lines 1.9 kB view raw
1/* 2 ReactOS Kernel-Mode COM 3 IUnknown implementations 4 5 LICENSE 6 Please see COPYING in the top-level directory for license information. 7 8 AUTHORS 9 Andrew Greenwood 10*/ 11 12#include <stdunk.h> 13 14inline 15PVOID 16KCOM_New( 17 size_t size, 18 POOL_TYPE pool_type, 19 ULONG tag) 20{ 21 PVOID result; 22 23 result = ExAllocatePoolWithTag(pool_type, size, tag); 24 25 if (result) 26 RtlZeroMemory(result, size); 27 28 return result; 29} 30 31PVOID 32__cdecl 33operator new( 34 size_t size, 35 POOL_TYPE pool_type) 36{ 37 return KCOM_New(size, pool_type, 'wNcP'); 38} 39 40PVOID 41__cdecl 42operator new( 43 size_t size, 44 POOL_TYPE pool_type, 45 ULONG tag) 46{ 47 return KCOM_New(size, pool_type, tag); 48} 49 50void 51__cdecl 52operator delete( 53 PVOID ptr) 54{ 55 ExFreePool(ptr); 56} 57 58void 59__cdecl 60operator delete( 61 PVOID ptr, UINT_PTR) 62{ 63 ExFreePool(ptr); 64} 65 66CUnknown::CUnknown(PUNKNOWN outer_unknown) 67{ 68 m_ref_count = 0; 69 70 if ( outer_unknown ) 71 m_outer_unknown = outer_unknown; 72 else 73 m_outer_unknown = PUNKNOWN(dynamic_cast<PNONDELEGATINGUNKNOWN>(this)); 74} 75 76CUnknown::~CUnknown() 77{ 78} 79 80STDMETHODIMP_(ULONG) 81CUnknown::NonDelegatingAddRef() 82{ 83 InterlockedIncrement(&m_ref_count); 84 return m_ref_count; 85} 86 87STDMETHODIMP_(ULONG) 88CUnknown::NonDelegatingRelease() 89{ 90 if ( InterlockedDecrement(&m_ref_count) == 0 ) 91 { 92 m_ref_count ++; 93 delete this; 94 return 0; 95 } 96 97 return m_ref_count; 98} 99 100STDMETHODIMP_(NTSTATUS) 101CUnknown::NonDelegatingQueryInterface( 102 IN REFIID iid, 103 PVOID* ppVoid) 104{ 105 /* FIXME */ 106 #if 0 107 if ( IsEqualGUID(iid, IID_IUnknown) ) /* TODO: Aligned? */ 108 *ppVoid = PVOID(PUNKNOWN(this)); 109 else 110 *ppVoid = NULL; 111 #endif 112 113 if ( *ppVoid ) 114 { 115 PUNKNOWN(*ppVoid)->AddRef(); 116 return STATUS_SUCCESS; 117 } 118 119 return STATUS_INVALID_PARAMETER; 120} 121 122#if __GNUC__ 123extern "C" void __cxa_pure_virtual() { ASSERT(FALSE); } 124#endif