You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
238 lines
7.2 KiB
238 lines
7.2 KiB
/*****************************************************************************
|
|
* stdunk.h - standard IUnknown implementaton definitions
|
|
*****************************************************************************
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
*/
|
|
|
|
#ifndef _STDUNK_H_
|
|
#define _STDUNK_H_
|
|
|
|
#include "punknown.h"
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
* Interfaces
|
|
*/
|
|
|
|
/*****************************************************************************
|
|
* INonDelegatingUnknown
|
|
*****************************************************************************
|
|
* Non-delegating unknown 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;
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
* Classes
|
|
*/
|
|
|
|
/*****************************************************************************
|
|
* CUnknown
|
|
*****************************************************************************
|
|
* Base INonDelegatingUnknown implementation.
|
|
*/
|
|
class CUnknown : public INonDelegatingUnknown
|
|
{
|
|
private:
|
|
|
|
LONG m_lRefCount; // Reference count.
|
|
PUNKNOWN m_pUnknownOuter; // Outer IUnknown.
|
|
|
|
public:
|
|
|
|
/*************************************************************************
|
|
* CUnknown methods.
|
|
*/
|
|
CUnknown(PUNKNOWN pUnknownOuter);
|
|
virtual ~CUnknown(void);
|
|
PUNKNOWN GetOuterUnknown(void)
|
|
{
|
|
return m_pUnknownOuter;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* INonDelegatingUnknown methods.
|
|
*/
|
|
STDMETHODIMP_(ULONG) NonDelegatingAddRef
|
|
( void
|
|
);
|
|
STDMETHODIMP_(ULONG) NonDelegatingRelease
|
|
( void
|
|
);
|
|
STDMETHODIMP_(NTSTATUS) NonDelegatingQueryInterface
|
|
(
|
|
REFIID rIID,
|
|
PVOID * ppVoid
|
|
);
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
* Macros
|
|
*/
|
|
|
|
/*****************************************************************************
|
|
* DECLARE_STD_UNKNOWN
|
|
*****************************************************************************
|
|
* Various declarations for standard objects based on CUnknown.
|
|
*/
|
|
#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(Class) \
|
|
Class(PUNKNOWN pUnknownOuter) \
|
|
: CUnknown(pUnknownOuter) \
|
|
{ \
|
|
}
|
|
|
|
#define QICAST(Type) \
|
|
PVOID((Type)(this))
|
|
|
|
#define QICASTUNKNOWN(Type) \
|
|
PVOID(PUNKNOWN((Type)(this)))
|
|
|
|
#define STD_CREATE_BODY_WITH_TAG_(Class,ppUnknown,pUnknownOuter,poolType,tag,base) \
|
|
NTSTATUS ntStatus; \
|
|
Class *p = new(poolType,tag) Class(pUnknownOuter); \
|
|
if (p) \
|
|
{ \
|
|
*ppUnknown = PUNKNOWN((base)(p)); \
|
|
(*ppUnknown)->AddRef(); \
|
|
ntStatus = STATUS_SUCCESS; \
|
|
} \
|
|
else \
|
|
{ \
|
|
ntStatus = STATUS_INSUFFICIENT_RESOURCES; \
|
|
} \
|
|
return ntStatus
|
|
|
|
#define STD_CREATE_BODY_WITH_TAG(Class,ppUnknown,pUnknownOuter,poolType,tag) \
|
|
STD_CREATE_BODY_WITH_TAG_(Class,ppUnknown,pUnknownOuter,poolType,tag,PUNKNOWN)
|
|
|
|
#define STD_CREATE_BODY_(Class,ppUnknown,pUnknownOuter,poolType,base) \
|
|
STD_CREATE_BODY_WITH_TAG_(Class,ppUnknown,pUnknownOuter,poolType,'rCcP',base)
|
|
|
|
#define STD_CREATE_BODY(Class,ppUnknown,pUnknownOuter,poolType) \
|
|
STD_CREATE_BODY_(Class,ppUnknown,pUnknownOuter,poolType,PUNKNOWN)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
* Functions
|
|
*/
|
|
#ifndef PC_KDEXT // this is not needed for the KD extensions.
|
|
#ifndef _NEW_DELETE_OPERATORS_
|
|
#define _NEW_DELETE_OPERATORS_
|
|
|
|
/*****************************************************************************
|
|
* ::new()
|
|
*****************************************************************************
|
|
* New function for creating objects with a specified allocation tag.
|
|
*/
|
|
inline PVOID operator new
|
|
(
|
|
size_t iSize,
|
|
POOL_TYPE poolType
|
|
)
|
|
{
|
|
PVOID result = ExAllocatePoolWithTag(poolType,iSize,'wNcP');
|
|
|
|
if (result)
|
|
{
|
|
RtlZeroMemory(result,iSize);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
/*****************************************************************************
|
|
* ::new()
|
|
*****************************************************************************
|
|
* New function for creating objects with a specified allocation tag.
|
|
*/
|
|
inline PVOID operator new
|
|
(
|
|
size_t iSize,
|
|
POOL_TYPE poolType,
|
|
ULONG tag
|
|
)
|
|
{
|
|
PVOID result = ExAllocatePoolWithTag(poolType,iSize,tag);
|
|
|
|
if (result)
|
|
{
|
|
RtlZeroMemory(result,iSize);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
/*****************************************************************************
|
|
* ::delete()
|
|
*****************************************************************************
|
|
* Delete function.
|
|
*/
|
|
inline void __cdecl operator delete
|
|
(
|
|
PVOID pVoid
|
|
)
|
|
{
|
|
if (pVoid)
|
|
{
|
|
ExFreePool(pVoid);
|
|
}
|
|
}
|
|
|
|
|
|
#endif //!_NEW_DELETE_OPERATORS_
|
|
|
|
#endif // PC_KDEXT
|
|
|
|
|
|
|
|
#endif
|