https://git.reactos.org/?p=reactos.git;a=commitdiff;h=2eb77351e0ba6802d79ce…
commit 2eb77351e0ba6802d79ce1603d469311541286e9
Author: Amine Khaldi <amine.khaldi(a)reactos.org>
AuthorDate: Sat Jan 20 13:29:39 2018 +0100
Commit: Amine Khaldi <amine.khaldi(a)reactos.org>
CommitDate: Sat Jan 20 13:29:39 2018 +0100
[URLMON] Sync with Wine 3.0. CORE-14225
---
dll/win32/urlmon/axinstall.c | 23 +++-
dll/win32/urlmon/usrmarshal.c | 268 +++++++++++++++++++++++++++++++++++++++---
media/doc/README.WINE | 2 +-
3 files changed, 269 insertions(+), 24 deletions(-)
diff --git a/dll/win32/urlmon/axinstall.c b/dll/win32/urlmon/axinstall.c
index 18f8fdb9bd..c84adbbf94 100644
--- a/dll/win32/urlmon/axinstall.c
+++ b/dll/win32/urlmon/axinstall.c
@@ -243,12 +243,25 @@ static HRESULT install_inf_file(install_ctx_t *ctx)
len = GetPrivateProfileStringW(add_codeW, NULL, NULL, buf, sizeof(buf)/sizeof(*buf),
ctx->install_file);
if(len) {
- FIXME("[Add.Code] section not supported\n");
+ default_install = FALSE;
- /* Don't throw an error if we successfully ran setup hooks;
- installation is likely to be complete enough */
- if(default_install)
- return E_NOTIMPL;
+ for(key = buf; *key; key += strlenW(key)+1) {
+ TRACE("[Add.Code] key: %s\n", debugstr_w(key));
+
+ len = GetPrivateProfileStringW(add_codeW, key, NULL, sect_name,
sizeof(sect_name)/sizeof(*sect_name),
+ ctx->install_file);
+ if(!len) {
+ WARN("Could not get key value\n");
+ return E_FAIL;
+ }
+
+ hres = RunSetupCommandW(ctx->hwnd, ctx->install_file, sect_name,
+ ctx->tmp_dir, NULL, NULL, RSC_FLAG_INF, NULL);
+ if(FAILED(hres)) {
+ WARN("RunSetupCommandW failed: %08x\n", hres);
+ return hres;
+ }
+ }
}
if(default_install) {
diff --git a/dll/win32/urlmon/usrmarshal.c b/dll/win32/urlmon/usrmarshal.c
index 1e4932521f..fd8d6d228f 100644
--- a/dll/win32/urlmon/usrmarshal.c
+++ b/dll/win32/urlmon/usrmarshal.c
@@ -18,6 +18,8 @@
#include "urlmon_main.h"
+#include <ole2.h>
+
HRESULT CALLBACK IWinInetHttpInfo_QueryInfo_Proxy(IWinInetHttpInfo* This,
DWORD dwOption, LPVOID pBuffer, DWORD *pcbBuf, DWORD *pdwFlags,
DWORD *pdwReserved)
@@ -80,51 +82,281 @@ HRESULT __RPC_STUB IBindHost_MonikerBindToObject_Stub(IBindHost*
This,
return IBindHost_MonikerBindToObject(This, moniker, bc, bsc, riid, (void**)obj);
}
+static HRESULT marshal_stgmed(STGMEDIUM *stgmed, RemSTGMEDIUM **ret)
+{
+ RemSTGMEDIUM *rem_stgmed;
+ IStream *stream = NULL;
+ ULONG size = 0;
+ HRESULT hres = S_OK;
+
+ if((stgmed->tymed == TYMED_ISTREAM && stgmed->u.pstm) ||
stgmed->pUnkForRelease) {
+ hres = CreateStreamOnHGlobal(NULL, TRUE, &stream);
+ if(FAILED(hres))
+ return hres;
+ }
+
+ switch(stgmed->tymed) {
+ case TYMED_NULL:
+ break;
+ case TYMED_ISTREAM:
+ if(stgmed->u.pstm)
+ hres = CoMarshalInterface(stream, &IID_IStream,
(IUnknown*)stgmed->u.pstm,
+ MSHCTX_LOCAL, NULL, MSHLFLAGS_NORMAL);
+ break;
+ default:
+ FIXME("unsupported tymed %u\n", stgmed->tymed);
+ break;
+ }
+
+ if(SUCCEEDED(hres) && stgmed->pUnkForRelease)
+ hres = CoMarshalInterface(stream, &IID_IUnknown, stgmed->pUnkForRelease,
+ MSHCTX_LOCAL, NULL, MSHLFLAGS_NORMAL);
+ if(FAILED(hres)) {
+ if(stream)
+ IStream_Release(stream);
+ return hres;
+ }
+
+ if(stream) {
+ LARGE_INTEGER zero;
+ ULARGE_INTEGER off;
+
+ zero.QuadPart = 0;
+ IStream_Seek(stream, zero, STREAM_SEEK_CUR, &off);
+ size = off.QuadPart;
+ IStream_Seek(stream, zero, STREAM_SEEK_SET, &off);
+ }
+
+ rem_stgmed = heap_alloc_zero(FIELD_OFFSET(RemSTGMEDIUM, data[size]));
+ if(!rem_stgmed) {
+ if(stream)
+ IStream_Release(stream);
+ return E_OUTOFMEMORY;
+ }
+
+ rem_stgmed->tymed = stgmed->tymed;
+ rem_stgmed->dwHandleType = 0;
+ rem_stgmed->pData = stgmed->u.pstm != NULL;
+ rem_stgmed->pUnkForRelease = stgmed->pUnkForRelease != NULL;
+ rem_stgmed->cbData = size;
+ if(stream) {
+ IStream_Read(stream, rem_stgmed->data, size, &size);
+ IStream_Release(stream);
+ }
+
+ *ret = rem_stgmed;
+ return S_OK;
+}
+
+static HRESULT unmarshal_stgmed(RemSTGMEDIUM *rem_stgmed, STGMEDIUM *stgmed)
+{
+ IStream *stream = NULL;
+ HRESULT hres = S_OK;
+
+ stgmed->tymed = rem_stgmed->tymed;
+
+ if((stgmed->tymed == TYMED_ISTREAM && rem_stgmed->pData) ||
rem_stgmed->pUnkForRelease) {
+ LARGE_INTEGER zero;
+
+ hres = CreateStreamOnHGlobal(NULL, TRUE, &stream);
+ if(FAILED(hres))
+ return hres;
+
+ hres = IStream_Write(stream, rem_stgmed->data, rem_stgmed->cbData, NULL);
+ if(FAILED(hres)) {
+ IStream_Release(stream);
+ return hres;
+ }
+
+ zero.QuadPart = 0;
+ IStream_Seek(stream, zero, STREAM_SEEK_SET, NULL);
+ }
+
+ switch(stgmed->tymed) {
+ case TYMED_NULL:
+ break;
+ case TYMED_ISTREAM:
+ if(rem_stgmed->pData)
+ hres = CoUnmarshalInterface(stream, &IID_IStream,
(void**)&stgmed->u.pstm);
+ break;
+ default:
+ FIXME("unsupported tymed %u\n", stgmed->tymed);
+ break;
+ }
+
+ if(SUCCEEDED(hres) && rem_stgmed->pUnkForRelease)
+ hres = CoUnmarshalInterface(stream, &IID_IUnknown,
(void**)&stgmed->pUnkForRelease);
+ if(stream)
+ IStream_Release(stream);
+ return hres;
+}
+
+static void proxy_marshal_bindinfo(BINDINFO *bindinfo, RemBINDINFO *rem_bindinfo)
+{
+ rem_bindinfo->szExtraInfo = bindinfo->szExtraInfo;
+ rem_bindinfo->grfBindInfoF = bindinfo->grfBindInfoF;
+ rem_bindinfo->dwBindVerb = bindinfo->dwBindVerb;
+ rem_bindinfo->szCustomVerb = bindinfo->szCustomVerb;
+ rem_bindinfo->cbstgmedData = bindinfo->cbstgmedData;
+}
+
+static void proxy_unmarshal_bindinfo(RemBINDINFO *rem_bindinfo, BINDINFO *bindinfo)
+{
+ bindinfo->szExtraInfo = rem_bindinfo->szExtraInfo;
+ bindinfo->grfBindInfoF = rem_bindinfo->grfBindInfoF;
+ bindinfo->dwBindVerb = rem_bindinfo->dwBindVerb;
+ bindinfo->szCustomVerb = rem_bindinfo->szCustomVerb;
+ bindinfo->cbstgmedData = rem_bindinfo->cbstgmedData;
+ bindinfo->dwOptions = rem_bindinfo->dwOptions;
+ bindinfo->dwOptionsFlags = rem_bindinfo->dwOptionsFlags;
+ bindinfo->dwCodePage = rem_bindinfo->dwCodePage;
+ bindinfo->iid = IID_NULL;
+ bindinfo->pUnk = NULL;
+}
+
+static void stub_unmarshal_bindinfo(RemBINDINFO *rem_bindinfo, BINDINFO *bindinfo)
+{
+ bindinfo->szExtraInfo = rem_bindinfo->szExtraInfo;
+ bindinfo->grfBindInfoF = rem_bindinfo->grfBindInfoF;
+ bindinfo->dwBindVerb = rem_bindinfo->dwBindVerb;
+ bindinfo->szCustomVerb = rem_bindinfo->szCustomVerb;
+ bindinfo->cbstgmedData = rem_bindinfo->cbstgmedData;
+
+ if(bindinfo->stgmedData.tymed != TYMED_NULL)
+ WARN("stgmed data (tymed %u) will be lost!\n",
bindinfo->stgmedData.tymed);
+}
+
+static void stub_marshal_bindinfo(BINDINFO *bindinfo, RemBINDINFO *rem_bindinfo)
+{
+ rem_bindinfo->cbSize = sizeof(*rem_bindinfo);
+ rem_bindinfo->szExtraInfo = bindinfo->szExtraInfo;
+ rem_bindinfo->grfBindInfoF = bindinfo->grfBindInfoF;
+ rem_bindinfo->dwBindVerb = bindinfo->dwBindVerb;
+ rem_bindinfo->szCustomVerb = bindinfo->szCustomVerb;
+ rem_bindinfo->cbstgmedData = bindinfo->cbstgmedData;
+ rem_bindinfo->dwOptions = bindinfo->dwOptions;
+ rem_bindinfo->dwOptionsFlags = bindinfo->dwOptionsFlags;
+ rem_bindinfo->dwCodePage = bindinfo->dwCodePage;
+ rem_bindinfo->pUnk = NULL;
+ rem_bindinfo->dwReserved = bindinfo->dwReserved;
+}
+
+
HRESULT CALLBACK IBindStatusCallbackEx_GetBindInfoEx_Proxy(
- IBindStatusCallbackEx* This, DWORD *grfBINDF, BINDINFO *pbindinfo,
+ IBindStatusCallbackEx* This, DWORD *grfBINDF, BINDINFO *bindinfo,
DWORD *grfBINDF2, DWORD *pdwReserved)
{
- FIXME("stub\n");
- return E_NOTIMPL;
+ RemBINDINFO rem_bindinfo = {sizeof(rem_bindinfo)};
+ RemSTGMEDIUM rem_stgmed = {0};
+ HRESULT hres;
+
+ TRACE("(%p)->(%p %p %p %p)\n", This, grfBINDF, bindinfo, grfBINDF2,
pdwReserved);
+
+ proxy_marshal_bindinfo(bindinfo, &rem_bindinfo);
+ hres = IBindStatusCallbackEx_RemoteGetBindInfoEx_Proxy(This, grfBINDF,
&rem_bindinfo,
+ &rem_stgmed, grfBINDF2, pdwReserved);
+ proxy_unmarshal_bindinfo(&rem_bindinfo, bindinfo);
+ return hres;
}
HRESULT __RPC_STUB IBindStatusCallbackEx_GetBindInfoEx_Stub(
- IBindStatusCallbackEx* This, DWORD *grfBINDF, RemBINDINFO *pbindinfo,
- RemSTGMEDIUM *pstgmed, DWORD *grfBINDF2, DWORD *pdwReserved)
+ IBindStatusCallbackEx* This, DWORD *grfBINDF, RemBINDINFO *rem_bindinfo,
+ RemSTGMEDIUM *rem_stgmed, DWORD *grfBINDF2, DWORD *pdwReserved)
{
- FIXME("stub\n");
- return E_NOTIMPL;
-}
+ BINDINFO bindinfo = {sizeof(bindinfo)};
+ HRESULT hres;
+ TRACE("(%p)->(%p %p %p %p %p)\n", This, grfBINDF, rem_bindinfo,
rem_stgmed, grfBINDF2, pdwReserved);
+
+ /*
+ * Although arguments suggest support for STGMEDIUM from BINDINFO, tests show
+ * that it's not supported and returned data is lost.
+ */
+ stub_unmarshal_bindinfo(rem_bindinfo, &bindinfo);
+ hres = IBindStatusCallbackEx_GetBindInfoEx(This, grfBINDF, &bindinfo, grfBINDF2,
pdwReserved);
+ stub_marshal_bindinfo(&bindinfo, rem_bindinfo);
+ return hres;
+}
HRESULT CALLBACK IBindStatusCallback_GetBindInfo_Proxy(
- IBindStatusCallback* This, DWORD *grfBINDF, BINDINFO *pbindinfo)
+ IBindStatusCallback* This, DWORD *grfBINDF, BINDINFO *bindinfo)
{
- FIXME("stub\n");
- return E_NOTIMPL;
+ RemBINDINFO rem_bindinfo = {sizeof(rem_bindinfo)};
+ RemSTGMEDIUM rem_stgmed = {0};
+ HRESULT hres;
+
+ TRACE("(%p)->(%p %p)\n", This, grfBINDF, bindinfo);
+
+ proxy_marshal_bindinfo(bindinfo, &rem_bindinfo);
+ hres = IBindStatusCallback_RemoteGetBindInfo_Proxy(This, grfBINDF, &rem_bindinfo,
&rem_stgmed);
+ proxy_unmarshal_bindinfo(&rem_bindinfo, bindinfo);
+ return hres;
}
HRESULT __RPC_STUB IBindStatusCallback_GetBindInfo_Stub(
IBindStatusCallback* This, DWORD *grfBINDF,
- RemBINDINFO *pbindinfo, RemSTGMEDIUM *pstgmed)
+ RemBINDINFO *rem_bindinfo, RemSTGMEDIUM *rem_stgmed)
{
- FIXME("stub\n");
- return E_NOTIMPL;
+ BINDINFO bindinfo = {sizeof(bindinfo)};
+ HRESULT hres;
+
+ TRACE("(%p)->(%p %p %p)\n", This, grfBINDF, rem_bindinfo, rem_stgmed);
+
+ stub_unmarshal_bindinfo(rem_bindinfo, &bindinfo);
+ hres = IBindStatusCallback_GetBindInfo(This, grfBINDF, &bindinfo);
+ stub_marshal_bindinfo(&bindinfo, rem_bindinfo);
+ return hres;
}
HRESULT CALLBACK IBindStatusCallback_OnDataAvailable_Proxy(
IBindStatusCallback* This, DWORD grfBSCF, DWORD dwSize,
FORMATETC *pformatetc, STGMEDIUM *pstgmed)
{
- FIXME("stub\n");
- return E_NOTIMPL;
+ RemFORMATETC rem_formatetc;
+ RemSTGMEDIUM *rem_stgmed;
+ HRESULT hres;
+
+ TRACE("(%p)->(%x %u %p %p)\n", This, grfBSCF, dwSize, pformatetc,
pstgmed);
+
+ hres = marshal_stgmed(pstgmed, &rem_stgmed);
+ if(FAILED(hres))
+ return hres;
+
+ rem_formatetc.cfFormat = pformatetc->cfFormat;
+ rem_formatetc.ptd = 0;
+ rem_formatetc.dwAspect = pformatetc->dwAspect;
+ rem_formatetc.lindex = pformatetc->lindex;
+ rem_formatetc.tymed = pformatetc->tymed;
+
+ hres = IBindStatusCallback_RemoteOnDataAvailable_Proxy(This, grfBSCF, dwSize,
&rem_formatetc, rem_stgmed);
+
+ heap_free(rem_stgmed);
+ return hres;
}
HRESULT __RPC_STUB IBindStatusCallback_OnDataAvailable_Stub(
IBindStatusCallback* This, DWORD grfBSCF, DWORD dwSize,
RemFORMATETC *pformatetc, RemSTGMEDIUM *pstgmed)
{
- FIXME("stub\n");
- return E_NOTIMPL;
+ STGMEDIUM stgmed = { TYMED_NULL };
+ FORMATETC formatetc;
+ HRESULT hres;
+
+ TRACE("(%p)->(%x %u %p %p)\n", This, grfBSCF, dwSize, pformatetc,
pstgmed);
+
+ hres = unmarshal_stgmed(pstgmed, &stgmed);
+ if(FAILED(hres))
+ return hres;
+
+ formatetc.cfFormat = pformatetc->cfFormat;
+ formatetc.ptd = NULL;
+ formatetc.dwAspect = pformatetc->dwAspect;
+ formatetc.lindex = pformatetc->lindex;
+ formatetc.tymed = pformatetc->tymed;
+
+ hres = IBindStatusCallback_OnDataAvailable(This, grfBSCF, dwSize, &formatetc,
&stgmed);
+
+ ReleaseStgMedium(&stgmed);
+ return hres;
}
HRESULT CALLBACK IBinding_GetBindResult_Proxy(IBinding* This,
diff --git a/media/doc/README.WINE b/media/doc/README.WINE
index 5106521886..14089f8b59 100644
--- a/media/doc/README.WINE
+++ b/media/doc/README.WINE
@@ -188,7 +188,7 @@ reactos/dll/win32/traffic # Synced to WineStaging-2.9
reactos/dll/win32/twain_32 # Synced to Wine-3.0
reactos/dll/win32/updspapi # Synced to WineStaging-2.9
reactos/dll/win32/url # Synced to WineStaging-2.9
-reactos/dll/win32/urlmon # Synced to WineStaging-2.16
+reactos/dll/win32/urlmon # Synced to Wine-3.0
reactos/dll/win32/usp10 # Synced to Wine-3.0
reactos/dll/win32/uxtheme # Forked
reactos/dll/win32/vbscript # Synced to WineStaging-2.9