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