Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209/* * 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;
NTSTATUSNTAPIINonDelegatedUnknown_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;}
ULONGNTAPIINonDelegatedUnknown_fnAddRef( INonDelegatedUnknown * iface){ CBaseUnknownImpl * This = (CBaseUnknownImpl*)CONTAINING_RECORD(iface, CBaseUnknownImpl, lpVtbl);
return InterlockedIncrement(&This->m_RefCount);}
ULONGNTAPIINonDelegatedUnknown_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};
NTSTATUSNTAPIIIndirectedUnknown_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);}
ULONGNTAPIIIndirectedUnknown_fnAddRef( IIndirectedUnknown * iface){ CBaseUnknownImpl * This = (CBaseUnknownImpl*)CONTAINING_RECORD(iface, CBaseUnknownImpl, lpVtblIndirectedUnknown);
return This->m_UnknownOuter->lpVtbl->AddRef(This->m_UnknownOuter);}
ULONGNTAPIIIndirectedUnknown_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;}