urlmon: Added ProxyStub implementation.
diff --git a/.gitignore b/.gitignore
index b39a7f0..dcf494f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -117,6 +117,8 @@
 dlls/stdole32.tlb/std_ole_v1.tlb
 dlls/sti/sti_wia.h
 dlls/sti/sti_wia_p.c
+dlls/urlmon/urlmon_urlmon.h
+dlls/urlmon/urlmon_urlmon_p.c
 dlls/user.exe16
 dlls/wprocs.dll16
 include/activaut.h
diff --git a/dlls/urlmon/Makefile.in b/dlls/urlmon/Makefile.in
index 448a069..f0dd490 100644
--- a/dlls/urlmon/Makefile.in
+++ b/dlls/urlmon/Makefile.in
@@ -4,7 +4,9 @@
 VPATH     = @srcdir@
 MODULE    = urlmon.dll
 IMPORTLIB = urlmon
-IMPORTS   = uuid ole32 shlwapi wininet user32 advapi32 kernel32 ntdll
+IMPORTS   = uuid ole32 rpcrt4 shlwapi wininet user32 advapi32 kernel32 ntdll
+EXTRADEFS = -D_URLMON_ -DENTRY_PREFIX=URLMON_ -DPROXY_DELEGATION -DREGISTER_PROXY_DLL \
+	    -DPROXY_CLSID_IS="{0x79EAC9F1,0xBAF9,0x11CE,{0x8C,0x82,0x00,0xAA,0x00,0x4B,0xA9,0x0B}}"
 
 C_SRCS = \
 	bindctx.c \
@@ -26,10 +28,15 @@
 	session.c \
 	umon.c \
 	umstream.c \
-	urlmon_main.c
+	urlmon_main.c \
+	usrmarshal.c
 
 RC_SRCS = rsrc.rc
 
+IDL_P_SRCS = urlmon_urlmon.idl
+
+EXTRA_OBJS = dlldata.o
+
 @MAKE_DLL_RULES@
 
 @DEPENDENCIES@  # everything below this line is overwritten by make depend
diff --git a/dlls/urlmon/regsvr.c b/dlls/urlmon/regsvr.c
index 9561a23..9e27825 100644
--- a/dlls/urlmon/regsvr.c
+++ b/dlls/urlmon/regsvr.c
@@ -495,6 +495,12 @@
         "urlmon.dll",
         "Both"
     },
+    {   &CLSID_PSFactoryBuffer,
+        "URLMoniker ProxyStub Factory",
+        NULL,
+        "urlmon.dll",
+        "Apartment"
+    },
     { NULL }			/* list terminator */
 };
 
@@ -573,12 +579,14 @@
 
     TRACE("\n");
 
-    hr = register_coclasses(coclass_list);
-    if (SUCCEEDED(hr))
+    hr = URLMON_DllRegisterServer();
+    if(SUCCEEDED(hr))
+        hr = register_coclasses(coclass_list);
+    if(SUCCEEDED(hr))
 	hr = register_interfaces(interface_list);
-    if(FAILED(hr))
-        return hr;
-    return register_inf(TRUE);
+    if(SUCCEEDED(hr))
+        hr = register_inf(TRUE);
+    return hr;
 }
 
 /***********************************************************************
@@ -590,10 +598,12 @@
 
     TRACE("\n");
 
-    hr = unregister_coclasses(coclass_list);
-    if (SUCCEEDED(hr))
+    hr = URLMON_DllUnregisterServer();
+    if(SUCCEEDED(hr))
+        hr = unregister_coclasses(coclass_list);
+    if(SUCCEEDED(hr))
 	hr = unregister_interfaces(interface_list);
-    if(FAILED(hr))
-        return hr;
-    return register_inf(FALSE);
+    if(SUCCEEDED(hr))
+        hr = register_inf(FALSE);
+    return hr;
 }
diff --git a/dlls/urlmon/urlmon_main.c b/dlls/urlmon/urlmon_main.c
index a420308..272884e 100644
--- a/dlls/urlmon/urlmon_main.c
+++ b/dlls/urlmon/urlmon_main.c
@@ -348,6 +348,7 @@
 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
 {
     unsigned int i;
+    HRESULT hr;
     
     TRACE("(%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
     
@@ -357,6 +358,10 @@
 	    return IClassFactory_QueryInterface(object_creation[i].cf, riid, ppv);
     }
 
+    hr = URLMON_DllGetClassObject(rclsid, riid, ppv);
+    if(SUCCEEDED(hr))
+        return hr;
+
     FIXME("%s: no class found.\n", debugstr_guid(rclsid));
     return CLASS_E_CLASSNOTAVAILABLE;
 }
diff --git a/dlls/urlmon/urlmon_main.h b/dlls/urlmon/urlmon_main.h
index 21b9343..8db786b 100644
--- a/dlls/urlmon/urlmon_main.h
+++ b/dlls/urlmon/urlmon_main.h
@@ -48,6 +48,12 @@
 extern HRESULT MkProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj);
 extern HRESULT MimeFilter_Construct(IUnknown *pUnkOuter, LPVOID *ppobj);
 
+extern HRESULT WINAPI URLMON_DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID *ppv) DECLSPEC_HIDDEN;
+extern HRESULT WINAPI URLMON_DllRegisterServer(void) DECLSPEC_HIDDEN;
+extern HRESULT WINAPI URLMON_DllUnregisterServer(void) DECLSPEC_HIDDEN;
+
+extern GUID const CLSID_PSFactoryBuffer DECLSPEC_HIDDEN;
+
 /**********************************************************************
  * Dll lifetime tracking declaration for urlmon.dll
  */
diff --git a/dlls/urlmon/urlmon_urlmon.idl b/dlls/urlmon/urlmon_urlmon.idl
new file mode 100644
index 0000000..71a0719
--- /dev/null
+++ b/dlls/urlmon/urlmon_urlmon.idl
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2009 Piotr Caban for Codeweavers
+ *
+ * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "urlmon.idl"
diff --git a/dlls/urlmon/usrmarshal.c b/dlls/urlmon/usrmarshal.c
new file mode 100644
index 0000000..b945563
--- /dev/null
+++ b/dlls/urlmon/usrmarshal.c
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2009 Piotr Caban for Codeweavers
+ *
+ * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "urlmon_main.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
+
+HRESULT CALLBACK IWinInetHttpInfo_QueryInfo_Proxy(IWinInetHttpInfo* This,
+    DWORD dwOption, LPVOID pBuffer, DWORD *pcbBuf, DWORD *pdwFlags,
+    DWORD *pdwReserved)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+HRESULT __RPC_STUB IWinInetHttpInfo_QueryInfo_Stub(IWinInetHttpInfo* This,
+    DWORD dwOption, BYTE *pBuffer, DWORD *pcbBuf, DWORD *pdwFlags,
+    DWORD *pdwReserved)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+HRESULT CALLBACK IWinInetInfo_QueryOption_Proxy(IWinInetInfo* This,
+        DWORD dwOption, LPVOID pBuffer, DWORD *pcbBuf)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+HRESULT __RPC_STUB IWinInetInfo_QueryOption_Stub(IWinInetInfo* This,
+        DWORD dwOption, BYTE *pBuffer, DWORD *pcbBuf)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+HRESULT CALLBACK IBindHost_MonikerBindToStorage_Proxy(IBindHost* This,
+        IMoniker *pMk, IBindCtx *pBC, IBindStatusCallback *pBSC,
+        REFIID riid, void **ppvObj)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+HRESULT __RPC_STUB IBindHost_MonikerBindToStorage_Stub(IBindHost* This,
+        IMoniker *pMk, IBindCtx *pBC, IBindStatusCallback *pBSC,
+        REFIID riid, IUnknown **ppvObj)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+HRESULT CALLBACK IBindHost_MonikerBindToObject_Proxy(IBindHost* This,
+        IMoniker *pMk, IBindCtx *pBC, IBindStatusCallback *pBSC,
+        REFIID riid, void **ppvObj)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+HRESULT __RPC_STUB IBindHost_MonikerBindToObject_Stub(IBindHost* This,
+        IMoniker *pMk, IBindCtx *pBC, IBindStatusCallback *pBSC,
+        REFIID riid, IUnknown **ppvObj)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+HRESULT CALLBACK IBindStatusCallbackEx_GetBindInfoEx_Proxy(
+        IBindStatusCallbackEx* This, DWORD *grfBINDF, BINDINFO *pbindinfo,
+        DWORD *grfBINDF2, DWORD *pdwReserved)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+HRESULT __RPC_STUB IBindStatusCallbackEx_GetBindInfoEx_Stub(
+        IBindStatusCallbackEx* This, DWORD *grfBINDF, RemBINDINFO *pbindinfo,
+        RemSTGMEDIUM *pstgmed, DWORD *grfBINDF2, DWORD *pdwReserved)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+HRESULT CALLBACK IBindStatusCallback_GetBindInfo_Proxy(
+        IBindStatusCallback* This, DWORD *grfBINDF, BINDINFO *pbindinfo)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+HRESULT __RPC_STUB IBindStatusCallback_GetBindInfo_Stub(
+        IBindStatusCallback* This, DWORD *grfBINDF,
+        RemBINDINFO *pbindinfo, RemSTGMEDIUM *pstgmed)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+HRESULT CALLBACK IBindStatusCallback_OnDataAvailable_Proxy(
+        IBindStatusCallback* This, DWORD grfBSCF, DWORD dwSize,
+        FORMATETC *pformatetc, STGMEDIUM *pstgmed)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+HRESULT __RPC_STUB IBindStatusCallback_OnDataAvailable_Stub(
+        IBindStatusCallback* This, DWORD grfBSCF, DWORD dwSize,
+        RemFORMATETC *pformatetc, RemSTGMEDIUM *pstgmed)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+HRESULT CALLBACK IBinding_GetBindResult_Proxy(IBinding* This,
+        CLSID *pclsidProtocol, DWORD *pdwResult,
+        LPOLESTR *pszResult, DWORD *pdwReserved)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+HRESULT __RPC_STUB IBinding_GetBindResult_Stub(IBinding* This,
+        CLSID *pclsidProtocol, DWORD *pdwResult,
+        LPOLESTR *pszResult, DWORD dwReserved)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+HRESULT STDMETHODCALLTYPE IWindowForBindingUI_GetWindow_Proxy(
+        IWindowForBindingUI* This, REFGUID rguidReason, HWND *phwnd)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+void __RPC_STUB IWindowForBindingUI_GetWindow_Stub(IRpcStubBuffer* This,
+        IRpcChannelBuffer* pRpcChannelBuffer, PRPC_MESSAGE pRpcMessage,
+        DWORD* pdwStubPhase)
+{
+    FIXME("stub\n");
+}