[PATCH 10/27] [Kernel32]: ActCtx: implemented the file elements from the manifest parsing

Eric Pouech eric.pouech at wanadoo.fr
Sat Apr 28 07:21:59 CDT 2007




A+
---

 dlls/kernel32/actctx.c |   87 ++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 84 insertions(+), 3 deletions(-)

diff --git a/dlls/kernel32/actctx.c b/dlls/kernel32/actctx.c
index 6de7c76..8100962 100644
--- a/dlls/kernel32/actctx.c
+++ b/dlls/kernel32/actctx.c
@@ -98,6 +98,11 @@ struct assembly_identity
     enum assembly_id_arch arch;
 };
 
+struct dll_redirect
+{
+    LPCWSTR             name;
+};
+
 enum assembly_type
 {
     APPLICATION_MANIFEST,
@@ -109,6 +114,8 @@ struct assembly
     enum assembly_type  type;
     struct assembly_identity    id;
     struct file_info    manifest;
+    struct dll_redirect*dlls;
+    unsigned            num_dlls;
 };
 
 struct actctx
@@ -182,10 +189,30 @@ static struct assembly* add_assembly(str
 
     assembly = &actctx->assemblies[actctx->num_assemblies++];
     assembly->type = at;
+    memset(&assembly->id, 0, sizeof(assembly->id));
+    assembly->num_dlls = 0;
+    assembly->dlls = 0;
 
     return assembly;
 }
 
+static struct dll_redirect* add_dll_redirect(struct assembly* assembly)
+{
+    struct dll_redirect* dll;
+
+    if (!assembly->num_dlls)
+        assembly->dlls = HeapAlloc(GetProcessHeap(), 0, sizeof(*dll));
+    else
+        assembly->dlls = HeapReAlloc(GetProcessHeap(), 0,
+                                     assembly->dlls,
+                                     (assembly->num_dlls + 1) * sizeof(*dll));
+    if (!assembly->dlls) return NULL;
+    dll = &assembly->dlls[assembly->num_dlls++];
+    dll->name = NULL;
+
+    return dll;
+}
+
 static BOOL add_dependent_assembly_id(struct actctx_loader* acl,
                                       struct assembly_identity* ai)
 {
@@ -289,6 +316,7 @@ #define ASSEMBLY_ELEM                   
 #define ASSEMBLYIDENTITY_ELEM           "assemblyIdentity"
 #define DEPENDENCY_ELEM                 "dependency"
 #define DEPENDENTASSEMBLY_ELEM          "dependentAssembly"
+#define FILE_ELEM                       "file"
 
 #define ELEM_END(elem) "/" elem
 
@@ -496,6 +524,49 @@ static BOOL parse_assembly_identity_elem
     return parse_expect_elem(xmlbuf, ELEM_END(ASSEMBLYIDENTITY_ELEM)) && parse_end_element(xmlbuf);
 }
 
+static BOOL parse_file_elem(xmlbuf_t* xmlbuf, struct assembly* assembly)
+{
+    xmlstr_t    attr_name, attr_value, elem;
+    BOOL        end = FALSE, error, ret = TRUE;
+    struct dll_redirect* dll;
+
+    if (!(dll = add_dll_redirect(assembly))) return FALSE;
+
+    while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end))
+    {
+        if (xmlstr_cmp(&attr_name, NAME_ATTR))
+        {
+            dll->name = xstrdupXW(&attr_value);
+            TRACE("name=%s\n", debugstr_xmlstr(&attr_value));
+        }
+        else
+        {
+            WARN("wrong attr %s=%s\n", debugstr_xmlstr(&attr_name),
+                 debugstr_xmlstr(&attr_value));
+            return FALSE;
+        }
+    }
+
+    if (error || !dll->name) return FALSE;
+    if (end) return TRUE;
+
+    while (ret && (ret = next_xml_elem(xmlbuf, &elem)))
+    {
+        if (xmlstr_cmp(&elem, ELEM_END(FILE_ELEM)))
+        {
+            ret = parse_end_element(xmlbuf);
+            break;
+        }
+        else
+        {
+            WARN("wrong elem %s\n", debugstr_xmlstr(&elem));
+            ret = FALSE;
+        }
+    }
+
+    return ret;
+}
+
 static BOOL parse_dependent_assembly_elem(xmlbuf_t* xmlbuf,
                                           struct actctx_loader* acl)
 {
@@ -637,6 +708,10 @@ static BOOL parse_assembly_elem(xmlbuf_t
         {
             ret = parse_dependency_elem(xmlbuf, acl);
         }
+        else if (xmlstr_cmp(&elem, FILE_ELEM))
+        {
+            ret = parse_file_elem(xmlbuf, assembly);
+        }
         else
         {
             WARN("wrong element %s\n", debugstr_xmlstr(&elem));
@@ -1059,12 +1134,18 @@ void WINAPI ReleaseActCtx(HANDLE hActCtx
     {
         if (--actctx->ref_count == 0)
         {
-            unsigned    i;
+            unsigned            i, j;
+            struct assembly*    assembly;
 
             for (i = 0; i < actctx->num_assemblies; i++)
             {
-                HeapFree(GetProcessHeap(), 0, (void*)actctx->assemblies[i].manifest.info);
-                free_assembly_identity(&actctx->assemblies[i].id);
+                assembly = &actctx->assemblies[i];
+                for (j = 0; j < assembly->num_dlls; j++)
+                {
+                    HeapFree(GetProcessHeap(), 0, (void*)assembly->dlls[j].name);
+                }
+                HeapFree(GetProcessHeap(), 0, (void*)assembly->manifest.info);
+                free_assembly_identity(&assembly->id);
             }
             HeapFree(GetProcessHeap(), 0, actctx->assemblies);
             HeapFree(GetProcessHeap(), 0, (void*)actctx->config.info);




More information about the wine-patches mailing list