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 #include <stdio.h> 21 22 #define COBJMACROS 23 24 #include "windef.h" 25 #include "winbase.h" 26 #include "winuser.h" 27 #include "ole2.h" 28 #include "netfw.h" 29 30 #include "wine/debug.h" 31 #include "hnetcfg_private.h" 32 33 WINE_DEFAULT_DEBUG_CHANNEL(hnetcfg); 34 35 typedef struct fw_manager 36 { 37 INetFwMgr INetFwMgr_iface; 38 LONG refs; 39 } fw_manager; 40 41 static inline fw_manager *impl_from_INetFwMgr( INetFwMgr *iface ) 42 { 43 return CONTAINING_RECORD(iface, fw_manager, INetFwMgr_iface); 44 } 45 46 static ULONG WINAPI fw_manager_AddRef( 47 INetFwMgr *iface ) 48 { 49 fw_manager *fw_manager = impl_from_INetFwMgr( iface ); 50 return InterlockedIncrement( &fw_manager->refs ); 51 } 52 53 static ULONG WINAPI fw_manager_Release( 54 INetFwMgr *iface ) 55 { 56 fw_manager *fw_manager = impl_from_INetFwMgr( iface ); 57 LONG refs = InterlockedDecrement( &fw_manager->refs ); 58 if (!refs) 59 { 60 TRACE("destroying %p\n", fw_manager); 61 HeapFree( GetProcessHeap(), 0, fw_manager ); 62 } 63 return refs; 64 } 65 66 static HRESULT WINAPI fw_manager_QueryInterface( 67 INetFwMgr *iface, 68 REFIID riid, 69 void **ppvObject ) 70 { 71 fw_manager *This = impl_from_INetFwMgr( iface ); 72 73 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject ); 74 75 if ( IsEqualGUID( riid, &IID_INetFwMgr ) || 76 IsEqualGUID( riid, &IID_IDispatch ) || 77 IsEqualGUID( riid, &IID_IUnknown ) ) 78 { 79 *ppvObject = iface; 80 } 81 else 82 { 83 FIXME("interface %s not implemented\n", debugstr_guid(riid)); 84 return E_NOINTERFACE; 85 } 86 INetFwMgr_AddRef( iface ); 87 return S_OK; 88 } 89 90 static HRESULT WINAPI fw_manager_GetTypeInfoCount( 91 INetFwMgr *iface, 92 UINT *pctinfo ) 93 { 94 fw_manager *This = impl_from_INetFwMgr( iface ); 95 96 TRACE("%p %p\n", This, pctinfo); 97 *pctinfo = 1; 98 return S_OK; 99 } 100 101 static HRESULT WINAPI fw_manager_GetTypeInfo( 102 INetFwMgr *iface, 103 UINT iTInfo, 104 LCID lcid, 105 ITypeInfo **ppTInfo ) 106 { 107 fw_manager *This = impl_from_INetFwMgr( iface ); 108 109 TRACE("%p %u %u %p\n", This, iTInfo, lcid, ppTInfo); 110 return get_typeinfo( INetFwMgr_tid, ppTInfo ); 111 } 112 113 static HRESULT WINAPI fw_manager_GetIDsOfNames( 114 INetFwMgr *iface, 115 REFIID riid, 116 LPOLESTR *rgszNames, 117 UINT cNames, 118 LCID lcid, 119 DISPID *rgDispId ) 120 { 121 fw_manager *This = impl_from_INetFwMgr( iface ); 122 ITypeInfo *typeinfo; 123 HRESULT hr; 124 125 TRACE("%p %s %p %u %u %p\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId); 126 127 hr = get_typeinfo( INetFwMgr_tid, &typeinfo ); 128 if (SUCCEEDED(hr)) 129 { 130 hr = ITypeInfo_GetIDsOfNames( typeinfo, rgszNames, cNames, rgDispId ); 131 ITypeInfo_Release( typeinfo ); 132 } 133 return hr; 134 } 135 136 static HRESULT WINAPI fw_manager_Invoke( 137 INetFwMgr *iface, 138 DISPID dispIdMember, 139 REFIID riid, 140 LCID lcid, 141 WORD wFlags, 142 DISPPARAMS *pDispParams, 143 VARIANT *pVarResult, 144 EXCEPINFO *pExcepInfo, 145 UINT *puArgErr ) 146 { 147 fw_manager *This = impl_from_INetFwMgr( iface ); 148 ITypeInfo *typeinfo; 149 HRESULT hr; 150 151 TRACE("%p %d %s %d %d %p %p %p %p\n", This, dispIdMember, debugstr_guid(riid), 152 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); 153 154 hr = get_typeinfo( INetFwMgr_tid, &typeinfo ); 155 if (SUCCEEDED(hr)) 156 { 157 hr = ITypeInfo_Invoke( typeinfo, &This->INetFwMgr_iface, dispIdMember, 158 wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr ); 159 ITypeInfo_Release( typeinfo ); 160 } 161 return hr; 162 } 163 164 static HRESULT WINAPI fw_manager_get_LocalPolicy( 165 INetFwMgr *iface, 166 INetFwPolicy **localPolicy ) 167 { 168 fw_manager *This = impl_from_INetFwMgr( iface ); 169 170 TRACE("%p, %p\n", This, localPolicy); 171 return NetFwPolicy_create( NULL, (void **)localPolicy ); 172 } 173 174 static HRESULT WINAPI fw_manager_get_CurrentProfileType( 175 INetFwMgr *iface, 176 NET_FW_PROFILE_TYPE *profileType ) 177 { 178 fw_manager *This = impl_from_INetFwMgr( iface ); 179 180 FIXME("%p, %p\n", This, profileType); 181 return E_NOTIMPL; 182 } 183 184 static HRESULT WINAPI fw_manager_RestoreDefaults( 185 INetFwMgr *iface ) 186 { 187 fw_manager *This = impl_from_INetFwMgr( iface ); 188 189 FIXME("%p\n", This); 190 return E_NOTIMPL; 191 } 192 193 static HRESULT WINAPI fw_manager_IsPortAllowed( 194 INetFwMgr *iface, 195 BSTR imageFileName, 196 NET_FW_IP_VERSION ipVersion, 197 LONG portNumber, 198 BSTR localAddress, 199 NET_FW_IP_PROTOCOL ipProtocol, 200 VARIANT *allowed, 201 VARIANT *restricted ) 202 { 203 fw_manager *This = impl_from_INetFwMgr( iface ); 204 205 FIXME("%p, %s, %u, %d, %s, %u, %p, %p\n", This, debugstr_w(imageFileName), 206 ipVersion, portNumber, debugstr_w(localAddress), ipProtocol, allowed, restricted); 207 return E_NOTIMPL; 208 } 209 210 static HRESULT WINAPI fw_manager_IsIcmpTypeAllowed( 211 INetFwMgr *iface, 212 NET_FW_IP_VERSION ipVersion, 213 BSTR localAddress, 214 BYTE type, 215 VARIANT *allowed, 216 VARIANT *restricted ) 217 { 218 fw_manager *This = impl_from_INetFwMgr( iface ); 219 220 FIXME("%p, %u, %s, %u, %p, %p\n", This, ipVersion, debugstr_w(localAddress), 221 type, allowed, restricted); 222 return E_NOTIMPL; 223 } 224 225 static const struct INetFwMgrVtbl fw_manager_vtbl = 226 { 227 fw_manager_QueryInterface, 228 fw_manager_AddRef, 229 fw_manager_Release, 230 fw_manager_GetTypeInfoCount, 231 fw_manager_GetTypeInfo, 232 fw_manager_GetIDsOfNames, 233 fw_manager_Invoke, 234 fw_manager_get_LocalPolicy, 235 fw_manager_get_CurrentProfileType, 236 fw_manager_RestoreDefaults, 237 fw_manager_IsPortAllowed, 238 fw_manager_IsIcmpTypeAllowed 239 }; 240 241 HRESULT NetFwMgr_create( IUnknown *pUnkOuter, LPVOID *ppObj ) 242 { 243 fw_manager *fm; 244 245 TRACE("(%p,%p)\n", pUnkOuter, ppObj); 246 247 fm = HeapAlloc( GetProcessHeap(), 0, sizeof(*fm) ); 248 if (!fm) return E_OUTOFMEMORY; 249 250 fm->INetFwMgr_iface.lpVtbl = &fw_manager_vtbl; 251 fm->refs = 1; 252 253 *ppObj = &fm->INetFwMgr_iface; 254 255 TRACE("returning iface %p\n", *ppObj); 256 return S_OK; 257 } 258