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 "config.h" 20 #include <stdarg.h> 21 22 #define COBJMACROS 23 24 #include "windef.h" 25 #include "winbase.h" 26 #include "winuser.h" 27 #include "initguid.h" 28 #include "objbase.h" 29 #include "wbemcli.h" 30 #include "wmiutils.h" 31 #include "rpcproxy.h" 32 33 #include "wine/debug.h" 34 #include "wmiutils_private.h" 35 36 WINE_DEFAULT_DEBUG_CHANNEL(wmiutils); 37 38 static HINSTANCE instance; 39 40 typedef HRESULT (*fnCreateInstance)( LPVOID *ppObj ); 41 42 typedef struct 43 { 44 IClassFactory IClassFactory_iface; 45 fnCreateInstance pfnCreateInstance; 46 } wmiutils_cf; 47 48 static inline wmiutils_cf *impl_from_IClassFactory( IClassFactory *iface ) 49 { 50 return CONTAINING_RECORD(iface, wmiutils_cf, IClassFactory_iface); 51 } 52 53 static HRESULT WINAPI wmiutils_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 wmiutils_cf_AddRef( IClassFactory *iface ) 67 { 68 return 2; 69 } 70 71 static ULONG WINAPI wmiutils_cf_Release( IClassFactory *iface ) 72 { 73 return 1; 74 } 75 76 static HRESULT WINAPI wmiutils_cf_CreateInstance( IClassFactory *iface, LPUNKNOWN pOuter, 77 REFIID riid, LPVOID *ppobj ) 78 { 79 wmiutils_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 wmiutils_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 wmiutils_cf_vtbl = 106 { 107 wmiutils_cf_QueryInterface, 108 wmiutils_cf_AddRef, 109 wmiutils_cf_Release, 110 wmiutils_cf_CreateInstance, 111 wmiutils_cf_LockServer 112 }; 113 114 static wmiutils_cf status_code_cf = { { &wmiutils_cf_vtbl }, WbemStatusCodeText_create }; 115 static wmiutils_cf path_cf = { { &wmiutils_cf_vtbl }, WbemPath_create }; 116 117 BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID lpv ) 118 { 119 switch(reason) 120 { 121 case DLL_WINE_PREATTACH: 122 return FALSE; /* prefer native version */ 123 case DLL_PROCESS_ATTACH: 124 instance = hinst; 125 DisableThreadLibraryCalls( hinst ); 126 break; 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_WbemStatusCode )) 138 { 139 cf = &status_code_cf.IClassFactory_iface; 140 } 141 else if (IsEqualGUID( rclsid, &CLSID_WbemDefPath )) 142 { 143 cf = &path_cf.IClassFactory_iface; 144 } 145 if (!cf) return CLASS_E_CLASSNOTAVAILABLE; 146 return IClassFactory_QueryInterface( cf, iid, ppv ); 147 } 148 149 /*********************************************************************** 150 * DllCanUnloadNow (WMIUTILS.@) 151 */ 152 HRESULT WINAPI DllCanUnloadNow( void ) 153 { 154 return S_FALSE; 155 } 156 157 /*********************************************************************** 158 * DllRegisterServer (WMIUTILS.@) 159 */ 160 HRESULT WINAPI DllRegisterServer(void) 161 { 162 return __wine_register_resources( instance ); 163 } 164 165 /*********************************************************************** 166 * DllUnregisterServer (WMIUTILS.@) 167 */ 168 HRESULT WINAPI DllUnregisterServer(void) 169 { 170 return __wine_unregister_resources( instance ); 171 } 172