1 /* 2 * DXDiag 3 * 4 * Copyright 2004 Raphael Junqueira 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 19 * 20 */ 21 22 #define COBJMACROS 23 24 #include "config.h" 25 #include <stdarg.h> 26 27 #include "windef.h" 28 #include "winbase.h" 29 #include "objbase.h" 30 #include "oleauto.h" 31 #include "oleidl.h" 32 #include "rpcproxy.h" 33 #include "initguid.h" 34 #include "dxdiag_private.h" 35 #include "wine/debug.h" 36 37 WINE_DEFAULT_DEBUG_CHANNEL(dxdiag); 38 39 HINSTANCE dxdiagn_instance = 0; 40 41 LONG DXDIAGN_refCount = 0; 42 43 /* At process attach */ 44 BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved) 45 { 46 TRACE("%p,%x,%p\n", hInstDLL, fdwReason, lpvReserved); 47 if (fdwReason == DLL_PROCESS_ATTACH) { 48 dxdiagn_instance = hInstDLL; 49 DisableThreadLibraryCalls(hInstDLL); 50 } 51 return TRUE; 52 } 53 54 /******************************************************************************* 55 * DXDiag ClassFactory 56 */ 57 typedef struct { 58 IClassFactory IClassFactory_iface; 59 } IClassFactoryImpl; 60 61 static HRESULT WINAPI DXDiagCF_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv) 62 { 63 if (ppv == NULL) 64 return E_POINTER; 65 66 if (IsEqualGUID(&IID_IUnknown, riid)) 67 TRACE("(%p)->(IID_IUnknown %p)\n", iface, ppv); 68 else if (IsEqualGUID(&IID_IClassFactory, riid)) 69 TRACE("(%p)->(IID_IClassFactory %p)\n", iface, ppv); 70 else if (IsEqualGUID(&IID_IExternalConnection, riid) || 71 IsEqualGUID(&IID_IMarshal, riid)) { 72 TRACE("(%p)->(%s) ignoring\n", iface, debugstr_guid(riid)); 73 *ppv = NULL; 74 return E_NOINTERFACE; 75 } 76 else { 77 FIXME("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppv); 78 *ppv = NULL; 79 return E_NOINTERFACE; 80 } 81 82 *ppv = iface; 83 IClassFactory_AddRef(iface); 84 return S_OK; 85 } 86 87 static ULONG WINAPI DXDiagCF_AddRef(IClassFactory *iface) 88 { 89 DXDIAGN_LockModule(); 90 91 return 2; /* non-heap based object */ 92 } 93 94 static ULONG WINAPI DXDiagCF_Release(IClassFactory * iface) 95 { 96 DXDIAGN_UnlockModule(); 97 98 return 1; /* non-heap based object */ 99 } 100 101 static HRESULT WINAPI DXDiagCF_CreateInstance(IClassFactory *iface, IUnknown *pOuter, REFIID riid, 102 void **ppv) 103 { 104 TRACE("(%p)->(%p,%s,%p)\n", iface, pOuter, debugstr_guid(riid), ppv); 105 106 return DXDiag_CreateDXDiagProvider(iface, pOuter, riid, ppv); 107 } 108 109 static HRESULT WINAPI DXDiagCF_LockServer(IClassFactory *iface, BOOL dolock) 110 { 111 TRACE("(%d)\n", dolock); 112 113 if (dolock) 114 DXDIAGN_LockModule(); 115 else 116 DXDIAGN_UnlockModule(); 117 118 return S_OK; 119 } 120 121 static const IClassFactoryVtbl DXDiagCF_Vtbl = { 122 DXDiagCF_QueryInterface, 123 DXDiagCF_AddRef, 124 DXDiagCF_Release, 125 DXDiagCF_CreateInstance, 126 DXDiagCF_LockServer 127 }; 128 129 static IClassFactoryImpl DXDiag_CF = { { &DXDiagCF_Vtbl } }; 130 131 /*********************************************************************** 132 * DllCanUnloadNow (DXDIAGN.@) 133 */ 134 HRESULT WINAPI DllCanUnloadNow(void) 135 { 136 return DXDIAGN_refCount != 0 ? S_FALSE : S_OK; 137 } 138 139 /*********************************************************************** 140 * DllGetClassObject (DXDIAGN.@) 141 */ 142 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) 143 { 144 TRACE("(%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); 145 146 if (IsEqualGUID(rclsid, &CLSID_DxDiagProvider)) { 147 IClassFactory_AddRef(&DXDiag_CF.IClassFactory_iface); 148 *ppv = &DXDiag_CF.IClassFactory_iface; 149 return S_OK; 150 } 151 152 FIXME("(%s,%s,%p): no interface found.\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); 153 return CLASS_E_CLASSNOTAVAILABLE; 154 } 155 156 /*********************************************************************** 157 * DllRegisterServer (DXDIAGN.@) 158 */ 159 HRESULT WINAPI DllRegisterServer(void) 160 { 161 return __wine_register_resources( dxdiagn_instance ); 162 } 163 164 /*********************************************************************** 165 * DllUnregisterServer (DXDIAGN.@) 166 */ 167 HRESULT WINAPI DllUnregisterServer(void) 168 { 169 return __wine_unregister_resources( dxdiagn_instance ); 170 } 171