From: Vibhav Pant vibhavp@gmail.com
--- dlls/combase/tests/string.c | 34 ++++++++++++++-------------------- dlls/combase/usrmarshal.c | 29 +++++++++++++++++++++++++++-- 2 files changed, 41 insertions(+), 22 deletions(-)
diff --git a/dlls/combase/tests/string.c b/dlls/combase/tests/string.c index d09a232dadf..df15507c5a2 100644 --- a/dlls/combase/tests/string.c +++ b/dlls/combase/tests/string.c @@ -634,15 +634,14 @@ static void test_marshal(void) /* INPROC marshaling just consists of increasing the refcount and copying the address. */ ok(wire->hstring.str == str, "got unexpected address %p\n", wire->hstring.str); next = HSTRING_UserUnmarshal(&umcb.Flags, buffer, &str2); - if (size == exp_size) - todo_wine ok(next == &buffer[size], "got next %p != %p\n", next, &buffer[size]); - todo_wine ok(str2 == str, "got str2 %p != %p\n", str2, str); + ok(next == &buffer[size], "got next %p != %p\n", next, &buffer[size]); + ok(str2 == str, "got str2 %p != %p\n", str2, str); HSTRING_UserFree(&umcb.Flags, &str2);
wire->context = 0xdeadbeef; /* The context value is not validated. */ init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_INPROC); HSTRING_UserUnmarshal(&umcb.Flags, buffer, &str2); - todo_wine ok(str2 == str, "got str2 %p != %p\n", str2, str); + ok(str2 == str, "got str2 %p != %p\n", str2, str);
str2 = NULL; /* Test alignment */ @@ -658,9 +657,8 @@ static void test_marshal(void) ok(wire->context == exp_context, "got unexpected prefix %#lx != %#lx\n", wire->context, exp_context); ok(wire->hstring.str == str, "got unexpected address %p\n", wire->hstring.str); next = HSTRING_UserUnmarshal(&umcb.Flags, &buffer[1], &str2); - if (size == exp_size) - todo_wine ok(next == &buffer[size], "got next %p != %p\n", next, &buffer[size]); - todo_wine ok(str2 == str, "got str2 %p != %p\n", str2, str); + ok(next == &buffer[size], "got next %p != %p\n", next, &buffer[size]); + ok(str2 == str, "got str2 %p != %p\n", str2, str); HSTRING_UserFree(&umcb.Flags, &str2);
/* INPROC marshaling with empty/NULL HSTRING */ @@ -677,8 +675,7 @@ static void test_marshal(void) ok(!wire->hstring.str, "got unexpected address %p\n", wire->hstring.str); str2 = NULL; next = HSTRING_UserUnmarshal(&umcb.Flags, buffer, &str2); - if (size == exp_size) - todo_wine ok(next == &buffer[size], "got next %p != %p\n", next, &buffer[size]); + ok(next == &buffer[size], "got next %p != %p\n", next, &buffer[size]); ok(!str2, "got str2 %p\n", str2); HSTRING_UserFree(&umcb.Flags, &str2);
@@ -697,20 +694,19 @@ static void test_marshal(void) ok(!memcmp(wire->buf.data, str_buf, str_bytes), "got buf.data %s\n", debugstr_wn(wire->buf.data, str_bytes)); str2 = NULL; next = HSTRING_UserUnmarshal(&umcb.Flags, buffer, &str2); - if (size == exp_size) - todo_wine ok(next == &buffer[size], "got next %p != %p\n", next, &buffer[size]); + ok(next == &buffer[size], "got next %p != %p\n", next, &buffer[size]); /* A new HSTRING should be allocated */ - todo_wine_if(str2) ok(str2 != str, "got str2 %p\n", str2); + ok(str2 != str, "got str2 %p\n", str2); hr = WindowsCompareStringOrdinal(str2, str, &result); ok(hr == S_OK, "got hr %#lx\n", hr); - todo_wine ok(!result, "got str2 %s != %s\n", debugstr_hstring(str2), debugstr_hstring(str)); + ok(!result, "got str2 %s != %s\n", debugstr_hstring(str2), debugstr_hstring(str)); HSTRING_UserFree(&umcb.Flags, &str2);
init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL); wire->context = 0xdeadbeef; wire->buf.size = str_bytes - 1; HSTRING_UserUnmarshal(&umcb.Flags, buffer, &str2); - todo_wine ok(!wcscmp(WindowsGetStringRawBuffer(str2, NULL), L"marshal_test"), "got str2 %s\n", debugstr_hstring(str2)); + ok(!wcscmp(WindowsGetStringRawBuffer(str2, NULL), L"marshal_test"), "got str2 %s\n", debugstr_hstring(str2)); HSTRING_UserFree(&umcb.Flags, &str2);
init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL); @@ -726,13 +722,12 @@ static void test_marshal(void) ok(wire->context == exp_context, "got unexpected prefix %#lx != %#lx\n", wire->context, exp_context); ok(!memcmp(wire->buf.data, str_buf, str_bytes), "got buf.data %s\n", debugstr_wn(wire->buf.data, str_bytes)); next = HSTRING_UserUnmarshal(&umcb.Flags, &buffer[1], &str2); - if (size == exp_size) - todo_wine ok(next == &buffer[size], "got next %p != %p\n", next, &buffer[size]); - todo_wine_if(str2) ok(str2 != str, "got str2 %p\n", str2); + ok(next == &buffer[size], "got next %p != %p\n", next, &buffer[size]); + ok(str2 != str, "got str2 %p\n", str2); result = -1; hr = WindowsCompareStringOrdinal(str2, str, &result); ok(hr == S_OK, "got hr %#lx\n", hr); - todo_wine ok(!result, "got str2 %s != %s\n", debugstr_hstring(str2), debugstr_hstring(str)); + ok(!result, "got str2 %s != %s\n", debugstr_hstring(str2), debugstr_hstring(str)); HSTRING_UserFree(&umcb.Flags, &str2);
init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL); @@ -748,8 +743,7 @@ static void test_marshal(void) ok(!wire->buf.size, "got buf.size %lu\n", wire->buf.size); str2 = NULL; next = HSTRING_UserUnmarshal(&umcb.Flags, buffer, &str2); - if (size == exp_size) - todo_wine ok(next == &buffer[size], "got next %p != %p\n", next, &buffer[size]); + ok(next == &buffer[size], "got next %p != %p\n", next, &buffer[size]); ok(!str2, "got str2 %p\n", str2); HSTRING_UserFree(&umcb.Flags, &str2);
diff --git a/dlls/combase/usrmarshal.c b/dlls/combase/usrmarshal.c index 959ab323a4f..e7df6c2e003 100644 --- a/dlls/combase/usrmarshal.c +++ b/dlls/combase/usrmarshal.c @@ -1100,7 +1100,29 @@ BYTE * __RPC_USER HSTRING_UserMarshal(ULONG *flags, BYTE *buf, HSTRING *str) */ BYTE * __RPC_USER HSTRING_UserUnmarshal(ULONG *flags, BYTE *buf, HSTRING *str) { - FIXME("%p, %p, %p: stub\n", flags, buf, str); + const union hstring_wire *wire; + + TRACE("%p, %p, %p\n", debugstr_user_flags(flags), buf, str); + + wire = ALIGNED_POINTER(buf, 7); + if (LOWORD(*flags) == MSHCTX_INPROC) + { + *str = wire->hstring.str; + TRACE("str=%s\n", debugstr_hstring(*str)); + buf = (BYTE *)(&wire->hstring.str + 1); + } + else + { + UINT32 len; + HRESULT hr; + + len = wire->buf.size/sizeof(WCHAR); + hr = WindowsCreateString(wire->buf.data, len, str); + if (FAILED(hr)) + RpcRaiseException(HRESULT_CODE(hr)); + buf = (BYTE *)&wire->buf.data[len]; + } + return buf; }
@@ -1109,5 +1131,8 @@ BYTE * __RPC_USER HSTRING_UserUnmarshal(ULONG *flags, BYTE *buf, HSTRING *str) */ void __RPC_USER HSTRING_UserFree(ULONG *flags, HSTRING *str) { - FIXME("%p, %p: stub\n", flags, str); + TRACE("%s, %s.\n", debugstr_user_flags(flags), debugstr_hstring(*str)); + + if (LOWORD(*flags) == MSHCTX_INPROC) + WindowsDeleteString(*str); }