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