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 #include "dxdiag_private.h" 23 24 #include <rpcproxy.h> 25 26 HINSTANCE dxdiagn_instance = 0; 27 28 LONG DXDIAGN_refCount = 0; 29 30 /* At process attach */ 31 BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved) 32 { 33 TRACE("%p,%x,%p\n", hInstDLL, fdwReason, lpvReserved); 34 if (fdwReason == DLL_PROCESS_ATTACH) { 35 dxdiagn_instance = hInstDLL; 36 DisableThreadLibraryCalls(hInstDLL); 37 } 38 return TRUE; 39 } 40 41 /******************************************************************************* 42 * DXDiag ClassFactory 43 */ 44 typedef struct { 45 IClassFactory IClassFactory_iface; 46 } IClassFactoryImpl; 47 48 static HRESULT WINAPI DXDiagCF_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv) 49 { 50 if (ppv == NULL) 51 return E_POINTER; 52 53 if (IsEqualGUID(&IID_IUnknown, riid)) 54 TRACE("(%p)->(IID_IUnknown %p)\n", iface, ppv); 55 else if (IsEqualGUID(&IID_IClassFactory, riid)) 56 TRACE("(%p)->(IID_IClassFactory %p)\n", iface, ppv); 57 else { 58 FIXME("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppv); 59 *ppv = NULL; 60 return E_NOINTERFACE; 61 } 62 63 *ppv = iface; 64 IClassFactory_AddRef(iface); 65 return S_OK; 66 } 67 68 static ULONG WINAPI DXDiagCF_AddRef(IClassFactory *iface) 69 { 70 DXDIAGN_LockModule(); 71 72 return 2; /* non-heap based object */ 73 } 74 75 static ULONG WINAPI DXDiagCF_Release(IClassFactory * iface) 76 { 77 DXDIAGN_UnlockModule(); 78 79 return 1; /* non-heap based object */ 80 } 81 82 static HRESULT WINAPI DXDiagCF_CreateInstance(IClassFactory *iface, IUnknown *pOuter, REFIID riid, 83 void **ppv) 84 { 85 TRACE("(%p)->(%p,%s,%p)\n", iface, pOuter, debugstr_guid(riid), ppv); 86 87 return DXDiag_CreateDXDiagProvider(iface, pOuter, riid, ppv); 88 } 89 90 static HRESULT WINAPI DXDiagCF_LockServer(IClassFactory *iface, BOOL dolock) 91 { 92 TRACE("(%d)\n", dolock); 93 94 if (dolock) 95 DXDIAGN_LockModule(); 96 else 97 DXDIAGN_UnlockModule(); 98 99 return S_OK; 100 } 101 102 static const IClassFactoryVtbl DXDiagCF_Vtbl = { 103 DXDiagCF_QueryInterface, 104 DXDiagCF_AddRef, 105 DXDiagCF_Release, 106 DXDiagCF_CreateInstance, 107 DXDiagCF_LockServer 108 }; 109 110 static IClassFactoryImpl DXDiag_CF = { { &DXDiagCF_Vtbl } }; 111 112 /*********************************************************************** 113 * DllCanUnloadNow (DXDIAGN.@) 114 */ 115 HRESULT WINAPI DllCanUnloadNow(void) 116 { 117 return DXDIAGN_refCount != 0 ? S_FALSE : S_OK; 118 } 119 120 /*********************************************************************** 121 * DllGetClassObject (DXDIAGN.@) 122 */ 123 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) 124 { 125 TRACE("(%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); 126 127 if (IsEqualGUID(rclsid, &CLSID_DxDiagProvider)) { 128 IClassFactory_AddRef(&DXDiag_CF.IClassFactory_iface); 129 *ppv = &DXDiag_CF.IClassFactory_iface; 130 return S_OK; 131 } 132 133 FIXME("(%s,%s,%p): no interface found.\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); 134 return CLASS_E_CLASSNOTAVAILABLE; 135 } 136 137 /*********************************************************************** 138 * DllRegisterServer (DXDIAGN.@) 139 */ 140 HRESULT WINAPI DllRegisterServer(void) 141 { 142 return __wine_register_resources( dxdiagn_instance ); 143 } 144 145 /*********************************************************************** 146 * DllUnregisterServer (DXDIAGN.@) 147 */ 148 HRESULT WINAPI DllUnregisterServer(void) 149 { 150 return __wine_unregister_resources( dxdiagn_instance ); 151 } 152