urlmon: IInternetSecurityManager
Huw D M Davies
h.davies1 at physics.ox.ac.uk
Tue Sep 28 06:37:28 CDT 2004
On Mon, Sep 27, 2004 at 06:54:41PM +0100, Robert Shearman wrote:
> Please try to use Interlocked* functions for ref-counting as it is
> currently a janitorial task to clean up this type of code and I don't
> think they are desparate for more work.
...
> You leak a reference on failure here.
Good catch. This classfactory code is fairly pervasive in Wine. I'll
submit a patch fixing all other occurrences of this in a moment.
> It is probably better to put this outside the interface declaration as
> I'm not sure if midl and widl are consistent about not outputting this
> twice.
Hmm, it seems to work fine with widl and midl for me. However I've
moved the define outside the interface.
> The convention with COM interfaces is to use the CoTaskMemAlloc /
> CoTaskMemFree memory management functions instead of the Heap ones (even
> though they are the same). This is just a slight nit-pick.
I'm afraid you're not going to convince me that using a function with
the antiquated word 'Task' in its name is a good idea <g>
Cheers,
Huw.
Huw Davies <huw at codeweavers.com>
Stub implementation of IInternetSecurityManager
Add a classfactory
Fix calling convention of CoInternetCreateSecurityManager
--
Huw Davies
huw at codeweavers.com
Index: dlls/urlmon/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/urlmon/Makefile.in,v
retrieving revision 1.21
diff -u -r1.21 Makefile.in
--- dlls/urlmon/Makefile.in 3 May 2004 20:07:03 -0000 1.21
+++ dlls/urlmon/Makefile.in 28 Sep 2004 11:23:47 -0000
@@ -8,6 +8,7 @@
C_SRCS = \
regsvr.c \
+ sec_mgr.c \
umon.c \
urlmon_main.c
Index: dlls/urlmon/umon.c
===================================================================
RCS file: /home/wine/wine/dlls/urlmon/umon.c,v
retrieving revision 1.42
diff -u -r1.42 umon.c
--- dlls/urlmon/umon.c 24 Sep 2004 01:16:53 -0000 1.42
+++ dlls/urlmon/umon.c 28 Sep 2004 11:23:47 -0000
@@ -1061,18 +1061,6 @@
return S_OK;
}
-/***********************************************************************
- * CoInternetCreateSecurityManager (URLMON.@)
- *
- */
-typedef void *IInternetSecurityManager;
-HRESULT CoInternetCreateSecurityManager( IServiceProvider *pSP,
- IInternetSecurityManager **ppSM, DWORD dwReserved )
-{
- FIXME("%p %ld\n", pSP, dwReserved );
- return E_NOTIMPL;
-}
-
static BOOL URLMON_IsBinary(LPVOID pBuffer, DWORD cbSize)
{
unsigned int i, binarycount = 0;
Index: dlls/urlmon/urlmon_main.c
===================================================================
RCS file: /home/wine/wine/dlls/urlmon/urlmon_main.c,v
retrieving revision 1.17
diff -u -r1.17 urlmon_main.c
--- dlls/urlmon/urlmon_main.c 9 Sep 2004 19:17:57 -0000 1.17
+++ dlls/urlmon/urlmon_main.c 28 Sep 2004 11:23:47 -0000
@@ -29,6 +29,8 @@
#include "wine/debug.h"
+#include "winuser.h"
+#include "urlmon.h"
#include "urlmon_main.h"
WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
@@ -77,17 +79,151 @@
return S_FALSE;
}
-/***********************************************************************
- * DllGetClassObject (URLMON.@)
+
+
+/******************************************************************************
+ * Urlmon ClassFactory
*/
-HRESULT WINAPI URLMON_DllGetClassObject(REFCLSID rclsid, REFIID riid,
- LPVOID *ppv)
+typedef struct {
+ IClassFactory ITF_IClassFactory;
+
+ DWORD ref;
+ HRESULT (*pfnCreateInstance)(IUnknown *pUnkOuter, LPVOID *ppObj);
+} IClassFactoryImpl;
+
+struct object_creation_info
+{
+ const CLSID *clsid;
+ HRESULT (*pfnCreateInstance)(IUnknown *pUnkOuter, LPVOID *ppObj);
+};
+
+static const struct object_creation_info object_creation[] =
{
- FIXME("(%p, %p, %p): stub\n", debugstr_guid(rclsid),
- debugstr_guid(riid), ppv);
+ { &CLSID_InternetSecurityManager, &SecManagerImpl_Construct }
+};
- return CLASS_E_CLASSNOTAVAILABLE;
+static HRESULT WINAPI
+CF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
+{
+ IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
+
+ if (IsEqualGUID(riid, &IID_IUnknown)
+ || IsEqualGUID(riid, &IID_IClassFactory))
+ {
+ IClassFactory_AddRef(iface);
+ *ppobj = This;
+ return S_OK;
+ }
+
+ WARN("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppobj);
+ return E_NOINTERFACE;
}
+
+static ULONG WINAPI CF_AddRef(LPCLASSFACTORY iface)
+{
+ IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
+ return InterlockedIncrement(&This->ref);
+}
+
+static ULONG WINAPI CF_Release(LPCLASSFACTORY iface)
+{
+ IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
+
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ if (ref == 0)
+ HeapFree(GetProcessHeap(), 0, This);
+
+ return ref;
+}
+
+
+static HRESULT WINAPI CF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter,
+ REFIID riid, LPVOID *ppobj)
+{
+ IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
+ HRESULT hres;
+ LPUNKNOWN punk;
+
+ TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
+
+ *ppobj = NULL;
+ if(SUCCEEDED(hres = This->pfnCreateInstance(pOuter, (LPVOID *) &punk))) {
+ hres = IUnknown_QueryInterface(punk, riid, ppobj);
+ IUnknown_Release(punk);
+ }
+ return hres;
+}
+
+static HRESULT WINAPI CF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
+{
+ IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
+ FIXME("(%p)->(%d),stub!\n",This,dolock);
+ return S_OK;
+}
+
+static IClassFactoryVtbl CF_Vtbl =
+{
+ CF_QueryInterface,
+ CF_AddRef,
+ CF_Release,
+ CF_CreateInstance,
+ CF_LockServer
+};
+
+/*******************************************************************************
+ * DllGetClassObject [URLMON.@]
+ * Retrieves class object from a DLL object
+ *
+ * NOTES
+ * Docs say returns STDAPI
+ *
+ * PARAMS
+ * rclsid [I] CLSID for the class object
+ * riid [I] Reference to identifier of interface for class object
+ * ppv [O] Address of variable to receive interface pointer for riid
+ *
+ * RETURNS
+ * Success: S_OK
+ * Failure: CLASS_E_CLASSNOTAVAILABLE, E_OUTOFMEMORY, E_INVALIDARG,
+ * E_UNEXPECTED
+ */
+
+DWORD WINAPI URLMON_DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
+{
+ int i;
+ IClassFactoryImpl *factory;
+
+ TRACE("(%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
+
+ if ( !IsEqualGUID( &IID_IClassFactory, riid )
+ && ! IsEqualGUID( &IID_IUnknown, riid) )
+ return E_NOINTERFACE;
+
+ for (i=0; i < sizeof(object_creation)/sizeof(object_creation[0]); i++)
+ {
+ if (IsEqualGUID(object_creation[i].clsid, rclsid))
+ break;
+ }
+
+ if (i == sizeof(object_creation)/sizeof(object_creation[0]))
+ {
+ FIXME("%s: no class found.\n", debugstr_guid(rclsid));
+ return CLASS_E_CLASSNOTAVAILABLE;
+ }
+
+ factory = HeapAlloc(GetProcessHeap(), 0, sizeof(*factory));
+ if (factory == NULL) return E_OUTOFMEMORY;
+
+ factory->ITF_IClassFactory.lpVtbl = &CF_Vtbl;
+ factory->ref = 1;
+
+ factory->pfnCreateInstance = object_creation[i].pfnCreateInstance;
+
+ *ppv = &(factory->ITF_IClassFactory);
+ return S_OK;
+}
+
/***********************************************************************
* DllRegisterServerEx (URLMON.@)
Index: dlls/urlmon/urlmon_main.h
===================================================================
RCS file: /home/wine/wine/dlls/urlmon/urlmon_main.h,v
retrieving revision 1.4
diff -u -r1.4 urlmon_main.h
--- dlls/urlmon/urlmon_main.h 13 Aug 2004 00:44:22 -0000 1.4
+++ dlls/urlmon/urlmon_main.h 28 Sep 2004 11:23:47 -0000
@@ -25,6 +25,8 @@
#include "winbase.h"
extern HINSTANCE URLMON_hInstance;
+extern HRESULT SecManagerImpl_Construct(IUnknown *pUnkOuter, LPVOID *ppobj);
+
#define ICOM_THIS_MULTI(impl,field,iface) impl* const This=(impl*)((char*)(iface) - offsetof(impl,field))
Index: include/urlmon.idl
===================================================================
RCS file: /home/wine/wine/include/urlmon.idl,v
retrieving revision 1.9
diff -u -r1.9 urlmon.idl
--- include/urlmon.idl 17 May 2004 20:51:02 -0000 1.9
+++ include/urlmon.idl 28 Sep 2004 11:23:52 -0000
@@ -563,6 +563,102 @@
[in] DWORD dwReserved);
}
+/*****************************************************************************
+ * IInternetSecurityMgrSite interface
+ */
+[
+ local,
+ object,
+ uuid(79eac9ed-baf9-11ce-8c82-00aa004ba90b),
+ pointer_default(unique)
+]
+interface IInternetSecurityMgrSite : IUnknown
+{
+ HRESULT GetWindow(
+ [out] HWND *phwnd);
+
+ HRESULT EnableModeless(
+ [in] BOOL fEnable);
+};
+
+
+/*****************************************************************************
+ * IInternetSecurityManager interface
+ */
+cpp_quote("#define SID_SInternetSecurityManager IID_IInternetSecurityManager")
+cpp_quote("#define MAX_SIZE_SECURITY_ID 512")
+
+
+[
+ object,
+ uuid(79eac9ee-baf9-11ce-8c82-00aa004ba90b),
+ pointer_default(unique)
+]
+interface IInternetSecurityManager : IUnknown
+{
+ HRESULT SetSecuritySite(
+ [in, unique] IInternetSecurityMgrSite *pSite);
+
+ HRESULT GetSecuritySite(
+ [out] IInternetSecurityMgrSite **ppSite);
+
+ HRESULT MapUrlToZone(
+ [in] LPCWSTR pwszUrl,
+ [out] DWORD *pdwZone,
+ [in] DWORD dwFlags);
+
+ HRESULT GetSecurityId(
+ [in] LPCWSTR pwszUrl,
+ [out, size_is(*pcbSecurityId)] BYTE *pbSecurityId,
+ [in, out] DWORD *pcbSecurityId,
+ [in] DWORD dwReserved);
+
+
+ typedef enum {
+ PUAF_DEFAULT = 0x00,
+ PUAF_NOUI = 0x01,
+ PUAF_ISFILE = 0x02,
+ PUAF_WARN_IF_DENIED = 0x04,
+ PUAF_FORCEUI_FOREGROUND = 0x08,
+ PUAF_CHECK_TIPS = 0x10
+ } PUAF;
+
+ HRESULT ProcessUrlAction(
+ [in] LPCWSTR pwszUrl,
+ [in] DWORD dwAction,
+ [out, size_is(cbPolicy)] BYTE *pPolicy,
+ [in] DWORD cbPolicy,
+ [in] BYTE *pContext,
+ [in] DWORD cbContext,
+ [in] DWORD dwFlags,
+ [in] DWORD dwReserved);
+
+ HRESULT QueryCustomPolicy(
+ [in] LPCWSTR pwszUrl,
+ [in] REFGUID guidKey,
+ [out, size_is(*pcbPolicy)] BYTE **ppPolicy,
+ [out] DWORD *pcbPolicy,
+ [in] BYTE *pContext,
+ [in] DWORD cbContext,
+ [in] DWORD dwReserved);
+
+ typedef enum {
+ SZM_CREATE = 0x0,
+ SZM_DELETE = 0x1
+ } SZM_FLAGS;
+
+ HRESULT SetZoneMapping(
+ [in] DWORD dwZone,
+ [in] LPCWSTR lpszPattern,
+ [in] DWORD dwFlags);
+
+ HRESULT GetZoneMappings(
+ [in] DWORD dwZone,
+ [out] IEnumString **ppenumString,
+ [in] DWORD dwFlags);
+};
+cpp_quote("DEFINE_GUID(CLSID_InternetSecurityManager, 0x7b8a2d94, 0x0ac9, 0x11d1, 0x89, 0x6c, 0x00, 0xc0, 0x4f, 0xB6, 0xbf, 0xc4);")
+
cpp_quote("DEFINE_GUID(IID_IAsyncMoniker, 0x79EAC9D3, 0xBAF9, 0x11CE, 0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B);")
cpp_quote("DEFINE_GUID(CLSID_StdURLMoniker, 0x79EAC9E0, 0xBAF9, 0x11CE, 0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B);")
--- /dev/null 2003-01-30 10:24:37.000000000 +0000
+++ dlls/urlmon/sec_mgr.c 2004-09-27 17:59:36.000000000 +0100
@@ -0,0 +1,251 @@
+/*
+ * Internet Security Manager
+ *
+ * Copyright (c) 2004 Huw D M Davies
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "wine/debug.h"
+#include "ole2.h"
+#include "wine/unicode.h"
+#include "urlmon.h"
+#include "urlmon_main.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
+
+typedef struct SecManagerImpl{
+
+ IInternetSecurityManagerVtbl* lpvtbl1; /* VTable relative to the IInternetSecurityManager interface.*/
+
+ ULONG ref; /* reference counter for this object */
+
+} SecManagerImpl;
+
+/* IUnknown prototype functions */
+static HRESULT WINAPI SecManagerImpl_QueryInterface(IInternetSecurityManager* iface,REFIID riid,void** ppvObject);
+static ULONG WINAPI SecManagerImpl_AddRef(IInternetSecurityManager* iface);
+static ULONG WINAPI SecManagerImpl_Release(IInternetSecurityManager* iface);
+
+static HRESULT WINAPI SecManagerImpl_SetSecuritySite(IInternetSecurityManager *iface,
+ IInternetSecurityMgrSite *pSite);
+static HRESULT WINAPI SecManagerImpl_GetSecuritySite(IInternetSecurityManager *iface,
+ IInternetSecurityMgrSite **ppSite);
+static HRESULT WINAPI SecManagerImpl_MapUrlToZone(IInternetSecurityManager *iface,
+ LPCWSTR pwszUrl, DWORD *pdwZone,
+ DWORD dwFlags);
+static HRESULT WINAPI SecManagerImpl_GetSecurityId(IInternetSecurityManager *iface,
+ LPCWSTR pwszUrl,
+ BYTE *pbSecurityId, DWORD *pcbSecurityId,
+ DWORD dwReserved);
+static HRESULT WINAPI SecManagerImpl_ProcessUrlAction(IInternetSecurityManager *iface,
+ LPCWSTR pwszUrl, DWORD dwAction,
+ BYTE *pPolicy, DWORD cbPolicy,
+ BYTE *pContext, DWORD cbContext,
+ DWORD dwFlags, DWORD dwReserved);
+static HRESULT WINAPI SecManagerImpl_QueryCustomPolicy(IInternetSecurityManager *iface,
+ LPCWSTR pwszUrl, REFGUID guidKey,
+ BYTE **ppPolicy, DWORD *pcbPolicy,
+ BYTE *pContext, DWORD cbContext,
+ DWORD dwReserved);
+static HRESULT WINAPI SecManagerImpl_SetZoneMapping(IInternetSecurityManager *iface,
+ DWORD dwZone, LPCWSTR pwszPattern, DWORD dwFlags);
+static HRESULT WINAPI SecManagerImpl_GetZoneMappings(IInternetSecurityManager *iface,
+ DWORD dwZone, IEnumString **ppenumString, DWORD dwFlags);
+
+static HRESULT SecManagerImpl_Destroy(SecManagerImpl* This);
+HRESULT SecManagerImpl_Construct(IUnknown *pUnkOuter, LPVOID *ppobj);
+
+static IInternetSecurityManagerVtbl VT_SecManagerImpl =
+{
+ SecManagerImpl_QueryInterface,
+ SecManagerImpl_AddRef,
+ SecManagerImpl_Release,
+ SecManagerImpl_SetSecuritySite,
+ SecManagerImpl_GetSecuritySite,
+ SecManagerImpl_MapUrlToZone,
+ SecManagerImpl_GetSecurityId,
+ SecManagerImpl_ProcessUrlAction,
+ SecManagerImpl_QueryCustomPolicy,
+ SecManagerImpl_SetZoneMapping,
+ SecManagerImpl_GetZoneMappings
+};
+
+static HRESULT WINAPI SecManagerImpl_QueryInterface(IInternetSecurityManager* iface,REFIID riid,void** ppvObject)
+{
+ SecManagerImpl *This = (SecManagerImpl *)iface;
+
+ TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(riid),ppvObject);
+
+ /* Perform a sanity check on the parameters.*/
+ if ( (This==0) || (ppvObject==0) )
+ return E_INVALIDARG;
+
+ /* Initialize the return parameter */
+ *ppvObject = 0;
+
+ /* Compare the riid with the interface IDs implemented by this object.*/
+ if (IsEqualIID(&IID_IUnknown, riid) ||
+ IsEqualIID(&IID_IInternetSecurityManager, riid))
+ *ppvObject = iface;
+
+ /* Check that we obtained an interface.*/
+ if ((*ppvObject)==0)
+ return E_NOINTERFACE;
+
+ /* Query Interface always increases the reference count by one when it is successful */
+ SecManagerImpl_AddRef(iface);
+
+ return S_OK;
+}
+
+static ULONG WINAPI SecManagerImpl_AddRef(IInternetSecurityManager* iface)
+{
+ SecManagerImpl *This = (SecManagerImpl *)iface;
+
+ TRACE("(%p)\n",This);
+
+ return InterlockedIncrement(&This->ref);
+}
+
+static ULONG WINAPI SecManagerImpl_Release(IInternetSecurityManager* iface)
+{
+ SecManagerImpl *This = (SecManagerImpl *)iface;
+ ULONG ref;
+ TRACE("(%p)\n",This);
+
+ ref = InterlockedDecrement(&This->ref);
+
+ /* destroy the object if there's no more reference on it */
+ if (ref==0){
+
+ SecManagerImpl_Destroy(This);
+
+ return 0;
+ }
+ return ref;
+}
+
+static HRESULT SecManagerImpl_Destroy(SecManagerImpl* This)
+{
+ TRACE("(%p)\n",This);
+
+ HeapFree(GetProcessHeap(),0,This);
+
+ return S_OK;
+}
+
+HRESULT SecManagerImpl_Construct(IUnknown *pUnkOuter, LPVOID *ppobj)
+{
+ SecManagerImpl *This;
+
+ TRACE("(%p,%p)\n",pUnkOuter,ppobj);
+ This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
+
+ /* Initialize the virtual function table. */
+ This->lpvtbl1 = &VT_SecManagerImpl;
+ This->ref = 1;
+
+ *ppobj = This;
+ return S_OK;
+}
+
+static HRESULT WINAPI SecManagerImpl_SetSecuritySite(IInternetSecurityManager *iface,
+ IInternetSecurityMgrSite *pSite)
+{
+ FIXME("(%p)->(%p)\n", iface, pSite);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI SecManagerImpl_GetSecuritySite(IInternetSecurityManager *iface,
+ IInternetSecurityMgrSite **ppSite)
+{
+ FIXME("(%p)->( %p)\n", iface, ppSite);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI SecManagerImpl_MapUrlToZone(IInternetSecurityManager *iface,
+ LPCWSTR pwszUrl, DWORD *pdwZone,
+ DWORD dwFlags)
+{
+ FIXME("(%p)->(%s %p %08lx)\n", iface, debugstr_w(pwszUrl), pdwZone, dwFlags);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI SecManagerImpl_GetSecurityId(IInternetSecurityManager *iface,
+ LPCWSTR pwszUrl,
+ BYTE *pbSecurityId, DWORD *pcbSecurityId,
+ DWORD dwReserved)
+{
+ FIXME("(%p)->(%s %p %p %08lx)\n", iface, debugstr_w(pwszUrl), pbSecurityId, pcbSecurityId,
+ dwReserved);
+ return E_NOTIMPL;
+}
+
+
+static HRESULT WINAPI SecManagerImpl_ProcessUrlAction(IInternetSecurityManager *iface,
+ LPCWSTR pwszUrl, DWORD dwAction,
+ BYTE *pPolicy, DWORD cbPolicy,
+ BYTE *pContext, DWORD cbContext,
+ DWORD dwFlags, DWORD dwReserved)
+{
+ FIXME("(%p)->(%s %08lx %p %08lx %p %08lx %08lx %08lx)\n", iface, debugstr_w(pwszUrl), dwAction,
+ pPolicy, cbPolicy, pContext, cbContext, dwFlags, dwReserved);
+ return E_NOTIMPL;
+}
+
+
+static HRESULT WINAPI SecManagerImpl_QueryCustomPolicy(IInternetSecurityManager *iface,
+ LPCWSTR pwszUrl, REFGUID guidKey,
+ BYTE **ppPolicy, DWORD *pcbPolicy,
+ BYTE *pContext, DWORD cbContext,
+ DWORD dwReserved)
+{
+ FIXME("(%p)->(%s %s %p %p %p %08lx %08lx )\n", iface, debugstr_w(pwszUrl), debugstr_guid(guidKey),
+ ppPolicy, pcbPolicy, pContext, cbContext, dwReserved);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI SecManagerImpl_SetZoneMapping(IInternetSecurityManager *iface,
+ DWORD dwZone, LPCWSTR pwszPattern, DWORD dwFlags)
+{
+ FIXME("(%p)->(%08lx %s %08lx)\n", iface, dwZone, debugstr_w(pwszPattern),dwFlags);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI SecManagerImpl_GetZoneMappings(IInternetSecurityManager *iface,
+ DWORD dwZone, IEnumString **ppenumString, DWORD dwFlags)
+{
+ FIXME("(%p)->(%08lx %p %08lx)\n", iface, dwZone, ppenumString,dwFlags);
+ return E_NOTIMPL;
+}
+
+/***********************************************************************
+ * CoInternetCreateSecurityManager (URLMON.@)
+ *
+ */
+HRESULT WINAPI CoInternetCreateSecurityManager( IServiceProvider *pSP,
+ IInternetSecurityManager **ppSM, DWORD dwReserved )
+{
+ TRACE("%p %p %ld\n", pSP, ppSM, dwReserved );
+ return SecManagerImpl_Construct(NULL, (void**) ppSM);
+}
+
More information about the wine-patches
mailing list