2 ReactOS Kernel-Mode COM
3 IUnknown implementations
6 Please see COPYING in the top-level directory for license information.
15 #define STDUNK_TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
19 /* ===============================================================
20 INonDelegatingUnknown interface
23 DECLARE_INTERFACE(INonDelegatingUnknown
)
25 STDMETHOD_(NTSTATUS
, NonDelegatingQueryInterface
)( THIS_
29 STDMETHOD_(ULONG
, NonDelegatingAddRef
)( THIS
) PURE
;
30 STDMETHOD_(ULONG
, NonDelegatingRelease
)( THIS
) PURE
;
33 typedef INonDelegatingUnknown
*PNONDELEGATINGUNKNOWN
;
36 /* ===============================================================
37 CUnknown declaration / definition
39 There are 2 variants for this, and I'm not sure if the C
45 class CUnknown
: public INonDelegatingUnknown
49 PUNKNOWN m_outer_unknown
;
53 CUnknown(PUNKNOWN pUnknownOuter
);
56 PUNKNOWN
GetOuterUnknown()
57 { return m_outer_unknown
; }
59 /* INonDelegatingUnknown */
60 STDMETHODIMP_(ULONG
) NonDelegatingAddRef();
61 STDMETHODIMP_(ULONG
) NonDelegatingRelease();
63 STDMETHODIMP_(NTSTATUS
) NonDelegatingQueryInterface(
68 #define DECLARE_STD_UNKNOWN() \
69 STDMETHODIMP_(NTSTATUS) NonDelegatingQueryInterface( \
73 STDMETHODIMP_(NTSTATUS) QueryInterface( \
77 return GetOuterUnknown()->QueryInterface(riid, ppv); \
80 STDMETHODIMP_(ULONG) AddRef() \
82 return GetOuterUnknown()->AddRef(); \
85 STDMETHODIMP_(ULONG) Release() \
87 return GetOuterUnknown()->Release(); \
90 #define DEFINE_STD_CONSTRUCTOR(classname) \
91 classname(PUNKNOWN outer_unknown) \
92 : CUnknown(outer_unknown) \
95 #else /* Not C++ - this is probably very buggy... */
99 Unknown_QueryInterface(
107 IUnknown
* unknown_this
);
112 IUnknown
* unknown_this
);
114 typedef struct CUnknown
119 INonDelegatingUnknown INonDelegatingUnknown
;
123 PUNKNOWN m_outer_unknown
;
126 #endif /* __cplusplus */
133 /* ===============================================================
137 #define QICAST(typename) \
138 PVOID( (typename) (this) )
140 #define QICASTUNKNOWN(typename) \
141 PVOID( PUNKNOWN( (typename) (this) ) )
143 #define STD_CREATE_BODY_WITH_TAG_(classname, unknown, outer_unknown, pool_type, tag, base) \
144 classname *new_ptr = new(pool_type, tag) classname(outer_unknown); \
147 return STATUS_INSUFFICIENT_RESOURCES; \
149 *unknown = PUNKNOWN((base)(new_ptr)); \
150 (*unknown)->AddRef(); \
151 return STATUS_SUCCESS
153 #define STD_CREATE_BODY_WITH_TAG(classname, unknown, outer_unknown, pool_type, tag, base) \
154 STD_CREATE_BODY_WITH_TAG_(classname, unknown, outer_unknown, pool_type, tag, PUNKNOWN)
156 #define STD_CREATE_BODY_(classname, unknown, outer_unknown, pool_type, base) \
157 STD_CREATE_BODY_WITH_TAG_(classname, unknown, outer_unknown, pool_type, STDUNK_TAG('r','C','c','P'), base)
159 #define STD_CREATE_BODY(classname, unknown, outer_unknown, pool_type) \
160 STD_CREATE_BODY_(classname, unknown, outer_unknown, pool_type, PUNKNOWN)
163 /* ===============================================================
164 Custom "new" and "delete" C++ operators
167 #ifndef ALLOCATION_OPERATORS_DEFINED
168 #define ALLOCATION_OPERATORS_DEFINED
178 result
= ExAllocatePoolWithTag(pool_type
, size
, tag
);
181 RtlZeroMemory(result
, size
);
191 return KCOM_New(size
, pool_type
, STDUNK_TAG ('w','N','c','P'));
200 return KCOM_New(size
, pool_type
, tag
);
210 #endif /* ALLOCATION_OPERATORS_DEFINED */
213 #else /* Being compiled with C */
216 #endif /* __cplusplus */
218 #endif /* include guard */