From 9c44cb4f0f3192ac14ee271a9bb60b9aef33aa0b Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Mon, 2 Sep 2013 10:54:23 +0400 Subject: [PATCH] ntdll: Store all interface redirection data in context. --- dlls/kernel32/tests/actctx.c | 9 ++++ dlls/ntdll/actctx.c | 90 ++++++++++++++++++++++++++++++++---- 2 files changed, 90 insertions(+), 9 deletions(-) diff --git a/dlls/kernel32/tests/actctx.c b/dlls/kernel32/tests/actctx.c index 059ce4423af..f764f7abda1 100644 --- a/dlls/kernel32/tests/actctx.c +++ b/dlls/kernel32/tests/actctx.c @@ -92,6 +92,7 @@ DEFINE_GUID(IID_TlibTest4, 0x99999999, 0x8888, 0x7777, 0x66, 0x66, 0x55, 0x55, 0 DEFINE_GUID(IID_Iifaceps, 0x66666666, 0x8888, 0x7777, 0x66, 0x66, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55); 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_PS32, 0x66666666, 0x8888, 0x7777, 0x66, 0x66, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56); static const char manifest3[] = @@ -129,6 +130,13 @@ static const char manifest3[] = " numMethods=\"10\"" " baseInterface=\"{66666666-8888-7777-6666-555555555557}\"" " />" +" " ""; static const char manifest_wndcls1[] = @@ -1629,6 +1637,7 @@ static void test_actctx(void) test_find_com_redirection(handle, &IID_CoTest, &IID_TlibTest, 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__); test_find_string_fail(); b = pDeactivateActCtx(0, cookie); ok(b, "DeactivateActCtx failed: %u\n", GetLastError()); diff --git a/dlls/ntdll/actctx.c b/dlls/ntdll/actctx.c index adc1ec0dcfc..c2fec116e19 100644 --- a/dlls/ntdll/actctx.c +++ b/dlls/ntdll/actctx.c @@ -242,6 +242,12 @@ struct comclassredirect_data DWORD miscstatusdocprint; }; +enum ifaceps_mask +{ + NumMethods = 1, + BaseIface = 2 +}; + /* Sections structure. @@ -339,8 +345,13 @@ struct entity } comclass; struct { WCHAR *iid; + WCHAR *base; + WCHAR *tlib; WCHAR *name; - } proxy; + WCHAR *ps32; /* only stored for 'comInterfaceExternalProxyStub' */ + DWORD mask; + ULONG nummethods; + } ifaceps; struct { WCHAR *name; @@ -478,6 +489,9 @@ static const WCHAR miscstatusiconW[] = {'m','i','s','c','S','t','a','t','u','s', static const WCHAR miscstatuscontentW[] = {'m','i','s','c','S','t','a','t','u','s','C','o','n','t','e','n','t',0}; static const WCHAR miscstatusthumbnailW[] = {'m','i','s','c','S','t','a','t','u','s','T','h','u','m','b','n','a','i','l',0}; static const WCHAR miscstatusdocprintW[] = {'m','i','s','c','S','t','a','t','u','s','D','o','c','P','r','i','n','t',0}; +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 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}; @@ -722,8 +736,10 @@ static void free_entity_array(struct entity_array *array) RtlFreeHeap(GetProcessHeap(), 0, entity->u.comclass.progid); break; case ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION: - RtlFreeHeap(GetProcessHeap(), 0, entity->u.proxy.iid); - RtlFreeHeap(GetProcessHeap(), 0, entity->u.proxy.name); + RtlFreeHeap(GetProcessHeap(), 0, entity->u.ifaceps.iid); + RtlFreeHeap(GetProcessHeap(), 0, entity->u.ifaceps.base); + RtlFreeHeap(GetProcessHeap(), 0, entity->u.ifaceps.ps32); + RtlFreeHeap(GetProcessHeap(), 0, entity->u.ifaceps.name); break; case ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION: RtlFreeHeap(GetProcessHeap(), 0, entity->u.typelib.tlbid); @@ -1377,6 +1393,26 @@ static BOOL parse_com_class_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll, str return ret; } +static BOOL parse_nummethods(const xmlstr_t *str, struct entity *entity) +{ + const WCHAR *curr; + ULONG num = 0; + + for (curr = str->ptr; curr < str->ptr + str->len; curr++) + { + if (*curr >= '0' && *curr <= '9') + num = num * 10 + *curr - '0'; + else + { + ERR("wrong numeric value %s\n", debugstr_xmlstr(str)); + return FALSE; + } + } + entity->u.ifaceps.nummethods = num; + + return TRUE; +} + static BOOL parse_cominterface_proxy_stub_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll) { xmlstr_t attr_name, attr_value; @@ -1390,11 +1426,29 @@ static BOOL parse_cominterface_proxy_stub_elem(xmlbuf_t* xmlbuf, struct dll_redi { if (xmlstr_cmp(&attr_name, iidW)) { - if (!(entity->u.proxy.iid = xmlstrdupW(&attr_value))) return FALSE; + if (!(entity->u.ifaceps.iid = xmlstrdupW(&attr_value))) return FALSE; } - if (xmlstr_cmp(&attr_name, nameW)) + else if (xmlstr_cmp(&attr_name, nameW)) + { + if (!(entity->u.ifaceps.name = xmlstrdupW(&attr_value))) return FALSE; + } + else if (xmlstr_cmp(&attr_name, baseInterfaceW)) + { + if (!(entity->u.ifaceps.base = xmlstrdupW(&attr_value))) return FALSE; + entity->u.ifaceps.mask |= BaseIface; + } + else if (xmlstr_cmp(&attr_name, nummethodsW)) + { + if (!(parse_nummethods(&attr_value, entity))) return FALSE; + entity->u.ifaceps.mask |= NumMethods; + } + else if (xmlstr_cmp(&attr_name, tlbidW)) + { + if (!(entity->u.ifaceps.tlib = xmlstrdupW(&attr_value))) return FALSE; + } + /* not used */ + else if (xmlstr_cmp(&attr_name, proxyStubClsid32W) || xmlstr_cmp(&attr_name, threadingmodelW)) { - if (!(entity->u.proxy.name = xmlstrdupW(&attr_value))) return FALSE; } else { @@ -1646,11 +1700,29 @@ static BOOL parse_com_interface_external_proxy_stub_elem(xmlbuf_t* xmlbuf, { if (xmlstr_cmp(&attr_name, iidW)) { - if (!(entity->u.proxy.iid = xmlstrdupW(&attr_value))) return FALSE; + if (!(entity->u.ifaceps.iid = xmlstrdupW(&attr_value))) return FALSE; } - if (xmlstr_cmp(&attr_name, nameW)) + else if (xmlstr_cmp(&attr_name, nameW)) { - if (!(entity->u.proxy.name = xmlstrdupW(&attr_value))) return FALSE; + if (!(entity->u.ifaceps.name = xmlstrdupW(&attr_value))) return FALSE; + } + else if (xmlstr_cmp(&attr_name, baseInterfaceW)) + { + if (!(entity->u.ifaceps.base = xmlstrdupW(&attr_value))) return FALSE; + entity->u.ifaceps.mask |= BaseIface; + } + else if (xmlstr_cmp(&attr_name, nummethodsW)) + { + if (!(parse_nummethods(&attr_value, entity))) return FALSE; + entity->u.ifaceps.mask |= NumMethods; + } + else if (xmlstr_cmp(&attr_name, proxyStubClsid32W)) + { + if (!(entity->u.ifaceps.ps32 = xmlstrdupW(&attr_value))) return FALSE; + } + else if (xmlstr_cmp(&attr_name, tlbidW)) + { + if (!(entity->u.ifaceps.tlib = xmlstrdupW(&attr_value))) return FALSE; } else {