urlmon: IInternetSecurityManager

Huw D M Davies h.davies1 at physics.ox.ac.uk
Mon Sep 27 12:06:58 CDT 2004


        Huw Davies <huw at codeweavers.com>
        Stub implementation of IInternetSecurityManager
        Add a classfactory
        Fix calling convention of CoInternetCreateSecurityManager
-- 
Huw Davies
huw at codeweavers.com
? dlls/urlmon/sec_mgr.c
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	27 Sep 2004 16:55:34 -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	27 Sep 2004 16:55:34 -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	27 Sep 2004 16:55:34 -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,153 @@
     return S_FALSE;
 }
 
-/***********************************************************************
- *		DllGetClassObject (URLMON.@)
+
+
+/******************************************************************************
+ * Urlmon ClassFactory
+ */
+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[] =
+{
+    { &CLSID_InternetSecurityManager, &SecManagerImpl_Construct }
+};
+
+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 ++(This->ref);
+}
+
+static ULONG WINAPI CF_Release(LPCLASSFACTORY iface) {
+    IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
+
+    ULONG ref = --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);
+
+    hres = This->pfnCreateInstance(pOuter, (LPVOID *) &punk);
+    if (FAILED(hres)) {
+        *ppobj = NULL;
+        return hres;
+    }
+    hres = IUnknown_QueryInterface(punk, riid, ppobj);
+    if (FAILED(hres)) {
+        *ppobj = NULL;
+	return hres;
+    }
+    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
  */
-HRESULT WINAPI URLMON_DllGetClassObject(REFCLSID rclsid, REFIID riid,
-					LPVOID *ppv)
+
+DWORD WINAPI URLMON_DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
 {
-    FIXME("(%p, %p, %p): stub\n", debugstr_guid(rclsid),
-	  debugstr_guid(riid), 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;
+    }
 
-    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	27 Sep 2004 16:55:34 -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	27 Sep 2004 16:55:49 -0000
@@ -563,6 +563,101 @@
         [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")
+
+[
+    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);
+
+cpp_quote("#define MAX_SIZE_SECURITY_ID 512")
+
+    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