1 /* 2 * WUAPI implementation 3 * 4 * Copyright 2008 Hans Leidekker 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 #define COBJMACROS 22 23 #include "config.h" 24 #include <stdarg.h> 25 26 #include "windef.h" 27 #include "winbase.h" 28 #include "winuser.h" 29 #include "ole2.h" 30 #include "rpcproxy.h" 31 #include "wuapi.h" 32 33 #include "wine/debug.h" 34 #include "wuapi_private.h" 35 36 WINE_DEFAULT_DEBUG_CHANNEL(wuapi); 37 38 typedef HRESULT (*fnCreateInstance)( LPVOID *ppObj ); 39 40 typedef struct _wucf 41 { 42 IClassFactory IClassFactory_iface; 43 fnCreateInstance pfnCreateInstance; 44 } wucf; 45 46 static inline wucf *impl_from_IClassFactory( IClassFactory *iface ) 47 { 48 return CONTAINING_RECORD(iface, wucf, IClassFactory_iface); 49 } 50 51 static HRESULT WINAPI wucf_QueryInterface( IClassFactory *iface, REFIID riid, LPVOID *ppobj ) 52 { 53 if (IsEqualGUID(riid, &IID_IUnknown) || 54 IsEqualGUID(riid, &IID_IClassFactory)) 55 { 56 IClassFactory_AddRef( iface ); 57 *ppobj = iface; 58 return S_OK; 59 } 60 FIXME("interface %s not implemented\n", debugstr_guid(riid)); 61 return E_NOINTERFACE; 62 } 63 64 static ULONG WINAPI wucf_AddRef( IClassFactory *iface ) 65 { 66 return 2; 67 } 68 69 static ULONG WINAPI wucf_Release( IClassFactory *iface ) 70 { 71 return 1; 72 } 73 74 static HRESULT WINAPI wucf_CreateInstance( IClassFactory *iface, LPUNKNOWN pOuter, 75 REFIID riid, LPVOID *ppobj ) 76 { 77 wucf *This = impl_from_IClassFactory( iface ); 78 HRESULT r; 79 IUnknown *punk; 80 81 TRACE("%p %s %p\n", pOuter, debugstr_guid(riid), ppobj); 82 83 *ppobj = NULL; 84 85 if (pOuter) 86 return CLASS_E_NOAGGREGATION; 87 88 r = This->pfnCreateInstance( (LPVOID *)&punk ); 89 if (FAILED(r)) 90 return r; 91 92 r = IUnknown_QueryInterface( punk, riid, ppobj ); 93 IUnknown_Release( punk ); 94 return r; 95 } 96 97 static HRESULT WINAPI wucf_LockServer( IClassFactory *iface, BOOL dolock ) 98 { 99 FIXME("(%p)->(%d)\n", iface, dolock); 100 return S_OK; 101 } 102 103 static const struct IClassFactoryVtbl wucf_vtbl = 104 { 105 wucf_QueryInterface, 106 wucf_AddRef, 107 wucf_Release, 108 wucf_CreateInstance, 109 wucf_LockServer 110 }; 111 112 static wucf sessioncf = { { &wucf_vtbl }, UpdateSession_create }; 113 static wucf updatescf = { { &wucf_vtbl }, AutomaticUpdates_create }; 114 static wucf sysinfocf = { { &wucf_vtbl }, SystemInformation_create }; 115 116 static HINSTANCE instance; 117 118 BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID lpv ) 119 { 120 switch(reason) 121 { 122 case DLL_WINE_PREATTACH: 123 return FALSE; /* prefer native version */ 124 case DLL_PROCESS_ATTACH: 125 instance = hinst; 126 DisableThreadLibraryCalls( hinst ); 127 break; 128 } 129 return TRUE; 130 } 131 132 HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID iid, LPVOID *ppv ) 133 { 134 IClassFactory *cf = NULL; 135 136 TRACE("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv); 137 138 if (IsEqualGUID( rclsid, &CLSID_UpdateSession )) 139 { 140 cf = &sessioncf.IClassFactory_iface; 141 } 142 else if (IsEqualGUID( rclsid, &CLSID_AutomaticUpdates )) 143 { 144 cf = &updatescf.IClassFactory_iface; 145 } 146 else if (IsEqualGUID( rclsid, &CLSID_SystemInformation )) 147 { 148 cf = &sysinfocf.IClassFactory_iface; 149 } 150 if (!cf) return CLASS_E_CLASSNOTAVAILABLE; 151 return IClassFactory_QueryInterface( cf, iid, ppv ); 152 } 153 154 HRESULT WINAPI DllCanUnloadNow( void ) 155 { 156 return S_FALSE; 157 } 158 159 /*********************************************************************** 160 * DllRegisterServer (WUAPI.@) 161 */ 162 HRESULT WINAPI DllRegisterServer(void) 163 { 164 return __wine_register_resources( instance ); 165 } 166 167 /*********************************************************************** 168 * DllUnregisterServer (WUAPI.@) 169 */ 170 HRESULT WINAPI DllUnregisterServer(void) 171 { 172 return __wine_unregister_resources( instance ); 173 } 174