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