Nikolay Sivov : ntdll: Skip context dependencies that have allowDelayedBinding attribute set.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Dec 31 15:59:34 CST 2014
Module: wine
Branch: master
Commit: 7a612654dc12d82429405ecf71c525fb4460b597
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7a612654dc12d82429405ecf71c525fb4460b597
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Wed Dec 31 20:55:55 2014 +0300
ntdll: Skip context dependencies that have allowDelayedBinding attribute set.
---
dlls/kernel32/tests/actctx.c | 35 +++++++++++++++++++++++++++++++++++
dlls/ntdll/actctx.c | 21 +++++++++++++++++----
2 files changed, 52 insertions(+), 4 deletions(-)
diff --git a/dlls/kernel32/tests/actctx.c b/dlls/kernel32/tests/actctx.c
index e30d985..60763b1 100644
--- a/dlls/kernel32/tests/actctx.c
+++ b/dlls/kernel32/tests/actctx.c
@@ -222,6 +222,17 @@ static const char manifest4[] =
"</dependency>"
"</assembly>";
+static const char manifest5[] =
+"<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\">"
+"<assemblyIdentity version=\"1.2.3.4\" name=\"Wine.Test\" type=\"win32\">"
+"</assemblyIdentity>"
+"<dependency>"
+" <dependentAssembly dependencyType=\"preRequisite\" allowDelayedBinding=\"true\">"
+" <assemblyIdentity name=\"Missing.Assembly\" version=\"1.0.0.0\" />"
+" </dependentAssembly>"
+"</dependency>"
+"</assembly>";
+
static const char testdep_manifest1[] =
"<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\">"
"<assemblyIdentity type=\"win32\" name=\"testdep\" version=\"6.5.4.3\" processorArchitecture=\"" ARCH "\"/>"
@@ -1728,6 +1739,29 @@ static void test_typelib_section(void)
pReleaseActCtx(handle);
}
+static void test_allowDelayedBinding(void)
+{
+ HANDLE handle;
+
+ if (!create_manifest_file("test5.manifest", manifest5, -1, NULL, NULL)) {
+ skip("Could not create manifest file\n");
+ return;
+ }
+
+ handle = test_create("test5.manifest");
+ if (handle == INVALID_HANDLE_VALUE) {
+ win_skip("allowDelayedBinding attribute is not supported.\n");
+ return;
+ }
+
+ DeleteFileA("test5.manifest");
+ DeleteFileA("testdep.manifest");
+ if (handle != INVALID_HANDLE_VALUE) {
+ test_basic_info(handle, __LINE__);
+ pReleaseActCtx(handle);
+ }
+}
+
static void test_actctx(void)
{
ULONG_PTR cookie;
@@ -1993,6 +2027,7 @@ static void test_actctx(void)
test_wndclass_section();
test_dllredirect_section();
test_typelib_section();
+ test_allowDelayedBinding();
}
static void test_app_manifest(void)
diff --git a/dlls/ntdll/actctx.c b/dlls/ntdll/actctx.c
index ba6378e..20a98ec 100644
--- a/dlls/ntdll/actctx.c
+++ b/dlls/ntdll/actctx.c
@@ -129,6 +129,7 @@ struct assembly_identity
WCHAR *type;
struct assembly_version version;
BOOL optional;
+ BOOL delayed;
};
struct strsection_header
@@ -2027,13 +2028,25 @@ static BOOL parse_clr_surrogate_elem(xmlbuf_t* xmlbuf, struct assembly* assembly
static BOOL parse_dependent_assembly_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl, BOOL optional)
{
struct assembly_identity ai;
- xmlstr_t elem;
- BOOL end = FALSE, ret = TRUE;
+ xmlstr_t elem, attr_name, attr_value;
+ BOOL end = FALSE, error = FALSE, ret = TRUE, delayed = FALSE;
- if (!parse_expect_no_attr(xmlbuf, &end) || end) return end;
+ while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end))
+ {
+ static const WCHAR allowDelayedBindingW[] = {'a','l','l','o','w','D','e','l','a','y','e','d','B','i','n','d','i','n','g',0};
+ static const WCHAR trueW[] = {'t','r','u','e',0};
+
+ if (xmlstr_cmp(&attr_name, allowDelayedBindingW))
+ delayed = xmlstr_cmp(&attr_value, trueW);
+ else
+ WARN("unknown attr %s=%s\n", debugstr_xmlstr(&attr_name), debugstr_xmlstr(&attr_value));
+ }
+
+ if (error || end) return end;
memset(&ai, 0, sizeof(ai));
ai.optional = optional;
+ ai.delayed = delayed;
if (!parse_expect_elem(xmlbuf, assemblyIdentityW, asmv1W) ||
!parse_assembly_identity_elem(xmlbuf, acl->actctx, &ai))
@@ -2914,7 +2927,7 @@ static NTSTATUS parse_depend_manifests(struct actctx_loader* acl)
{
if (lookup_assembly(acl, &acl->dependencies[i]) != STATUS_SUCCESS)
{
- if (!acl->dependencies[i].optional)
+ if (!acl->dependencies[i].optional && !acl->dependencies[i].delayed)
{
FIXME( "Could not find dependent assembly %s (%s)\n",
debugstr_w(acl->dependencies[i].name),
More information about the wine-cvs
mailing list