123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- /*
- ReactOS Kernel-Mode COM
- IUnknown implementations
- This file is in the public domain.
- AUTHORS
- Andrew Greenwood
- */
- #ifndef STDUNK_H
- #define STDUNK_H
- #include <punknown.h>
- /* ===============================================================
- INonDelegatingUnknown interface
- */
- DECLARE_INTERFACE(INonDelegatingUnknown)
- {
- STDMETHOD_(NTSTATUS, NonDelegatingQueryInterface)( THIS_
- IN REFIID,
- OUT PVOID*) PURE;
- STDMETHOD_(ULONG, NonDelegatingAddRef)( THIS ) PURE;
- STDMETHOD_(ULONG, NonDelegatingRelease)( THIS ) PURE;
- };
- typedef INonDelegatingUnknown *PNONDELEGATINGUNKNOWN;
- /* ===============================================================
- CUnknown declaration / definition
- There are 2 variants for this, and I'm not sure if the C
- version is correct.
- */
- #ifdef __cplusplus
- class CUnknown : public INonDelegatingUnknown
- {
- private :
- LONG m_ref_count;
- PUNKNOWN m_outer_unknown;
- public :
- /* CUnknown */
- CUnknown(PUNKNOWN pUnknownOuter);
- virtual ~CUnknown();
- PUNKNOWN GetOuterUnknown()
- { return m_outer_unknown; }
- /* INonDelegatingUnknown */
- STDMETHODIMP_(ULONG) NonDelegatingAddRef();
- STDMETHODIMP_(ULONG) NonDelegatingRelease();
- STDMETHODIMP_(NTSTATUS) NonDelegatingQueryInterface(
- REFIID rIID,
- PVOID* ppVoid);
- };
- #define DECLARE_STD_UNKNOWN() \
- STDMETHODIMP_(NTSTATUS) NonDelegatingQueryInterface( \
- REFIID iid, \
- PVOID* ppvObject); \
- \
- STDMETHODIMP_(NTSTATUS) QueryInterface( \
- REFIID riid, \
- void** ppv) \
- { \
- return GetOuterUnknown()->QueryInterface(riid, ppv); \
- } \
- \
- STDMETHODIMP_(ULONG) AddRef() \
- { \
- return GetOuterUnknown()->AddRef(); \
- } \
- \
- STDMETHODIMP_(ULONG) Release() \
- { \
- return GetOuterUnknown()->Release(); \
- }
- #define DEFINE_STD_CONSTRUCTOR(classname) \
- classname(PUNKNOWN outer_unknown) \
- : CUnknown(outer_unknown) \
- { }
- #else /* Not C++ - this is probably very buggy... */
- NTSTATUS
- STDMETHODCALLTYPE
- Unknown_QueryInterface(
- IUnknown* this,
- IN REFIID refiid,
- OUT PVOID* output);
- ULONG
- STDMETHODCALLTYPE
- Unknown_AddRef(
- IUnknown* unknown_this);
- ULONG
- STDMETHODCALLTYPE
- Unknown_Release(
- IUnknown* unknown_this);
- typedef struct CUnknown
- {
- __GNU_EXTENSION union
- {
- IUnknown IUnknown;
- INonDelegatingUnknown INonDelegatingUnknown;
- };
- LONG m_ref_count;
- PUNKNOWN m_outer_unknown;
- } CUnknown;
- #endif /* __cplusplus */
- #ifdef __cplusplus
- /* ===============================================================
- Construction helpers
- */
- #define QICAST(typename) \
- PVOID( (typename) (this) )
- #define QICASTUNKNOWN(typename) \
- PVOID( PUNKNOWN( (typename) (this) ) )
- #define STD_CREATE_BODY_WITH_TAG_(classname, unknown, outer_unknown, pool_type, tag, base) \
- classname *new_ptr = new(pool_type, tag) classname(outer_unknown); \
- \
- if ( ! new_ptr ) \
- return STATUS_INSUFFICIENT_RESOURCES; \
- \
- *unknown = PUNKNOWN((base)(new_ptr)); \
- (*unknown)->AddRef(); \
- return STATUS_SUCCESS
- #define STD_CREATE_BODY_WITH_TAG(classname, unknown, outer_unknown, pool_type, tag, base) \
- STD_CREATE_BODY_WITH_TAG_(classname, unknown, outer_unknown, pool_type, tag, PUNKNOWN)
- #define STD_CREATE_BODY_(classname, unknown, outer_unknown, pool_type, base) \
- STD_CREATE_BODY_WITH_TAG_(classname, unknown, outer_unknown, pool_type, 'rCcP', base)
- #define STD_CREATE_BODY(classname, unknown, outer_unknown, pool_type) \
- STD_CREATE_BODY_(classname, unknown, outer_unknown, pool_type, PUNKNOWN)
- /* ===============================================================
- Custom "new" and "delete" C++ operators
- */
- #ifndef _NEW_DELETE_OPERATORS_
- #define _NEW_DELETE_OPERATORS_
- 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;
- }
- inline PVOID
- operator new (
- size_t size,
- POOL_TYPE pool_type)
- {
- return KCOM_New(size, pool_type, 'wNcP');
- }
- inline PVOID
- operator new (
- size_t size,
- POOL_TYPE pool_type,
- ULONG tag)
- {
- return KCOM_New(size, pool_type, tag);
- }
- inline void __cdecl
- operator delete(
- PVOID ptr)
- {
- ExFreePool(ptr);
- }
- #endif /* ALLOCATION_OPERATORS_DEFINED */
- #else /* Being compiled with C */
- #endif /* __cplusplus */
- #endif /* include guard */
|