1 /* 2 * Copyright (C) 2007 Jeff Latimer 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 "objbase.h" 26 #include "rpcproxy.h" 27 #include "netfw.h" 28 #include "natupnp.h" 29 30 #include "wine/debug.h" 31 #include "hnetcfg_private.h" 32 33 WINE_DEFAULT_DEBUG_CHANNEL(hnetcfg); 34 35 static HINSTANCE instance; 36 37 typedef HRESULT (*fnCreateInstance)( IUnknown *pUnkOuter, LPVOID *ppObj ); 38 39 typedef struct 40 { 41 IClassFactory IClassFactory_iface; 42 fnCreateInstance pfnCreateInstance; 43 } hnetcfg_cf; 44 45 static inline hnetcfg_cf *impl_from_IClassFactory( IClassFactory *iface ) 46 { 47 return CONTAINING_RECORD(iface, hnetcfg_cf, IClassFactory_iface); 48 } 49 50 static HRESULT WINAPI hnetcfg_cf_QueryInterface( IClassFactory *iface, REFIID riid, LPVOID *ppobj ) 51 { 52 if (IsEqualGUID(riid, &IID_IUnknown) || 53 IsEqualGUID(riid, &IID_IClassFactory)) 54 { 55 IClassFactory_AddRef( iface ); 56 *ppobj = iface; 57 return S_OK; 58 } 59 FIXME("interface %s not implemented\n", debugstr_guid(riid)); 60 return E_NOINTERFACE; 61 } 62 63 static ULONG WINAPI hnetcfg_cf_AddRef( IClassFactory *iface ) 64 { 65 return 2; 66 } 67 68 static ULONG WINAPI hnetcfg_cf_Release( IClassFactory *iface ) 69 { 70 return 1; 71 } 72 73 static HRESULT WINAPI hnetcfg_cf_CreateInstance( IClassFactory *iface, LPUNKNOWN pOuter, 74 REFIID riid, LPVOID *ppobj ) 75 { 76 hnetcfg_cf *This = impl_from_IClassFactory( iface ); 77 HRESULT r; 78 IUnknown *punk; 79 80 TRACE("%p %s %p\n", pOuter, debugstr_guid(riid), ppobj); 81 82 *ppobj = NULL; 83 84 if (pOuter) 85 return CLASS_E_NOAGGREGATION; 86 87 r = This->pfnCreateInstance( pOuter, (LPVOID *)&punk ); 88 if (FAILED(r)) 89 return r; 90 91 r = IUnknown_QueryInterface( punk, riid, ppobj ); 92 if (FAILED(r)) 93 return r; 94 95 IUnknown_Release( punk ); 96 return r; 97 } 98 99 static HRESULT WINAPI hnetcfg_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 hnetcfg_cf_vtbl = 106 { 107 hnetcfg_cf_QueryInterface, 108 hnetcfg_cf_AddRef, 109 hnetcfg_cf_Release, 110 hnetcfg_cf_CreateInstance, 111 hnetcfg_cf_LockServer 112 }; 113 114 static hnetcfg_cf fw_manager_cf = { { &hnetcfg_cf_vtbl }, NetFwMgr_create }; 115 static hnetcfg_cf fw_app_cf = { { &hnetcfg_cf_vtbl }, NetFwAuthorizedApplication_create }; 116 static hnetcfg_cf fw_openport_cf = { { &hnetcfg_cf_vtbl }, NetFwOpenPort_create }; 117 static hnetcfg_cf fw_policy2_cf = { { &hnetcfg_cf_vtbl }, NetFwPolicy2_create }; 118 static hnetcfg_cf upnpnat_cf = { { &hnetcfg_cf_vtbl }, IUPnPNAT_create }; 119 120 121 BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID reserved) 122 { 123 TRACE("(0x%p, %d, %p)\n", hInstDLL, fdwReason, reserved); 124 125 switch(fdwReason) { 126 case DLL_WINE_PREATTACH: 127 return FALSE; 128 case DLL_PROCESS_ATTACH: 129 instance = hInstDLL; 130 DisableThreadLibraryCalls(hInstDLL); 131 break; 132 case DLL_PROCESS_DETACH: 133 if (reserved) break; 134 release_typelib(); 135 break; 136 } 137 return TRUE; 138 } 139 140 HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID iid, LPVOID *ppv ) 141 { 142 IClassFactory *cf = NULL; 143 144 TRACE("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv); 145 146 if (IsEqualGUID( rclsid, &CLSID_NetFwMgr )) 147 { 148 cf = &fw_manager_cf.IClassFactory_iface; 149 } 150 else if (IsEqualGUID( rclsid, &CLSID_NetFwAuthorizedApplication )) 151 { 152 cf = &fw_app_cf.IClassFactory_iface; 153 } 154 else if (IsEqualGUID( rclsid, &CLSID_NetFwOpenPort )) 155 { 156 cf = &fw_openport_cf.IClassFactory_iface; 157 } 158 else if (IsEqualGUID( rclsid, &CLSID_NetFwPolicy2 )) 159 { 160 cf = &fw_policy2_cf.IClassFactory_iface; 161 } 162 else if (IsEqualGUID( rclsid, &CLSID_UPnPNAT )) 163 { 164 cf = &upnpnat_cf.IClassFactory_iface; 165 } 166 167 if (!cf) return CLASS_E_CLASSNOTAVAILABLE; 168 return IClassFactory_QueryInterface( cf, iid, ppv ); 169 } 170 171 HRESULT WINAPI DllCanUnloadNow( void ) 172 { 173 return S_FALSE; 174 } 175 176 /*********************************************************************** 177 * DllRegisterServer (HNETCFG.@) 178 */ 179 HRESULT WINAPI DllRegisterServer(void) 180 { 181 return __wine_register_resources( instance ); 182 } 183 184 /*********************************************************************** 185 * DllUnregisterServer (HNETCFG.@) 186 */ 187 HRESULT WINAPI DllUnregisterServer(void) 188 { 189 return __wine_unregister_resources( instance ); 190 } 191