2013-04-02 12:45:31 +00:00
|
|
|
/*
|
|
|
|
ReactOS Kernel-Mode COM
|
|
|
|
IUnknown implementations
|
|
|
|
|
|
|
|
LICENSE
|
|
|
|
Please see COPYING in the top-level directory for license information.
|
|
|
|
|
|
|
|
AUTHORS
|
|
|
|
Andrew Greenwood
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdunk.h>
|
|
|
|
|
2019-05-25 10:22:04 +00:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2013-04-02 12:45:31 +00:00
|
|
|
CUnknown::CUnknown(PUNKNOWN outer_unknown)
|
|
|
|
{
|
|
|
|
m_ref_count = 0;
|
|
|
|
|
|
|
|
if ( outer_unknown )
|
|
|
|
m_outer_unknown = outer_unknown;
|
|
|
|
else
|
|
|
|
m_outer_unknown = PUNKNOWN(dynamic_cast<PNONDELEGATINGUNKNOWN>(this));
|
|
|
|
}
|
|
|
|
|
|
|
|
CUnknown::~CUnknown()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
STDMETHODIMP_(ULONG)
|
|
|
|
CUnknown::NonDelegatingAddRef()
|
|
|
|
{
|
|
|
|
InterlockedIncrement(&m_ref_count);
|
|
|
|
return m_ref_count;
|
|
|
|
}
|
|
|
|
|
|
|
|
STDMETHODIMP_(ULONG)
|
|
|
|
CUnknown::NonDelegatingRelease()
|
|
|
|
{
|
|
|
|
if ( InterlockedDecrement(&m_ref_count) == 0 )
|
|
|
|
{
|
|
|
|
m_ref_count ++;
|
|
|
|
delete this;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return m_ref_count;
|
|
|
|
}
|
|
|
|
|
|
|
|
STDMETHODIMP_(NTSTATUS)
|
|
|
|
CUnknown::NonDelegatingQueryInterface(
|
|
|
|
IN REFIID iid,
|
|
|
|
PVOID* ppVoid)
|
|
|
|
{
|
|
|
|
/* FIXME */
|
|
|
|
#if 0
|
|
|
|
if ( IsEqualGUID(iid, IID_IUnknown) ) /* TODO: Aligned? */
|
|
|
|
*ppVoid = PVOID(PUNKNOWN(this));
|
|
|
|
else
|
|
|
|
*ppVoid = NULL;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
if ( *ppVoid )
|
|
|
|
{
|
|
|
|
PUNKNOWN(*ppVoid)->AddRef();
|
|
|
|
return STATUS_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
return STATUS_INVALID_PARAMETER;
|
|
|
|
}
|
|
|
|
|
|
|
|
#if __GNUC__
|
|
|
|
extern "C" void __cxa_pure_virtual() { ASSERT(FALSE); }
|
|
|
|
#endif
|