stdunk.cpp
来自「ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机」· C++ 代码 · 共 100 行
CPP
100 行
/*
TODO:
Need to call ASSERT on m_ref_count to ensure it is valid.
*/
#define PUT_GUIDS_HERE
//#include <portcls.h>
#include <punknown.h>
#include <stdunk.h>
#include <ntddk.h>
/*
HACK ALERT
This is a little bit of a hack, but ReactOS doesn't seem to have this
defined. TODO: Make the aligned test truly aligned.
*/
#if 0
#define IsEqualGUID(a, b) \
RtlEqualMemory(&a, &b, sizeof(GUID))
#define IsEqualGUIDAligned(a, b) \
IsEqualGUID(a, b)
#endif
/*
Shut the linker up - can also pass -defsym ___cxa_pure_virtual=0
*/
extern "C" void __cxa_pure_virtual(void) {}
/*
IUnknown
*/
CUnknown::CUnknown(PUNKNOWN outer_unknown)
{
m_ref_count = 0;
if ( outer_unknown )
{
m_outer_unknown = outer_unknown;
}
else
{
m_outer_unknown = PUNKNOWN(static_cast<PNONDELEGATINGUNKNOWN>(this));
}
}
CUnknown::~CUnknown()
{
}
/*
INonDelegatingUnknown
*/
STDMETHODIMP_(ULONG)
CUnknown::NonDelegatingAddRef(void)
{
InterlockedIncrement(&m_ref_count);
return m_ref_count;
}
STDMETHODIMP_(ULONG)
CUnknown::NonDelegatingRelease(void)
{
if ( InterlockedDecrement(&m_ref_count) == 0 )
{
delete this;
return 0;
}
return m_ref_count;
}
STDMETHODIMP_(NTSTATUS)
CUnknown::NonDelegatingQueryInterface(
IN REFIID iid,
IN PVOID* ppvoid)
{
//if ( RtlEqualMemory(&iid, &IID_IUnknown, sizeof(GUID)) )
{
*ppvoid = (PVOID)((PUNKNOWN) this);
}
// else
{
*ppvoid = NULL;
}
if ( *ppvoid )
{
((PUNKNOWN)(*ppvoid))->AddRef();
return STATUS_SUCCESS;
}
return STATUS_INVALID_PARAMETER;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?