From 2eb77351e0ba6802d79ce1603d469311541286e9 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 20 Jan 2018 13:29:39 +0100 Subject: [PATCH] [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 18f8fdb9bd3..c84adbbf943 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 1e4932521f7..fd8d6d228f2 100644 --- a/dll/win32/urlmon/usrmarshal.c +++ b/dll/win32/urlmon/usrmarshal.c @@ -18,6 +18,8 @@ #include "urlmon_main.h" +#include + 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 5106521886b..14089f8b59d 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