1 /* 2 * 3 * Copyright 2009 Austin English 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Lesser General Public 7 * License as published by the Free Software Foundation; either 8 * version 2.1 of the License, or (at your option) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public 16 * License along with this library; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 18 */ 19 20 #include <stdarg.h> 21 22 #define COBJMACROS 23 24 #include "windef.h" 25 #include "winbase.h" 26 #include "objbase.h" 27 #include "wbemcli.h" 28 #include "wbemprov.h" 29 #include "rpcproxy.h" 30 31 #include "wbemprox_private.h" 32 #include "wine/debug.h" 33 34 WINE_DEFAULT_DEBUG_CHANNEL(wbemprox); 35 36 static HINSTANCE instance; 37 38 struct list *table_list; 39 40 typedef HRESULT (*fnCreateInstance)( LPVOID *ppObj ); 41 42 typedef struct 43 { 44 IClassFactory IClassFactory_iface; 45 fnCreateInstance pfnCreateInstance; 46 } wbemprox_cf; 47 48 static inline wbemprox_cf *impl_from_IClassFactory( IClassFactory *iface ) 49 { 50 return CONTAINING_RECORD(iface, wbemprox_cf, IClassFactory_iface); 51 } 52 53 static HRESULT WINAPI wbemprox_cf_QueryInterface( IClassFactory *iface, REFIID riid, LPVOID *ppobj ) 54 { 55 if (IsEqualGUID(riid, &IID_IUnknown) || 56 IsEqualGUID(riid, &IID_IClassFactory)) 57 { 58 IClassFactory_AddRef( iface ); 59 *ppobj = iface; 60 return S_OK; 61 } 62 FIXME("interface %s not implemented\n", debugstr_guid(riid)); 63 return E_NOINTERFACE; 64 } 65 66 static ULONG WINAPI wbemprox_cf_AddRef( IClassFactory *iface ) 67 { 68 return 2; 69 } 70 71 static ULONG WINAPI wbemprox_cf_Release( IClassFactory *iface ) 72 { 73 return 1; 74 } 75 76 static HRESULT WINAPI wbemprox_cf_CreateInstance( IClassFactory *iface, LPUNKNOWN pOuter, 77 REFIID riid, LPVOID *ppobj ) 78 { 79 wbemprox_cf *This = impl_from_IClassFactory( iface ); 80 HRESULT r; 81 IUnknown *punk; 82 83 TRACE("%p %s %p\n", pOuter, debugstr_guid(riid), ppobj); 84 85 *ppobj = NULL; 86 87 if (pOuter) 88 return CLASS_E_NOAGGREGATION; 89 90 r = This->pfnCreateInstance( (LPVOID *)&punk ); 91 if (FAILED(r)) 92 return r; 93 94 r = IUnknown_QueryInterface( punk, riid, ppobj ); 95 IUnknown_Release( punk ); 96 return r; 97 } 98 99 static HRESULT WINAPI wbemprox_cf_LockServer( IClassFactory *iface, BOOL dolock ) 100 { 101 FIXME("(%p)->(%d)\n", iface, dolock); 102 return S_OK; 103 } 104 105 static const struct IClassFactoryVtbl wbemprox_cf_vtbl = 106 { 107 wbemprox_cf_QueryInterface, 108 wbemprox_cf_AddRef, 109 wbemprox_cf_Release, 110 wbemprox_cf_CreateInstance, 111 wbemprox_cf_LockServer 112 }; 113 114 static wbemprox_cf wbem_locator_cf = { { &wbemprox_cf_vtbl }, WbemLocator_create }; 115 116 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 117 { 118 119 switch (fdwReason) 120 { 121 case DLL_PROCESS_ATTACH: 122 instance = hinstDLL; 123 DisableThreadLibraryCalls(hinstDLL); 124 init_table_list(); 125 break; 126 } 127 128 return TRUE; 129 } 130 131 HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID iid, LPVOID *ppv ) 132 { 133 IClassFactory *cf = NULL; 134 135 TRACE("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv); 136 137 if (IsEqualGUID( rclsid, &CLSID_WbemLocator ) || 138 IsEqualGUID( rclsid, &CLSID_WbemAdministrativeLocator )) 139 { 140 cf = &wbem_locator_cf.IClassFactory_iface; 141 } 142 if (!cf) return CLASS_E_CLASSNOTAVAILABLE; 143 return IClassFactory_QueryInterface( cf, iid, ppv ); 144 } 145 146 /*********************************************************************** 147 * DllCanUnloadNow (WBEMPROX.@) 148 */ 149 HRESULT WINAPI DllCanUnloadNow( void ) 150 { 151 return S_FALSE; 152 } 153 154 /*********************************************************************** 155 * DllRegisterServer (WBEMPROX.@) 156 */ 157 HRESULT WINAPI DllRegisterServer(void) 158 { 159 return __wine_register_resources( instance ); 160 } 161 162 /*********************************************************************** 163 * DllUnregisterServer (WBEMPROX.@) 164 */ 165 HRESULT WINAPI DllUnregisterServer(void) 166 { 167 return __wine_unregister_resources( instance ); 168 } 169