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 #include <stdio.h> 22 23 #define COBJMACROS 24 25 #include "windef.h" 26 #include "winbase.h" 27 #include "winuser.h" 28 #include "ole2.h" 29 #include "netfw.h" 30 31 #include "wine/debug.h" 32 #include "wine/unicode.h" 33 #include "hnetcfg_private.h" 34 35 WINE_DEFAULT_DEBUG_CHANNEL(hnetcfg); 36 37 typedef struct fw_app 38 { 39 INetFwAuthorizedApplication INetFwAuthorizedApplication_iface; 40 LONG refs; 41 BSTR filename; 42 } fw_app; 43 44 static inline fw_app *impl_from_INetFwAuthorizedApplication( INetFwAuthorizedApplication *iface ) 45 { 46 return CONTAINING_RECORD(iface, fw_app, INetFwAuthorizedApplication_iface); 47 } 48 49 static ULONG WINAPI fw_app_AddRef( 50 INetFwAuthorizedApplication *iface ) 51 { 52 fw_app *fw_app = impl_from_INetFwAuthorizedApplication( iface ); 53 return InterlockedIncrement( &fw_app->refs ); 54 } 55 56 static ULONG WINAPI fw_app_Release( 57 INetFwAuthorizedApplication *iface ) 58 { 59 fw_app *fw_app = impl_from_INetFwAuthorizedApplication( iface ); 60 LONG refs = InterlockedDecrement( &fw_app->refs ); 61 if (!refs) 62 { 63 TRACE("destroying %p\n", fw_app); 64 SysFreeString( fw_app->filename ); 65 HeapFree( GetProcessHeap(), 0, fw_app ); 66 } 67 return refs; 68 } 69 70 static HRESULT WINAPI fw_app_QueryInterface( 71 INetFwAuthorizedApplication *iface, 72 REFIID riid, 73 void **ppvObject ) 74 { 75 fw_app *This = impl_from_INetFwAuthorizedApplication( iface ); 76 77 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject ); 78 79 if ( IsEqualGUID( riid, &IID_INetFwAuthorizedApplication ) || 80 IsEqualGUID( riid, &IID_IDispatch ) || 81 IsEqualGUID( riid, &IID_IUnknown ) ) 82 { 83 *ppvObject = iface; 84 } 85 else 86 { 87 FIXME("interface %s not implemented\n", debugstr_guid(riid)); 88 return E_NOINTERFACE; 89 } 90 INetFwAuthorizedApplication_AddRef( iface ); 91 return S_OK; 92 } 93 94 static HRESULT WINAPI fw_app_GetTypeInfoCount( 95 INetFwAuthorizedApplication *iface, 96 UINT *pctinfo ) 97 { 98 fw_app *This = impl_from_INetFwAuthorizedApplication( iface ); 99 100 TRACE("%p %p\n", This, pctinfo); 101 *pctinfo = 1; 102 return S_OK; 103 } 104 105 static ITypeLib *typelib; 106 static ITypeInfo *typeinfo[last_tid]; 107 108 static REFIID tid_id[] = 109 { 110 &IID_INetFwAuthorizedApplication, 111 &IID_INetFwAuthorizedApplications, 112 &IID_INetFwMgr, 113 &IID_INetFwOpenPort, 114 &IID_INetFwOpenPorts, 115 &IID_INetFwPolicy, 116 &IID_INetFwPolicy2, 117 &IID_INetFwProfile 118 }; 119 120 HRESULT get_typeinfo( enum type_id tid, ITypeInfo **ret ) 121 { 122 HRESULT hr; 123 124 if (!typelib) 125 { 126 ITypeLib *lib; 127 128 hr = LoadRegTypeLib( &LIBID_NetFwPublicTypeLib, 1, 0, LOCALE_SYSTEM_DEFAULT, &lib ); 129 if (FAILED(hr)) 130 { 131 ERR("LoadRegTypeLib failed: %08x\n", hr); 132 return hr; 133 } 134 if (InterlockedCompareExchangePointer( (void **)&typelib, lib, NULL )) 135 ITypeLib_Release( lib ); 136 } 137 if (!typeinfo[tid]) 138 { 139 ITypeInfo *info; 140 141 hr = ITypeLib_GetTypeInfoOfGuid( typelib, tid_id[tid], &info ); 142 if (FAILED(hr)) 143 { 144 ERR("GetTypeInfoOfGuid(%s) failed: %08x\n", debugstr_guid(tid_id[tid]), hr); 145 return hr; 146 } 147 if (InterlockedCompareExchangePointer( (void **)(typeinfo + tid), info, NULL )) 148 ITypeInfo_Release( info ); 149 } 150 *ret = typeinfo[tid]; 151 ITypeInfo_AddRef(typeinfo[tid]); 152 return S_OK; 153 } 154 155 void release_typelib(void) 156 { 157 unsigned i; 158 159 for (i = 0; i < sizeof(typeinfo)/sizeof(*typeinfo); i++) 160 if (typeinfo[i]) 161 ITypeInfo_Release(typeinfo[i]); 162 163 if (typelib) 164 ITypeLib_Release(typelib); 165 } 166 167 static HRESULT WINAPI fw_app_GetTypeInfo( 168 INetFwAuthorizedApplication *iface, 169 UINT iTInfo, 170 LCID lcid, 171 ITypeInfo **ppTInfo ) 172 { 173 fw_app *This = impl_from_INetFwAuthorizedApplication( iface ); 174 175 TRACE("%p %u %u %p\n", This, iTInfo, lcid, ppTInfo); 176 return get_typeinfo( INetFwAuthorizedApplication_tid, ppTInfo ); 177 } 178 179 static HRESULT WINAPI fw_app_GetIDsOfNames( 180 INetFwAuthorizedApplication *iface, 181 REFIID riid, 182 LPOLESTR *rgszNames, 183 UINT cNames, 184 LCID lcid, 185 DISPID *rgDispId ) 186 { 187 fw_app *This = impl_from_INetFwAuthorizedApplication( iface ); 188 ITypeInfo *typeinfo; 189 HRESULT hr; 190 191 TRACE("%p %s %p %u %u %p\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId); 192 193 hr = get_typeinfo( INetFwAuthorizedApplication_tid, &typeinfo ); 194 if (SUCCEEDED(hr)) 195 { 196 hr = ITypeInfo_GetIDsOfNames( typeinfo, rgszNames, cNames, rgDispId ); 197 ITypeInfo_Release( typeinfo ); 198 } 199 return hr; 200 } 201 202 static HRESULT WINAPI fw_app_Invoke( 203 INetFwAuthorizedApplication *iface, 204 DISPID dispIdMember, 205 REFIID riid, 206 LCID lcid, 207 WORD wFlags, 208 DISPPARAMS *pDispParams, 209 VARIANT *pVarResult, 210 EXCEPINFO *pExcepInfo, 211 UINT *puArgErr ) 212 { 213 fw_app *This = impl_from_INetFwAuthorizedApplication( iface ); 214 ITypeInfo *typeinfo; 215 HRESULT hr; 216 217 TRACE("%p %d %s %d %d %p %p %p %p\n", This, dispIdMember, debugstr_guid(riid), 218 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); 219 220 hr = get_typeinfo( INetFwAuthorizedApplication_tid, &typeinfo ); 221 if (SUCCEEDED(hr)) 222 { 223 hr = ITypeInfo_Invoke( typeinfo, &This->INetFwAuthorizedApplication_iface, dispIdMember, 224 wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr ); 225 ITypeInfo_Release( typeinfo ); 226 } 227 return hr; 228 } 229 230 static HRESULT WINAPI fw_app_get_Name( 231 INetFwAuthorizedApplication *iface, 232 BSTR *name ) 233 { 234 fw_app *This = impl_from_INetFwAuthorizedApplication( iface ); 235 236 FIXME("%p, %p\n", This, name); 237 return E_NOTIMPL; 238 } 239 240 static HRESULT WINAPI fw_app_put_Name( 241 INetFwAuthorizedApplication *iface, 242 BSTR name ) 243 { 244 fw_app *This = impl_from_INetFwAuthorizedApplication( iface ); 245 246 FIXME("%p, %s\n", This, debugstr_w(name)); 247 return S_OK; 248 } 249 250 static HRESULT WINAPI fw_app_get_ProcessImageFileName( 251 INetFwAuthorizedApplication *iface, 252 BSTR *imageFileName ) 253 { 254 fw_app *This = impl_from_INetFwAuthorizedApplication( iface ); 255 256 FIXME("%p, %p\n", This, imageFileName); 257 258 if (!imageFileName) 259 return E_POINTER; 260 261 *imageFileName = SysAllocString( This->filename ); 262 return *imageFileName || !This->filename ? S_OK : E_OUTOFMEMORY; 263 } 264 265 static HRESULT WINAPI fw_app_put_ProcessImageFileName( 266 INetFwAuthorizedApplication *iface, 267 BSTR imageFileName ) 268 { 269 fw_app *This = impl_from_INetFwAuthorizedApplication( iface ); 270 271 FIXME("%p, %s\n", This, debugstr_w(imageFileName)); 272 273 if (!imageFileName || !imageFileName[0]) 274 return E_INVALIDARG; 275 276 SysFreeString( This->filename ); 277 This->filename = SysAllocString( imageFileName ); 278 return This->filename ? S_OK : E_OUTOFMEMORY; 279 } 280 281 static HRESULT WINAPI fw_app_get_IpVersion( 282 INetFwAuthorizedApplication *iface, 283 NET_FW_IP_VERSION *ipVersion ) 284 { 285 fw_app *This = impl_from_INetFwAuthorizedApplication( iface ); 286 287 TRACE("%p, %p\n", This, ipVersion); 288 289 if (!ipVersion) 290 return E_POINTER; 291 *ipVersion = NET_FW_IP_VERSION_ANY; 292 return S_OK; 293 } 294 295 static HRESULT WINAPI fw_app_put_IpVersion( 296 INetFwAuthorizedApplication *iface, 297 NET_FW_IP_VERSION ipVersion ) 298 { 299 fw_app *This = impl_from_INetFwAuthorizedApplication( iface ); 300 301 TRACE("%p, %u\n", This, ipVersion); 302 return S_OK; 303 } 304 305 static HRESULT WINAPI fw_app_get_Scope( 306 INetFwAuthorizedApplication *iface, 307 NET_FW_SCOPE *scope ) 308 { 309 fw_app *This = impl_from_INetFwAuthorizedApplication( iface ); 310 311 FIXME("%p, %p\n", This, scope); 312 return E_NOTIMPL; 313 } 314 315 static HRESULT WINAPI fw_app_put_Scope( 316 INetFwAuthorizedApplication *iface, 317 NET_FW_SCOPE scope ) 318 { 319 fw_app *This = impl_from_INetFwAuthorizedApplication( iface ); 320 321 FIXME("%p, %u\n", This, scope); 322 return S_OK; 323 } 324 325 static HRESULT WINAPI fw_app_get_RemoteAddresses( 326 INetFwAuthorizedApplication *iface, 327 BSTR *remoteAddrs ) 328 { 329 fw_app *This = impl_from_INetFwAuthorizedApplication( iface ); 330 331 FIXME("%p, %p\n", This, remoteAddrs); 332 return E_NOTIMPL; 333 } 334 335 static HRESULT WINAPI fw_app_put_RemoteAddresses( 336 INetFwAuthorizedApplication *iface, 337 BSTR remoteAddrs ) 338 { 339 fw_app *This = impl_from_INetFwAuthorizedApplication( iface ); 340 341 FIXME("%p, %s\n", This, debugstr_w(remoteAddrs)); 342 return E_NOTIMPL; 343 } 344 345 static HRESULT WINAPI fw_app_get_Enabled( 346 INetFwAuthorizedApplication *iface, 347 VARIANT_BOOL *enabled ) 348 { 349 fw_app *This = impl_from_INetFwAuthorizedApplication( iface ); 350 351 FIXME("%p, %p\n", This, enabled); 352 353 *enabled = VARIANT_FALSE; 354 return S_OK; 355 } 356 357 static HRESULT WINAPI fw_app_put_Enabled( 358 INetFwAuthorizedApplication *iface, 359 VARIANT_BOOL enabled ) 360 { 361 fw_app *This = impl_from_INetFwAuthorizedApplication( iface ); 362 363 FIXME("%p, %d\n", This, enabled); 364 return S_OK; 365 } 366 367 static const struct INetFwAuthorizedApplicationVtbl fw_app_vtbl = 368 { 369 fw_app_QueryInterface, 370 fw_app_AddRef, 371 fw_app_Release, 372 fw_app_GetTypeInfoCount, 373 fw_app_GetTypeInfo, 374 fw_app_GetIDsOfNames, 375 fw_app_Invoke, 376 fw_app_get_Name, 377 fw_app_put_Name, 378 fw_app_get_ProcessImageFileName, 379 fw_app_put_ProcessImageFileName, 380 fw_app_get_IpVersion, 381 fw_app_put_IpVersion, 382 fw_app_get_Scope, 383 fw_app_put_Scope, 384 fw_app_get_RemoteAddresses, 385 fw_app_put_RemoteAddresses, 386 fw_app_get_Enabled, 387 fw_app_put_Enabled 388 }; 389 390 HRESULT NetFwAuthorizedApplication_create( IUnknown *pUnkOuter, LPVOID *ppObj ) 391 { 392 fw_app *fa; 393 394 TRACE("(%p,%p)\n", pUnkOuter, ppObj); 395 396 fa = HeapAlloc( GetProcessHeap(), 0, sizeof(*fa) ); 397 if (!fa) return E_OUTOFMEMORY; 398 399 fa->INetFwAuthorizedApplication_iface.lpVtbl = &fw_app_vtbl; 400 fa->refs = 1; 401 fa->filename = NULL; 402 403 *ppObj = &fa->INetFwAuthorizedApplication_iface; 404 405 TRACE("returning iface %p\n", *ppObj); 406 return S_OK; 407 } 408 typedef struct fw_apps 409 { 410 INetFwAuthorizedApplications INetFwAuthorizedApplications_iface; 411 LONG refs; 412 } fw_apps; 413 414 static inline fw_apps *impl_from_INetFwAuthorizedApplications( INetFwAuthorizedApplications *iface ) 415 { 416 return CONTAINING_RECORD(iface, fw_apps, INetFwAuthorizedApplications_iface); 417 } 418 419 static ULONG WINAPI fw_apps_AddRef( 420 INetFwAuthorizedApplications *iface ) 421 { 422 fw_apps *fw_apps = impl_from_INetFwAuthorizedApplications( iface ); 423 return InterlockedIncrement( &fw_apps->refs ); 424 } 425 426 static ULONG WINAPI fw_apps_Release( 427 INetFwAuthorizedApplications *iface ) 428 { 429 fw_apps *fw_apps = impl_from_INetFwAuthorizedApplications( iface ); 430 LONG refs = InterlockedDecrement( &fw_apps->refs ); 431 if (!refs) 432 { 433 TRACE("destroying %p\n", fw_apps); 434 HeapFree( GetProcessHeap(), 0, fw_apps ); 435 } 436 return refs; 437 } 438 439 static HRESULT WINAPI fw_apps_QueryInterface( 440 INetFwAuthorizedApplications *iface, 441 REFIID riid, 442 void **ppvObject ) 443 { 444 fw_apps *This = impl_from_INetFwAuthorizedApplications( iface ); 445 446 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject ); 447 448 if ( IsEqualGUID( riid, &IID_INetFwAuthorizedApplications ) || 449 IsEqualGUID( riid, &IID_IDispatch ) || 450 IsEqualGUID( riid, &IID_IUnknown ) ) 451 { 452 *ppvObject = iface; 453 } 454 else 455 { 456 FIXME("interface %s not implemented\n", debugstr_guid(riid)); 457 return E_NOINTERFACE; 458 } 459 INetFwAuthorizedApplications_AddRef( iface ); 460 return S_OK; 461 } 462 463 static HRESULT WINAPI fw_apps_GetTypeInfoCount( 464 INetFwAuthorizedApplications *iface, 465 UINT *pctinfo ) 466 { 467 fw_apps *This = impl_from_INetFwAuthorizedApplications( iface ); 468 469 FIXME("%p %p\n", This, pctinfo); 470 return E_NOTIMPL; 471 } 472 473 static HRESULT WINAPI fw_apps_GetTypeInfo( 474 INetFwAuthorizedApplications *iface, 475 UINT iTInfo, 476 LCID lcid, 477 ITypeInfo **ppTInfo ) 478 { 479 fw_apps *This = impl_from_INetFwAuthorizedApplications( iface ); 480 481 TRACE("%p %u %u %p\n", This, iTInfo, lcid, ppTInfo); 482 return get_typeinfo( INetFwAuthorizedApplications_tid, ppTInfo ); 483 } 484 485 static HRESULT WINAPI fw_apps_GetIDsOfNames( 486 INetFwAuthorizedApplications *iface, 487 REFIID riid, 488 LPOLESTR *rgszNames, 489 UINT cNames, 490 LCID lcid, 491 DISPID *rgDispId ) 492 { 493 fw_apps *This = impl_from_INetFwAuthorizedApplications( iface ); 494 ITypeInfo *typeinfo; 495 HRESULT hr; 496 497 TRACE("%p %s %p %u %u %p\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId); 498 499 hr = get_typeinfo( INetFwAuthorizedApplications_tid, &typeinfo ); 500 if (SUCCEEDED(hr)) 501 { 502 hr = ITypeInfo_GetIDsOfNames( typeinfo, rgszNames, cNames, rgDispId ); 503 ITypeInfo_Release( typeinfo ); 504 } 505 return hr; 506 } 507 508 static HRESULT WINAPI fw_apps_Invoke( 509 INetFwAuthorizedApplications *iface, 510 DISPID dispIdMember, 511 REFIID riid, 512 LCID lcid, 513 WORD wFlags, 514 DISPPARAMS *pDispParams, 515 VARIANT *pVarResult, 516 EXCEPINFO *pExcepInfo, 517 UINT *puArgErr ) 518 { 519 fw_apps *This = impl_from_INetFwAuthorizedApplications( iface ); 520 ITypeInfo *typeinfo; 521 HRESULT hr; 522 523 TRACE("%p %d %s %d %d %p %p %p %p\n", This, dispIdMember, debugstr_guid(riid), 524 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); 525 526 hr = get_typeinfo( INetFwAuthorizedApplications_tid, &typeinfo ); 527 if (SUCCEEDED(hr)) 528 { 529 hr = ITypeInfo_Invoke( typeinfo, &This->INetFwAuthorizedApplications_iface, dispIdMember, 530 wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr ); 531 ITypeInfo_Release( typeinfo ); 532 } 533 return hr; 534 } 535 536 static HRESULT WINAPI fw_apps_get_Count( 537 INetFwAuthorizedApplications *iface, 538 LONG *count ) 539 { 540 fw_apps *This = impl_from_INetFwAuthorizedApplications( iface ); 541 542 FIXME("%p, %p\n", This, count); 543 return E_NOTIMPL; 544 } 545 546 static HRESULT WINAPI fw_apps_Add( 547 INetFwAuthorizedApplications *iface, 548 INetFwAuthorizedApplication *app ) 549 { 550 fw_apps *This = impl_from_INetFwAuthorizedApplications( iface ); 551 552 FIXME("%p, %p\n", This, app); 553 return S_OK; 554 } 555 556 static HRESULT WINAPI fw_apps_Remove( 557 INetFwAuthorizedApplications *iface, 558 BSTR imageFileName ) 559 { 560 fw_apps *This = impl_from_INetFwAuthorizedApplications( iface ); 561 562 FIXME("%p, %s\n", This, debugstr_w(imageFileName)); 563 return S_OK; 564 } 565 566 static HRESULT WINAPI fw_apps_Item( 567 INetFwAuthorizedApplications *iface, 568 BSTR imageFileName, 569 INetFwAuthorizedApplication **app ) 570 { 571 fw_apps *This = impl_from_INetFwAuthorizedApplications( iface ); 572 573 TRACE("%p, %s, %p\n", This, debugstr_w(imageFileName), app); 574 return NetFwAuthorizedApplication_create( NULL, (void **)app ); 575 } 576 577 static HRESULT WINAPI fw_apps_get__NewEnum( 578 INetFwAuthorizedApplications *iface, 579 IUnknown **newEnum ) 580 { 581 fw_apps *This = impl_from_INetFwAuthorizedApplications( iface ); 582 583 FIXME("%p, %p\n", This, newEnum); 584 return E_NOTIMPL; 585 } 586 587 static const struct INetFwAuthorizedApplicationsVtbl fw_apps_vtbl = 588 { 589 fw_apps_QueryInterface, 590 fw_apps_AddRef, 591 fw_apps_Release, 592 fw_apps_GetTypeInfoCount, 593 fw_apps_GetTypeInfo, 594 fw_apps_GetIDsOfNames, 595 fw_apps_Invoke, 596 fw_apps_get_Count, 597 fw_apps_Add, 598 fw_apps_Remove, 599 fw_apps_Item, 600 fw_apps_get__NewEnum 601 }; 602 603 HRESULT NetFwAuthorizedApplications_create( IUnknown *pUnkOuter, LPVOID *ppObj ) 604 { 605 fw_apps *fa; 606 607 TRACE("(%p,%p)\n", pUnkOuter, ppObj); 608 609 fa = HeapAlloc( GetProcessHeap(), 0, sizeof(*fa) ); 610 if (!fa) return E_OUTOFMEMORY; 611 612 fa->INetFwAuthorizedApplications_iface.lpVtbl = &fw_apps_vtbl; 613 fa->refs = 1; 614 615 *ppObj = &fa->INetFwAuthorizedApplications_iface; 616 617 TRACE("returning iface %p\n", *ppObj); 618 return S_OK; 619 } 620