mirror of
https://github.com/reactos/reactos.git
synced 2024-08-29 22:58:34 +00:00
209 lines
5 KiB
C
209 lines
5 KiB
C
/*
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
* PROJECT: ReactOS Kernel Streaming
|
|
* FILE: drivers/ksfilter/ks/topoology.c
|
|
* PURPOSE: KS CBaseUnknown functions
|
|
* PROGRAMMER: Johannes Anderwald
|
|
* KJK::Hyperion
|
|
*/
|
|
|
|
#include "precomp.h"
|
|
|
|
#define NDEBUG
|
|
#include <debug.h>
|
|
|
|
#ifdef _X86_
|
|
#define KS_DECL_CXX(RET_) extern RET_ __fastcall
|
|
#define KS_THIS(CLASS_) CLASS_ * This, void * dummy_
|
|
#else
|
|
#define KS_DECL_CXX(RET_) extern RET_ __cdecl
|
|
#define KS_THIS(CLASS_) CLASS_ * This
|
|
#endif
|
|
|
|
typedef struct
|
|
{
|
|
INonDelegatedUnknownVtbl *lpVtbl;
|
|
IIndirectedUnknownVtbl *lpVtblIndirectedUnknown;
|
|
|
|
LONG m_RefCount;
|
|
|
|
BOOLEAN m_UsingClassId;
|
|
CLSID m_ClassId;
|
|
IUnknown* m_UnknownOuter;
|
|
|
|
}CBaseUnknownImpl;
|
|
|
|
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
INonDelegatedUnknown_fnQueryInterface(
|
|
INonDelegatedUnknown * iface,
|
|
IN REFIID refiid,
|
|
OUT PVOID* Output)
|
|
{
|
|
CBaseUnknownImpl * This = (CBaseUnknownImpl*)CONTAINING_RECORD(iface, CBaseUnknownImpl, lpVtbl);
|
|
|
|
if (IsEqualGUIDAligned(refiid, &IID_IUnknown))
|
|
{
|
|
*Output = &This->lpVtbl;
|
|
_InterlockedIncrement(&This->m_RefCount);
|
|
return STATUS_SUCCESS;
|
|
}
|
|
return STATUS_NOINTERFACE;
|
|
}
|
|
|
|
ULONG
|
|
NTAPI
|
|
INonDelegatedUnknown_fnAddRef(
|
|
INonDelegatedUnknown * iface)
|
|
{
|
|
CBaseUnknownImpl * This = (CBaseUnknownImpl*)CONTAINING_RECORD(iface, CBaseUnknownImpl, lpVtbl);
|
|
|
|
return InterlockedIncrement(&This->m_RefCount);
|
|
}
|
|
|
|
ULONG
|
|
NTAPI
|
|
INonDelegatedUnknown_fnRelease(
|
|
INonDelegatedUnknown * iface)
|
|
{
|
|
CBaseUnknownImpl * This = (CBaseUnknownImpl*)CONTAINING_RECORD(iface, CBaseUnknownImpl, lpVtbl);
|
|
|
|
InterlockedDecrement(&This->m_RefCount);
|
|
|
|
/* Return new reference count */
|
|
return This->m_RefCount;
|
|
}
|
|
|
|
static INonDelegatedUnknownVtbl vt_INonDelegatedUnknownVtbl =
|
|
{
|
|
INonDelegatedUnknown_fnQueryInterface,
|
|
INonDelegatedUnknown_fnAddRef,
|
|
INonDelegatedUnknown_fnRelease
|
|
};
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
IIndirectedUnknown_fnQueryInterface(
|
|
IIndirectedUnknown * iface,
|
|
IN REFIID refiid,
|
|
OUT PVOID* Output)
|
|
{
|
|
CBaseUnknownImpl * This = (CBaseUnknownImpl*)CONTAINING_RECORD(iface, CBaseUnknownImpl, lpVtblIndirectedUnknown);
|
|
|
|
return This->m_UnknownOuter->lpVtbl->QueryInterface(This->m_UnknownOuter, refiid, Output);
|
|
}
|
|
|
|
ULONG
|
|
NTAPI
|
|
IIndirectedUnknown_fnAddRef(
|
|
IIndirectedUnknown * iface)
|
|
{
|
|
CBaseUnknownImpl * This = (CBaseUnknownImpl*)CONTAINING_RECORD(iface, CBaseUnknownImpl, lpVtblIndirectedUnknown);
|
|
|
|
return This->m_UnknownOuter->lpVtbl->AddRef(This->m_UnknownOuter);
|
|
}
|
|
|
|
ULONG
|
|
NTAPI
|
|
IIndirectedUnknown_fnRelease(
|
|
IIndirectedUnknown * iface)
|
|
{
|
|
CBaseUnknownImpl * This = (CBaseUnknownImpl*)CONTAINING_RECORD(iface, CBaseUnknownImpl, lpVtblIndirectedUnknown);
|
|
|
|
return This->m_UnknownOuter->lpVtbl->Release(This->m_UnknownOuter);
|
|
}
|
|
|
|
static IIndirectedUnknownVtbl vt_IIndirectedUnknownVtbl =
|
|
{
|
|
IIndirectedUnknown_fnQueryInterface,
|
|
IIndirectedUnknown_fnAddRef,
|
|
IIndirectedUnknown_fnRelease
|
|
};
|
|
|
|
|
|
KS_DECL_CXX(CBaseUnknownImpl *) CBaseUnknown_ConstructorWithGUID(KS_THIS(CBaseUnknownImpl), const GUID *lpGUID, IUnknown * OuterUnknown)
|
|
{
|
|
|
|
This->lpVtbl = &vt_INonDelegatedUnknownVtbl;
|
|
This->lpVtblIndirectedUnknown = &vt_IIndirectedUnknownVtbl;
|
|
|
|
/* class uses class id */
|
|
This->m_UsingClassId = TRUE;
|
|
|
|
/* copy guid */
|
|
RtlMoveMemory(&This->m_ClassId, lpGUID, sizeof(GUID));
|
|
|
|
/* set refcount to zero */
|
|
This->m_RefCount = 0;
|
|
|
|
if (OuterUnknown)
|
|
{
|
|
/* use outer unknown */
|
|
This->m_UnknownOuter = OuterUnknown;
|
|
}
|
|
else
|
|
{
|
|
/* use unknown from INonDelegatedUnknown */
|
|
This->m_UnknownOuter = (PUNKNOWN)&This->lpVtbl;
|
|
}
|
|
|
|
/* return result */
|
|
return This;
|
|
}
|
|
|
|
KS_DECL_CXX(CBaseUnknownImpl *) CBaseUnknown_Constructor(KS_THIS(CBaseUnknownImpl), IUnknown * OuterUnknown)
|
|
{
|
|
|
|
This->lpVtbl = &vt_INonDelegatedUnknownVtbl;
|
|
This->lpVtblIndirectedUnknown = &vt_IIndirectedUnknownVtbl;
|
|
|
|
/* class uses class id */
|
|
This->m_UsingClassId = FALSE;
|
|
|
|
/* set refcount to zero */
|
|
This->m_RefCount = 0;
|
|
|
|
if (OuterUnknown)
|
|
{
|
|
/* use outer unknown */
|
|
This->m_UnknownOuter = OuterUnknown;
|
|
}
|
|
else
|
|
{
|
|
/* use unknown from INonDelegatedUnknown */
|
|
This->m_UnknownOuter = (PUNKNOWN)&This->lpVtbl;
|
|
}
|
|
|
|
/* return result */
|
|
return This;
|
|
}
|
|
|
|
KS_DECL_CXX(VOID) CBaseUnknown_Destructor(KS_THIS(CBaseUnknownImpl), IUnknown * OuterUnknown)
|
|
{
|
|
/* restore vtbl's */
|
|
This->lpVtbl = &vt_INonDelegatedUnknownVtbl;
|
|
This->lpVtblIndirectedUnknown = &vt_IIndirectedUnknownVtbl;
|
|
|
|
|
|
if (OuterUnknown)
|
|
{
|
|
/* use outer unknown */
|
|
This->m_UnknownOuter = OuterUnknown;
|
|
}
|
|
else
|
|
{
|
|
/* use unknown from INonDelegatedUnknown */
|
|
This->m_UnknownOuter = (PUNKNOWN)&This->lpVtbl;
|
|
}
|
|
}
|
|
|
|
KS_DECL_CXX(VOID) CBaseUnknown_DefaultDestructor(KS_THIS(CBaseUnknownImpl))
|
|
{
|
|
/* restore vtbl's */
|
|
This->lpVtbl = &vt_INonDelegatedUnknownVtbl;
|
|
This->lpVtblIndirectedUnknown = &vt_IIndirectedUnknownVtbl;
|
|
}
|
|
|