Jacek Caban : ntdll: Added parsing of file elements in manifests.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Jul 20 06:02:07 CDT 2007
Module: wine
Branch: master
Commit: 16066acf8708716bb7944d53fe56941dccb4fd26
URL: http://source.winehq.org/git/wine.git/?a=commit;h=16066acf8708716bb7944d53fe56941dccb4fd26
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Jul 19 17:51:42 2007 +0200
ntdll: Added parsing of file elements in manifests.
---
dlls/ntdll/actctx.c | 93 +++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 90 insertions(+), 3 deletions(-)
diff --git a/dlls/ntdll/actctx.c b/dlls/ntdll/actctx.c
index f785ae7..352b483 100644
--- a/dlls/ntdll/actctx.c
+++ b/dlls/ntdll/actctx.c
@@ -94,6 +94,11 @@ struct assembly_identity
enum assembly_id_type type;
};
+struct dll_redirect
+{
+ WCHAR *name;
+};
+
enum assembly_type
{
APPLICATION_MANIFEST,
@@ -105,6 +110,9 @@ struct assembly
enum assembly_type type;
struct assembly_identity id;
struct file_info manifest;
+ struct dll_redirect *dlls;
+ unsigned int num_dlls;
+ unsigned int allocated_dlls;
};
typedef struct _ACTIVATION_CONTEXT
@@ -130,6 +138,7 @@ struct actctx_loader
#define ASSEMBLYIDENTITY_ELEM "assemblyIdentity"
#define DEPENDENCY_ELEM "dependency"
#define DEPENDENTASSEMBLY_ELEM "dependentAssembly"
+#define FILE_ELEM "file"
#define ELEM_END(elem) "/" elem
@@ -213,6 +222,30 @@ static struct assembly *add_assembly(ACTIVATION_CONTEXT *actctx, enum assembly_t
return assembly;
}
+static struct dll_redirect* add_dll_redirect(struct assembly* assembly)
+{
+ if (assembly->num_dlls == assembly->allocated_dlls)
+ {
+ void *ptr;
+ unsigned int new_count;
+ if (assembly->dlls)
+ {
+ new_count = assembly->allocated_dlls * 2;
+ ptr = RtlReAllocateHeap( GetProcessHeap(), HEAP_ZERO_MEMORY,
+ assembly->dlls, new_count * sizeof(*assembly->dlls) );
+ }
+ else
+ {
+ new_count = 4;
+ ptr = RtlAllocateHeap( GetProcessHeap(), HEAP_ZERO_MEMORY, new_count * sizeof(*assembly->dlls) );
+ }
+ if (!ptr) return NULL;
+ assembly->dlls = ptr;
+ assembly->allocated_dlls = new_count;
+ }
+ return &assembly->dlls[assembly->num_dlls++];
+}
+
static void free_assembly_identity(struct assembly_identity *ai)
{
RtlFreeHeap( GetProcessHeap(), 0, ai->name );
@@ -278,12 +311,19 @@ static void actctx_release( ACTIVATION_CONTEXT *actctx )
{
if (interlocked_xchg_add( &actctx->ref_count, -1 ) == 1)
{
- unsigned int i;
+ unsigned int i, j;
for (i = 0; i < actctx->num_assemblies; i++)
{
- RtlFreeHeap( GetProcessHeap(), 0, actctx->assemblies[i].manifest.info );
- free_assembly_identity(&actctx->assemblies[i].id);
+ struct assembly *assembly = &actctx->assemblies[i];
+ for (j = 0; j < assembly->num_dlls; j++)
+ {
+ struct dll_redirect *dll = &assembly->dlls[j];
+ RtlFreeHeap( GetProcessHeap(), 0, dll->name );
+ }
+ RtlFreeHeap( GetProcessHeap(), 0, assembly->dlls );
+ RtlFreeHeap( GetProcessHeap(), 0, assembly->manifest.info );
+ free_assembly_identity(&assembly->id);
}
RtlFreeHeap( GetProcessHeap(), 0, actctx->config.info );
RtlFreeHeap( GetProcessHeap(), 0, actctx->appdir.info );
@@ -560,6 +600,49 @@ static BOOL parse_dependency_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl)
return ret;
}
+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))
+ {
+ if (!(dll->name = xmlstrdupW(&attr_value))) return FALSE;
+ 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_assembly_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl,
struct assembly* assembly,
struct assembly_identity* expected_ai)
@@ -633,6 +716,10 @@ static BOOL parse_assembly_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl,
{
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));
More information about the wine-cvs
mailing list