Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenunknown.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS Kernel Streaming 00004 * FILE: drivers/ksfilter/ks/topoology.c 00005 * PURPOSE: KS CBaseUnknown functions 00006 * PROGRAMMER: Johannes Anderwald 00007 * KJK::Hyperion 00008 */ 00009 00010 00011 #include "priv.h" 00012 00013 #ifdef _X86_ 00014 #define KS_DECL_CXX(RET_) extern RET_ __fastcall 00015 #define KS_THIS(CLASS_) CLASS_ * This, void * dummy_ 00016 #else 00017 #define KS_DECL_CXX(RET_) extern RET_ __cdecl 00018 #define KS_THIS(CLASS_) CLASS_ * This 00019 #endif 00020 00021 typedef struct 00022 { 00023 INonDelegatedUnknownVtbl *lpVtbl; 00024 IIndirectedUnknownVtbl *lpVtblIndirectedUnknown; 00025 00026 LONG m_RefCount; 00027 00028 BOOLEAN m_UsingClassId; 00029 CLSID m_ClassId; 00030 IUnknown* m_UnknownOuter; 00031 00032 }CBaseUnknownImpl; 00033 00034 00035 00036 NTSTATUS 00037 NTAPI 00038 INonDelegatedUnknown_fnQueryInterface( 00039 INonDelegatedUnknown * iface, 00040 IN REFIID refiid, 00041 OUT PVOID* Output) 00042 { 00043 CBaseUnknownImpl * This = (CBaseUnknownImpl*)CONTAINING_RECORD(iface, CBaseUnknownImpl, lpVtbl); 00044 00045 if (IsEqualGUIDAligned(refiid, &IID_IUnknown)) 00046 { 00047 *Output = &This->lpVtbl; 00048 _InterlockedIncrement(&This->m_RefCount); 00049 return STATUS_SUCCESS; 00050 } 00051 return STATUS_NOINTERFACE; 00052 } 00053 00054 ULONG 00055 NTAPI 00056 INonDelegatedUnknown_fnAddRef( 00057 INonDelegatedUnknown * iface) 00058 { 00059 CBaseUnknownImpl * This = (CBaseUnknownImpl*)CONTAINING_RECORD(iface, CBaseUnknownImpl, lpVtbl); 00060 00061 return InterlockedIncrement(&This->m_RefCount); 00062 } 00063 00064 ULONG 00065 NTAPI 00066 INonDelegatedUnknown_fnRelease( 00067 INonDelegatedUnknown * iface) 00068 { 00069 CBaseUnknownImpl * This = (CBaseUnknownImpl*)CONTAINING_RECORD(iface, CBaseUnknownImpl, lpVtbl); 00070 00071 InterlockedDecrement(&This->m_RefCount); 00072 00073 /* Return new reference count */ 00074 return This->m_RefCount; 00075 } 00076 00077 static INonDelegatedUnknownVtbl vt_INonDelegatedUnknownVtbl = 00078 { 00079 INonDelegatedUnknown_fnQueryInterface, 00080 INonDelegatedUnknown_fnAddRef, 00081 INonDelegatedUnknown_fnRelease 00082 }; 00083 00084 NTSTATUS 00085 NTAPI 00086 IIndirectedUnknown_fnQueryInterface( 00087 IIndirectedUnknown * iface, 00088 IN REFIID refiid, 00089 OUT PVOID* Output) 00090 { 00091 CBaseUnknownImpl * This = (CBaseUnknownImpl*)CONTAINING_RECORD(iface, CBaseUnknownImpl, lpVtblIndirectedUnknown); 00092 00093 return This->m_UnknownOuter->lpVtbl->QueryInterface(This->m_UnknownOuter, refiid, Output); 00094 } 00095 00096 ULONG 00097 NTAPI 00098 IIndirectedUnknown_fnAddRef( 00099 IIndirectedUnknown * iface) 00100 { 00101 CBaseUnknownImpl * This = (CBaseUnknownImpl*)CONTAINING_RECORD(iface, CBaseUnknownImpl, lpVtblIndirectedUnknown); 00102 00103 return This->m_UnknownOuter->lpVtbl->AddRef(This->m_UnknownOuter); 00104 } 00105 00106 ULONG 00107 NTAPI 00108 IIndirectedUnknown_fnRelease( 00109 IIndirectedUnknown * iface) 00110 { 00111 CBaseUnknownImpl * This = (CBaseUnknownImpl*)CONTAINING_RECORD(iface, CBaseUnknownImpl, lpVtblIndirectedUnknown); 00112 00113 return This->m_UnknownOuter->lpVtbl->Release(This->m_UnknownOuter); 00114 } 00115 00116 static IIndirectedUnknownVtbl vt_IIndirectedUnknownVtbl = 00117 { 00118 IIndirectedUnknown_fnQueryInterface, 00119 IIndirectedUnknown_fnAddRef, 00120 IIndirectedUnknown_fnRelease 00121 }; 00122 00123 00124 KS_DECL_CXX(CBaseUnknownImpl *) CBaseUnknown_ConstructorWithGUID(KS_THIS(CBaseUnknownImpl), const GUID *lpGUID, IUnknown * OuterUnknown) 00125 { 00126 00127 This->lpVtbl = &vt_INonDelegatedUnknownVtbl; 00128 This->lpVtblIndirectedUnknown = &vt_IIndirectedUnknownVtbl; 00129 00130 /* class uses class id */ 00131 This->m_UsingClassId = TRUE; 00132 00133 /* copy guid */ 00134 RtlMoveMemory(&This->m_ClassId, lpGUID, sizeof(GUID)); 00135 00136 /* set refcount to zero */ 00137 This->m_RefCount = 0; 00138 00139 if (OuterUnknown) 00140 { 00141 /* use outer unknown */ 00142 This->m_UnknownOuter = OuterUnknown; 00143 } 00144 else 00145 { 00146 /* use unknown from INonDelegatedUnknown */ 00147 This->m_UnknownOuter = (PUNKNOWN)&This->lpVtbl; 00148 } 00149 00150 /* return result */ 00151 return This; 00152 } 00153 00154 KS_DECL_CXX(CBaseUnknownImpl *) CBaseUnknown_Constructor(KS_THIS(CBaseUnknownImpl), IUnknown * OuterUnknown) 00155 { 00156 00157 This->lpVtbl = &vt_INonDelegatedUnknownVtbl; 00158 This->lpVtblIndirectedUnknown = &vt_IIndirectedUnknownVtbl; 00159 00160 /* class uses class id */ 00161 This->m_UsingClassId = FALSE; 00162 00163 /* set refcount to zero */ 00164 This->m_RefCount = 0; 00165 00166 if (OuterUnknown) 00167 { 00168 /* use outer unknown */ 00169 This->m_UnknownOuter = OuterUnknown; 00170 } 00171 else 00172 { 00173 /* use unknown from INonDelegatedUnknown */ 00174 This->m_UnknownOuter = (PUNKNOWN)&This->lpVtbl; 00175 } 00176 00177 /* return result */ 00178 return This; 00179 } 00180 00181 KS_DECL_CXX(VOID) CBaseUnknown_Destructor(KS_THIS(CBaseUnknownImpl), IUnknown * OuterUnknown) 00182 { 00183 /* restore vtbl's */ 00184 This->lpVtbl = &vt_INonDelegatedUnknownVtbl; 00185 This->lpVtblIndirectedUnknown = &vt_IIndirectedUnknownVtbl; 00186 00187 00188 if (OuterUnknown) 00189 { 00190 /* use outer unknown */ 00191 This->m_UnknownOuter = OuterUnknown; 00192 } 00193 else 00194 { 00195 /* use unknown from INonDelegatedUnknown */ 00196 This->m_UnknownOuter = (PUNKNOWN)&This->lpVtbl; 00197 } 00198 } 00199 00200 KS_DECL_CXX(VOID) CBaseUnknown_DefaultDestructor(KS_THIS(CBaseUnknownImpl)) 00201 { 00202 /* restore vtbl's */ 00203 This->lpVtbl = &vt_INonDelegatedUnknownVtbl; 00204 This->lpVtblIndirectedUnknown = &vt_IIndirectedUnknownVtbl; 00205 } 00206 Generated on Sun May 27 2012 04:27:58 for ReactOS by
1.7.6.1
|