ntdll: Store all interface redirection data in context.
This commit is contained in:
parent
3c0b7ba029
commit
9c44cb4f0f
|
@ -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());
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue