[PATCH] combase: Clarify stream data format used by FT marshaler.
Nikolay Sivov
nsivov at codeweavers.com
Thu Oct 28 06:22:56 CDT 2021
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
Removes additional read/write on 32 bit, and unused path on 64 bit.
dlls/combase/marshal.c | 56 +++++++++++++-------------------------
dlls/ole32/tests/marshal.c | 8 ++++++
2 files changed, 27 insertions(+), 37 deletions(-)
diff --git a/dlls/combase/marshal.c b/dlls/combase/marshal.c
index 51b4ce24115..f3ea3fcad50 100644
--- a/dlls/combase/marshal.c
+++ b/dlls/combase/marshal.c
@@ -271,6 +271,12 @@ static HRESULT WINAPI ftmarshaler_GetUnmarshalClass(IMarshal *iface, REFIID riid
return S_OK;
}
+union ftmarshaler_data
+{
+ UINT64 value;
+ IUnknown *object;
+};
+
static HRESULT WINAPI ftmarshaler_GetMarshalSizeMax(IMarshal *iface, REFIID riid, void *pv,
DWORD dest_context, void *pvDestContext, DWORD mshlflags, DWORD *size)
{
@@ -283,7 +289,7 @@ static HRESULT WINAPI ftmarshaler_GetMarshalSizeMax(IMarshal *iface, REFIID riid
copied between the apartments */
if (dest_context == MSHCTX_INPROC || dest_context == MSHCTX_CROSSCTX)
{
- *size = sizeof(mshlflags) + sizeof(pv) + sizeof(DWORD) + sizeof(GUID);
+ *size = sizeof(mshlflags) + sizeof(union ftmarshaler_data) + sizeof(GUID);
return S_OK;
}
@@ -307,30 +313,24 @@ static HRESULT WINAPI ftmarshaler_MarshalInterface(IMarshal *iface, IStream *str
copied between the apartments */
if (dest_context == MSHCTX_INPROC || dest_context == MSHCTX_CROSSCTX)
{
- void *object;
- DWORD constant = 0;
+ union ftmarshaler_data data;
GUID unknown_guid = { 0 };
- hr = IUnknown_QueryInterface((IUnknown *)pv, riid, &object);
+ data.value = 0;
+ hr = IUnknown_QueryInterface((IUnknown *)pv, riid, (void **)&data.object);
if (FAILED(hr))
return hr;
/* don't hold a reference to table-weak marshaled interfaces */
if (mshlflags & MSHLFLAGS_TABLEWEAK)
- IUnknown_Release((IUnknown *)object);
+ IUnknown_Release(data.object);
hr = IStream_Write(stream, &mshlflags, sizeof(mshlflags), NULL);
if (hr != S_OK) return STG_E_MEDIUMFULL;
- hr = IStream_Write(stream, &object, sizeof(object), NULL);
+ hr = IStream_Write(stream, &data, sizeof(data), NULL);
if (hr != S_OK) return STG_E_MEDIUMFULL;
- if (sizeof(object) == sizeof(DWORD))
- {
- hr = IStream_Write(stream, &constant, sizeof(constant), NULL);
- if (hr != S_OK) return STG_E_MEDIUMFULL;
- }
-
hr = IStream_Write(stream, &unknown_guid, sizeof(unknown_guid), NULL);
if (hr != S_OK) return STG_E_MEDIUMFULL;
@@ -346,9 +346,8 @@ static HRESULT WINAPI ftmarshaler_MarshalInterface(IMarshal *iface, IStream *str
static HRESULT WINAPI ftmarshaler_UnmarshalInterface(IMarshal *iface, IStream *stream, REFIID riid, void **ppv)
{
+ union ftmarshaler_data data;
DWORD mshlflags;
- IUnknown *object;
- DWORD constant;
GUID unknown_guid;
HRESULT hr;
@@ -357,32 +356,23 @@ static HRESULT WINAPI ftmarshaler_UnmarshalInterface(IMarshal *iface, IStream *s
hr = IStream_Read(stream, &mshlflags, sizeof(mshlflags), NULL);
if (hr != S_OK) return STG_E_READFAULT;
- hr = IStream_Read(stream, &object, sizeof(object), NULL);
+ hr = IStream_Read(stream, &data, sizeof(data), NULL);
if (hr != S_OK) return STG_E_READFAULT;
- if (sizeof(object) == sizeof(DWORD))
- {
- hr = IStream_Read(stream, &constant, sizeof(constant), NULL);
- if (hr != S_OK) return STG_E_READFAULT;
- if (constant != 0)
- FIXME("constant is 0x%x instead of 0\n", constant);
- }
-
hr = IStream_Read(stream, &unknown_guid, sizeof(unknown_guid), NULL);
if (hr != S_OK) return STG_E_READFAULT;
- hr = IUnknown_QueryInterface(object, riid, ppv);
+ hr = IUnknown_QueryInterface(data.object, riid, ppv);
if (!(mshlflags & (MSHLFLAGS_TABLEWEAK | MSHLFLAGS_TABLESTRONG)))
- IUnknown_Release(object);
+ IUnknown_Release(data.object);
return hr;
}
static HRESULT WINAPI ftmarshaler_ReleaseMarshalData(IMarshal *iface, IStream *stream)
{
+ union ftmarshaler_data data;
DWORD mshlflags;
- IUnknown *object;
- DWORD constant;
GUID unknown_guid;
HRESULT hr;
@@ -391,21 +381,13 @@ static HRESULT WINAPI ftmarshaler_ReleaseMarshalData(IMarshal *iface, IStream *s
hr = IStream_Read(stream, &mshlflags, sizeof(mshlflags), NULL);
if (hr != S_OK) return STG_E_READFAULT;
- hr = IStream_Read(stream, &object, sizeof(object), NULL);
+ hr = IStream_Read(stream, &data, sizeof(data), NULL);
if (hr != S_OK) return STG_E_READFAULT;
- if (sizeof(object) == sizeof(DWORD))
- {
- hr = IStream_Read(stream, &constant, sizeof(constant), NULL);
- if (hr != S_OK) return STG_E_READFAULT;
- if (constant != 0)
- FIXME("constant is 0x%x instead of 0\n", constant);
- }
-
hr = IStream_Read(stream, &unknown_guid, sizeof(unknown_guid), NULL);
if (hr != S_OK) return STG_E_READFAULT;
- IUnknown_Release(object);
+ IUnknown_Release(data.object);
return S_OK;
}
diff --git a/dlls/ole32/tests/marshal.c b/dlls/ole32/tests/marshal.c
index 891df59c54b..e05ed937df2 100644
--- a/dlls/ole32/tests/marshal.c
+++ b/dlls/ole32/tests/marshal.c
@@ -3181,6 +3181,7 @@ static void test_freethreadedmarshaldata(IStream *pStream, MSHCTX mshctx, void *
static void test_freethreadedmarshaler(void)
{
+ DWORD size, expected_size;
HRESULT hr;
IUnknown *pFTUnknown;
IMarshal *pFTMarshal;
@@ -3201,6 +3202,13 @@ static void test_freethreadedmarshaler(void)
/* inproc normal marshaling */
+ size = 0;
+ expected_size = sizeof(DWORD) /* flags */ + sizeof(UINT64) + sizeof(GUID);
+ hr = IMarshal_GetMarshalSizeMax(pFTMarshal, &IID_IClassFactory, &Test_ClassFactory, MSHCTX_INPROC,
+ NULL, MSHLFLAGS_NORMAL, &size);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ ok(size == expected_size, "Unexpected marshal size %u, expected %u.\n", size, expected_size);
+
hr = IMarshal_GetUnmarshalClass(pFTMarshal, &IID_IClassFactory,
&Test_ClassFactory, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL, &clsid);
ok_ole_success(hr, IMarshal_GetUnmarshalClass);
--
2.33.0
More information about the wine-devel
mailing list