[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