ntdll: Store all interface redirection data in context.

This commit is contained in:
Nikolay Sivov 2013-09-02 10:54:23 +04:00 committed by Alexandre Julliard
parent 3c0b7ba029
commit 9c44cb4f0f
2 changed files with 90 additions and 9 deletions

View File

@ -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}\""
" />"
" <comInterfaceExternalProxyStub "
" name=\"Iifaceps3\""
" tlbid=\"{99999999-8888-7777-6666-555555555558}\""
" iid=\"{86666666-8888-7777-6666-555555555555}\""
" numMethods=\"10\""
" baseInterface=\"{66666666-8888-7777-6666-555555555557}\""
" />"
"</assembly>";
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());

View File

@ -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
{