xref: /reactos/dll/win32/hnetcfg/apps.c (revision 7c98f220)
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 
impl_from_INetFwAuthorizedApplication(INetFwAuthorizedApplication * iface)47 static inline fw_app *impl_from_INetFwAuthorizedApplication( INetFwAuthorizedApplication *iface )
48 {
49     return CONTAINING_RECORD(iface, fw_app, INetFwAuthorizedApplication_iface);
50 }
51 
fw_app_AddRef(INetFwAuthorizedApplication * iface)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 
fw_app_Release(INetFwAuthorizedApplication * iface)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 
fw_app_QueryInterface(INetFwAuthorizedApplication * iface,REFIID riid,void ** ppvObject)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 
fw_app_GetTypeInfoCount(INetFwAuthorizedApplication * iface,UINT * pctinfo)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 
get_typeinfo(enum type_id tid,ITypeInfo ** ret)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 
release_typelib(void)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 
fw_app_GetTypeInfo(INetFwAuthorizedApplication * iface,UINT iTInfo,LCID lcid,ITypeInfo ** ppTInfo)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 
fw_app_GetIDsOfNames(INetFwAuthorizedApplication * iface,REFIID riid,LPOLESTR * rgszNames,UINT cNames,LCID lcid,DISPID * rgDispId)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 
fw_app_Invoke(INetFwAuthorizedApplication * iface,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS * pDispParams,VARIANT * pVarResult,EXCEPINFO * pExcepInfo,UINT * puArgErr)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 
fw_app_get_Name(INetFwAuthorizedApplication * iface,BSTR * name)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 
fw_app_put_Name(INetFwAuthorizedApplication * iface,BSTR name)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 
fw_app_get_ProcessImageFileName(INetFwAuthorizedApplication * iface,BSTR * imageFileName)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 
fw_app_put_ProcessImageFileName(INetFwAuthorizedApplication * iface,BSTR image)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 
fw_app_get_IpVersion(INetFwAuthorizedApplication * iface,NET_FW_IP_VERSION * ipVersion)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 
fw_app_put_IpVersion(INetFwAuthorizedApplication * iface,NET_FW_IP_VERSION ipVersion)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 
fw_app_get_Scope(INetFwAuthorizedApplication * iface,NET_FW_SCOPE * scope)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 
fw_app_put_Scope(INetFwAuthorizedApplication * iface,NET_FW_SCOPE scope)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 
fw_app_get_RemoteAddresses(INetFwAuthorizedApplication * iface,BSTR * remoteAddrs)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 
fw_app_put_RemoteAddresses(INetFwAuthorizedApplication * iface,BSTR remoteAddrs)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 
fw_app_get_Enabled(INetFwAuthorizedApplication * iface,VARIANT_BOOL * enabled)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 
fw_app_put_Enabled(INetFwAuthorizedApplication * iface,VARIANT_BOOL enabled)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 
NetFwAuthorizedApplication_create(IUnknown * pUnkOuter,LPVOID * ppObj)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 
impl_from_INetFwAuthorizedApplications(INetFwAuthorizedApplications * iface)456 static inline fw_apps *impl_from_INetFwAuthorizedApplications( INetFwAuthorizedApplications *iface )
457 {
458     return CONTAINING_RECORD(iface, fw_apps, INetFwAuthorizedApplications_iface);
459 }
460 
fw_apps_AddRef(INetFwAuthorizedApplications * iface)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 
fw_apps_Release(INetFwAuthorizedApplications * iface)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 
fw_apps_QueryInterface(INetFwAuthorizedApplications * iface,REFIID riid,void ** ppvObject)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 
fw_apps_GetTypeInfoCount(INetFwAuthorizedApplications * iface,UINT * pctinfo)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 
fw_apps_GetTypeInfo(INetFwAuthorizedApplications * iface,UINT iTInfo,LCID lcid,ITypeInfo ** ppTInfo)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 
fw_apps_GetIDsOfNames(INetFwAuthorizedApplications * iface,REFIID riid,LPOLESTR * rgszNames,UINT cNames,LCID lcid,DISPID * rgDispId)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 
fw_apps_Invoke(INetFwAuthorizedApplications * iface,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS * pDispParams,VARIANT * pVarResult,EXCEPINFO * pExcepInfo,UINT * puArgErr)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 
fw_apps_get_Count(INetFwAuthorizedApplications * iface,LONG * count)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 
fw_apps_Add(INetFwAuthorizedApplications * iface,INetFwAuthorizedApplication * app)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 
fw_apps_Remove(INetFwAuthorizedApplications * iface,BSTR imageFileName)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 
fw_apps_Item(INetFwAuthorizedApplications * iface,BSTR imageFileName,INetFwAuthorizedApplication ** app)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 
fw_apps_get__NewEnum(INetFwAuthorizedApplications * iface,IUnknown ** newEnum)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 
NetFwAuthorizedApplications_create(IUnknown * pUnkOuter,LPVOID * ppObj)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