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_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_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_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);
|
DEFINE_GUID(IID_PS32, 0x66666666, 0x8888, 0x7777, 0x66, 0x66, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56);
|
||||||
|
|
||||||
static const char manifest3[] =
|
static const char manifest3[] =
|
||||||
|
@ -129,6 +130,13 @@ static const char manifest3[] =
|
||||||
" numMethods=\"10\""
|
" numMethods=\"10\""
|
||||||
" baseInterface=\"{66666666-8888-7777-6666-555555555557}\""
|
" 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>";
|
"</assembly>";
|
||||||
|
|
||||||
static const char manifest_wndcls1[] =
|
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_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_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_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();
|
test_find_string_fail();
|
||||||
b = pDeactivateActCtx(0, cookie);
|
b = pDeactivateActCtx(0, cookie);
|
||||||
ok(b, "DeactivateActCtx failed: %u\n", GetLastError());
|
ok(b, "DeactivateActCtx failed: %u\n", GetLastError());
|
||||||
|
|
|
@ -242,6 +242,12 @@ struct comclassredirect_data
|
||||||
DWORD miscstatusdocprint;
|
DWORD miscstatusdocprint;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum ifaceps_mask
|
||||||
|
{
|
||||||
|
NumMethods = 1,
|
||||||
|
BaseIface = 2
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
Sections structure.
|
Sections structure.
|
||||||
|
@ -339,8 +345,13 @@ struct entity
|
||||||
} comclass;
|
} comclass;
|
||||||
struct {
|
struct {
|
||||||
WCHAR *iid;
|
WCHAR *iid;
|
||||||
|
WCHAR *base;
|
||||||
|
WCHAR *tlib;
|
||||||
WCHAR *name;
|
WCHAR *name;
|
||||||
} proxy;
|
WCHAR *ps32; /* only stored for 'comInterfaceExternalProxyStub' */
|
||||||
|
DWORD mask;
|
||||||
|
ULONG nummethods;
|
||||||
|
} ifaceps;
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
WCHAR *name;
|
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 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 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 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 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};
|
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);
|
RtlFreeHeap(GetProcessHeap(), 0, entity->u.comclass.progid);
|
||||||
break;
|
break;
|
||||||
case ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION:
|
case ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION:
|
||||||
RtlFreeHeap(GetProcessHeap(), 0, entity->u.proxy.iid);
|
RtlFreeHeap(GetProcessHeap(), 0, entity->u.ifaceps.iid);
|
||||||
RtlFreeHeap(GetProcessHeap(), 0, entity->u.proxy.name);
|
RtlFreeHeap(GetProcessHeap(), 0, entity->u.ifaceps.base);
|
||||||
|
RtlFreeHeap(GetProcessHeap(), 0, entity->u.ifaceps.ps32);
|
||||||
|
RtlFreeHeap(GetProcessHeap(), 0, entity->u.ifaceps.name);
|
||||||
break;
|
break;
|
||||||
case ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION:
|
case ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION:
|
||||||
RtlFreeHeap(GetProcessHeap(), 0, entity->u.typelib.tlbid);
|
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;
|
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)
|
static BOOL parse_cominterface_proxy_stub_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll)
|
||||||
{
|
{
|
||||||
xmlstr_t attr_name, attr_value;
|
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 (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
|
else
|
||||||
{
|
{
|
||||||
|
@ -1646,11 +1700,29 @@ static BOOL parse_com_interface_external_proxy_stub_elem(xmlbuf_t* xmlbuf,
|
||||||
{
|
{
|
||||||
if (xmlstr_cmp(&attr_name, iidW))
|
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
|
else
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue