From 5b38a1316757730b818d0f70b52f00a2a58123e1 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Mon, 2 Sep 2013 11:04:17 +0400 Subject: [PATCH] ntdll: Store clrSurrogate version value, added some tests. --- dlls/kernel32/tests/actctx.c | 82 ++++++++++++++++++++++++++++++++++++++++++++ dlls/ntdll/actctx.c | 7 ++++ 2 files changed, 89 insertions(+) diff --git a/dlls/kernel32/tests/actctx.c b/dlls/kernel32/tests/actctx.c index def61da955e..37676d26aa8 100644 --- a/dlls/kernel32/tests/actctx.c +++ b/dlls/kernel32/tests/actctx.c @@ -93,6 +93,7 @@ DEFINE_GUID(IID_Iifaceps, 0x66666666, 0x8888, 0x7777, 0x66, 0x66, 0x55, 0x55, 0 DEFINE_GUID(IID_Ibifaceps, 0x66666666, 0x8888, 0x7777, 0x66, 0x66, 0x55, 0x55, 0x55, 0x55, 0x55, 0x57); DEFINE_GUID(IID_Iifaceps2, 0x76666666, 0x8888, 0x7777, 0x66, 0x66, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55); DEFINE_GUID(IID_Iifaceps3, 0x86666666, 0x8888, 0x7777, 0x66, 0x66, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55); +DEFINE_GUID(IID_Iiface, 0x96666666, 0x8888, 0x7777, 0x66, 0x66, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55); DEFINE_GUID(IID_PS32, 0x66666666, 0x8888, 0x7777, 0x66, 0x66, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56); static const char manifest3[] = @@ -137,6 +138,11 @@ static const char manifest3[] = " numMethods=\"10\"" " baseInterface=\"{66666666-8888-7777-6666-555555555557}\"" " />" +" " ""; static const char manifest_wndcls1[] = @@ -1311,6 +1317,78 @@ static void test_find_ifaceps_redirection(HANDLE handle, const GUID *iid, const data.ulAssemblyRosterIndex, exid); } +struct clrsurrogate_data +{ + ULONG size; + DWORD res; + GUID clsid; + ULONG version_offset; + ULONG version_len; + ULONG name_offset; + ULONG name_len; +}; + +static void test_find_surrogate(HANDLE handle, const GUID *clsid, const WCHAR *name, const WCHAR *version, + ULONG exid, int line) +{ + struct clrsurrogate_data *surrogate; + ACTCTX_SECTION_KEYED_DATA data; + BOOL ret; + + memset(&data, 0xfe, sizeof(data)); + data.cbSize = sizeof(data); + + ret = pFindActCtxSectionGuid(0, NULL, + ACTIVATION_CONTEXT_SECTION_CLR_SURROGATES, + clsid, &data); + if (!ret) + { + skip("surrogate sections are not supported\n"); + return; + } + ok_(__FILE__, line)(ret, "FindActCtxSectionGuid failed: %u\n", GetLastError()); + + surrogate = (struct clrsurrogate_data*)data.lpData; + + ok_(__FILE__, line)(data.cbSize == sizeof(data), "data.cbSize=%u\n", data.cbSize); + ok_(__FILE__, line)(data.ulDataFormatVersion == 1, "data.ulDataFormatVersion=%u\n", data.ulDataFormatVersion); + ok_(__FILE__, line)(data.lpData != NULL, "data.lpData == NULL\n"); + ok_(__FILE__, line)(surrogate->size == sizeof(*surrogate), "got %d for header size\n", surrogate->size); + if (data.lpData && surrogate->size == sizeof(*surrogate)) + { + WCHAR *ptrW; + ULONG len; + + ok_(__FILE__, line)(surrogate->res == 0, "invalid res value %d\n", surrogate->res); + ok_(__FILE__, line)(IsEqualGUID(&surrogate->clsid, clsid), "got wrong clsid %s\n", debugstr_guid(&surrogate->clsid)); + + ok_(__FILE__, line)(surrogate->version_len == lstrlenW(version)*sizeof(WCHAR), "got version len %d\n", surrogate->version_len); + ok_(__FILE__, line)(surrogate->version_offset == surrogate->size, "got version offset %d\n", surrogate->version_offset); + + ok_(__FILE__, line)(surrogate->name_len == lstrlenW(name)*sizeof(WCHAR), "got name len %d\n", surrogate->name_len); + ok_(__FILE__, line)(surrogate->name_offset > 0, "got name offset %d\n", surrogate->name_offset); + + len = surrogate->size + surrogate->name_len + surrogate->version_len + 2*sizeof(WCHAR); + ok_(__FILE__, line)(data.ulLength == len, "got wrong data length %d, expected %d\n", data.ulLength, len); + + ptrW = (WCHAR*)((BYTE*)surrogate + surrogate->name_offset); + ok(!lstrcmpW(ptrW, name), "got wrong name %s\n", wine_dbgstr_w(ptrW)); + + ptrW = (WCHAR*)((BYTE*)surrogate + surrogate->version_offset); + ok(!lstrcmpW(ptrW, version), "got wrong name %s\n", wine_dbgstr_w(ptrW)); + } + + ok_(__FILE__, line)(data.lpSectionGlobalData == NULL, "data.lpSectionGlobalData != NULL\n"); + ok_(__FILE__, line)(data.ulSectionGlobalDataLength == 0, "data.ulSectionGlobalDataLength=%u\n", + data.ulSectionGlobalDataLength); + ok_(__FILE__, line)(data.lpSectionBase != NULL, "data.lpSectionBase == NULL\n"); + ok_(__FILE__, line)(data.ulSectionTotalLength > 0, "data.ulSectionTotalLength=%u\n", + data.ulSectionTotalLength); + ok_(__FILE__, line)(data.hActCtx == NULL, "data.hActCtx=%p\n", data.hActCtx); + ok_(__FILE__, line)(data.ulAssemblyRosterIndex == exid, "data.ulAssemblyRosterIndex=%u, expected %u\n", + data.ulAssemblyRosterIndex, exid); +} + static void test_wndclass_section(void) { static const WCHAR cls1W[] = {'1','.','2','.','3','.','4','!','w','n','d','C','l','a','s','s','1',0}; @@ -1624,6 +1702,9 @@ static void test_actctx(void) handle = test_create("test3.manifest"); DeleteFileA("test3.manifest"); if(handle != INVALID_HANDLE_VALUE) { + static const WCHAR nameW[] = {'t','e','s','t','s','u','r','r','o','g','a','t','e',0}; + static const WCHAR versionW[] = {'v','2','.','0','.','5','0','7','2','7',0}; + test_basic_info(handle, __LINE__); test_detailed_info(handle, &detailed_info1, __LINE__); test_info_in_assembly(handle, 1, &manifest3_info, __LINE__); @@ -1634,6 +1715,7 @@ static void test_actctx(void) test_find_dll_redirection(handle, testlib_dll, 1, __LINE__); test_find_dll_redirection(handle, testlib_dll, 1, __LINE__); test_find_com_redirection(handle, &IID_CoTest, &IID_TlibTest, 1, __LINE__); + test_find_surrogate(handle, &IID_Iiface, nameW, versionW, 1, __LINE__); test_find_ifaceps_redirection(handle, &IID_Iifaceps, &IID_TlibTest4, &IID_Ibifaceps, NULL, 1, __LINE__); test_find_ifaceps_redirection(handle, &IID_Iifaceps2, &IID_TlibTest4, &IID_Ibifaceps, &IID_PS32, 1, __LINE__); test_find_ifaceps_redirection(handle, &IID_Iifaceps3, &IID_TlibTest4, &IID_Ibifaceps, NULL, 1, __LINE__); diff --git a/dlls/ntdll/actctx.c b/dlls/ntdll/actctx.c index 6458b06e635..750ca50a09e 100644 --- a/dlls/ntdll/actctx.c +++ b/dlls/ntdll/actctx.c @@ -393,6 +393,7 @@ struct entity { WCHAR *name; WCHAR *clsid; + WCHAR *version; } clrsurrogate; } u; }; @@ -521,6 +522,7 @@ static const WCHAR miscstatusdocprintW[] = {'m','i','s','c','S','t','a','t','u', static const WCHAR baseInterfaceW[] = {'b','a','s','e','I','n','t','e','r','f','a','c','e',0}; static const WCHAR nummethodsW[] = {'n','u','m','M','e','t','h','o','d','s',0}; static const WCHAR proxyStubClsid32W[] = {'p','r','o','x','y','S','t','u','b','C','l','s','i','d','3','2',0}; +static const WCHAR runtimeVersionW[] = {'r','u','n','t','i','m','e','V','e','r','s','i','o','n',0}; static const WCHAR activatewhenvisibleW[] = {'a','c','t','i','v','a','t','e','w','h','e','n','v','i','s','i','b','l','e',0}; static const WCHAR actslikebuttonW[] = {'a','c','t','s','l','i','k','e','b','u','t','t','o','n',0}; @@ -784,6 +786,7 @@ static void free_entity_array(struct entity_array *array) case ACTIVATION_CONTEXT_SECTION_CLR_SURROGATES: RtlFreeHeap(GetProcessHeap(), 0, entity->u.clrsurrogate.name); RtlFreeHeap(GetProcessHeap(), 0, entity->u.clrsurrogate.clsid); + RtlFreeHeap(GetProcessHeap(), 0, entity->u.clrsurrogate.version); break; default: FIXME("Unknown entity kind %d\n", entity->kind); @@ -1819,6 +1822,10 @@ static BOOL parse_clr_surrogate_elem(xmlbuf_t* xmlbuf, struct assembly* assembly { if (!(entity->u.clrsurrogate.clsid = xmlstrdupW(&attr_value))) return FALSE; } + else if (xmlstr_cmp(&attr_name, runtimeVersionW)) + { + if (!(entity->u.clrsurrogate.version = xmlstrdupW(&attr_value))) return FALSE; + } else { WARN("unknown attr %s=%s\n", debugstr_xmlstr(&attr_name), debugstr_xmlstr(&attr_value)); -- 2.11.4.GIT