[PATCH 15/27] [Kernel32]: ActCtx: now parsing external proxy in
assemblies
Eric Pouech
eric.pouech at wanadoo.fr
Sat Apr 28 07:22:28 CDT 2007
A+
---
dlls/kernel32/actctx.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 64 insertions(+), 0 deletions(-)
diff --git a/dlls/kernel32/actctx.c b/dlls/kernel32/actctx.c
index 82588fc..f12f0d0 100644
--- a/dlls/kernel32/actctx.c
+++ b/dlls/kernel32/actctx.c
@@ -146,6 +146,8 @@ struct assembly
struct file_info manifest;
struct dll_redirect*dlls;
unsigned num_dlls;
+ unsigned num_entities;
+ struct entity* entities;
};
struct actctx
@@ -222,6 +224,8 @@ static struct assembly* add_assembly(str
assembly = &actctx->assemblies[actctx->num_assemblies++];
assembly->type = at;
+ assembly->num_entities = 0;
+ assembly->entities = NULL;
memset(&assembly->id, 0, sizeof(assembly->id));
assembly->num_dlls = 0;
assembly->dlls = 0;
@@ -288,6 +292,23 @@ static struct entity* add_entity(struct
return entity;
}
+static struct entity* add_entity_to_assembly(struct assembly* assembly, DWORD kind)
+{
+ struct entity* entity;
+
+ if (assembly->num_entities)
+ assembly->entities = HeapReAlloc(GetProcessHeap(), 0, assembly->entities,
+ (assembly->num_entities + 1) * sizeof(assembly->entities[0]));
+ else
+ assembly->entities = HeapAlloc(GetProcessHeap(), 0, sizeof(assembly->entities[0]));
+ if (!assembly->entities) return NULL;
+ entity = &assembly->entities[assembly->num_entities++];
+ memset(entity, 0, sizeof(*entity));
+ entity->kind = kind;
+
+ return entity;
+}
+
/***********************************************************************
* CreateActCtxA (KERNEL32.@)
*
@@ -379,6 +400,7 @@ #define WINDOWCLASS_ELEM
#define ELEM_END(elem) "/" elem
#define CLSID_ATTR "clsid"
+#define COMINTERFACEEXTERNALPROXYSTUB_ELEM "comInterfaceExternalProxyStub"
#define HASH_ATTR "hash"
#define HASHALG_ATTR "hashalg"
#define HELPDIR_ATTR "helpdir"
@@ -738,6 +760,39 @@ static BOOL parse_window_class_elem(xmlb
return ret;
}
+static BOOL parse_com_interface_external_proxy_stub_elem(xmlbuf_t* xmlbuf,
+ struct assembly* assembly)
+{
+ xmlstr_t attr_name, attr_value;
+ BOOL end = FALSE, error;
+ struct entity* entity;
+
+ entity = add_entity_to_assembly(assembly, ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION);
+ if (!entity) return FALSE;
+
+ while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end))
+ {
+ if (xmlstr_cmp(&attr_name, IID_ATTR))
+ {
+ entity->u.proxy.iid = xstrdupXW(&attr_value);
+ }
+ if (xmlstr_cmp(&attr_name, NAME_ATTR))
+ {
+ entity->u.proxy.name = xstrdupXW(&attr_value);
+ }
+ else
+ {
+ WARN("wrong attr %s=%s\n", debugstr_xmlstr(&attr_name),
+ debugstr_xmlstr(&attr_value));
+ return FALSE;
+ }
+ }
+
+ if (error || end) return end;
+ return parse_expect_elem(xmlbuf, ELEM_END(COMINTERFACEEXTERNALPROXYSTUB_ELEM)) &&
+ parse_end_element(xmlbuf);
+}
+
static BOOL parse_file_elem(xmlbuf_t* xmlbuf, struct assembly* assembly)
{
xmlstr_t attr_name, attr_value, elem;
@@ -956,6 +1011,10 @@ static BOOL parse_assembly_elem(xmlbuf_t
ret = parse_end_element(xmlbuf);
break;
}
+ else if (xmlstr_cmp(&elem, COMINTERFACEEXTERNALPROXYSTUB_ELEM))
+ {
+ ret = parse_com_interface_external_proxy_stub_elem(xmlbuf, assembly);
+ }
else if (xmlstr_cmp(&elem, DEPENDENCY_ELEM))
{
ret = parse_dependency_elem(xmlbuf, acl);
@@ -1501,6 +1560,11 @@ void WINAPI ReleaseActCtx(HANDLE hActCtx
HeapFree(GetProcessHeap(), 0, assembly->dlls);
HeapFree(GetProcessHeap(), 0, (void*)assembly->manifest.info);
free_assembly_identity(&assembly->id);
+ for (k = 0; k < assembly->num_entities; k++)
+ {
+ free_entity(&assembly->entities[k]);
+ }
+ HeapFree(GetProcessHeap(), 0, (void*)assembly->entities);
}
HeapFree(GetProcessHeap(), 0, actctx->assemblies);
HeapFree(GetProcessHeap(), 0, (void*)actctx->config.info);
More information about the wine-patches
mailing list