Wrong comparison in ntdll/actctx.c

nlataill nlataill at gmail.com
Mon Nov 19 14:25:25 CST 2007


Working on a D3D game, I have found that wine is refusing to load the
manifest file (when Windows does not fail).

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Copyright (c) 1981-2001 Microsoft Corporation -->
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity type="win32" name="Microsoft.VC80.OpenMP" version="
8.0.50727.42" processorArchitecture="x86"
    <file name="vcomp.dll" hash="0d009725bd5653af143fdfd9d8abf8adad533d16"

Adding verbosity to actctx.c, it seems that this game is requesting version
8.0.50608.0, which does match major.minor,
but not the whole version number (*major.minor.build.revision)*.

trace:actctx:parse_assembly_identity_elem name=L"Microsoft.VC80.OpenMP"
version=8.0.50727.42 arch=L"x86"
fixme:actctx:parse_assembly_elem VERBOSE: wrong version FOUND: 8/0/50727/42
fixme:actctx:parse_assembly_elem VERBOSE: wrong version EXP: 8/0/50608/0
fixme:actctx:parse_manifest_buffer failed to parse manifest L"C:\\Program
fixme:actctx:parse_depend_manifests Could not find dependent assembly L"

According to MSDN, it seems only major.minor is considered for version
- http://msdn2.microsoft.com/en-us/library/aa374234.aspx : A version number
that changes only in the *build* or *revision* parts indicates that the
assembly is backward compatible with prior versions.
- http://msdn2.microsoft.com/en-us/library/aa375365.aspx: [...] are
manifests used to redirect the version of a side-by-side assembly to another
compatible version. The version that the assembly is being redirected to
should have the same major.minor values as the original version.

I am proposing the following one-liner to ntdll/actctx.c:

isa at isa:~/downloads/tmp$ diff -u wine-0.9.49/dlls/ntdll/actctx.c
--- wine-0.9.49/dlls/ntdll/actctx.c     2007-11-09 17:56:12.000000000 +0100
+++ /home/isa/downloads/wine-0.9.49/dlls/ntdll/actctx.c 2007-11-19 21:07:
35.000000000 +0100
@@ -1390,8 +1390,8 @@
         if (expected_ai)
             /* FIXME: more tests */
-            if (assembly->type == ASSEMBLY_MANIFEST &&
-                memcmp(&assembly->id.version, &expected_ai->version,
+            if (assembly->type == ASSEMBLY_MANIFEST &&
+                ((assembly->id.version.major != expected_ai->version.major)
|| (assembly->id.version.minor != expected_ai->version.minor)) )
                 FIXME("wrong version\n");
                 return FALSE;

With this patch, the manifest (and related DLL) is loading correctly.
This does not prevent my game die shortly after, in D3D code this time.
Still work to do ;-)


Norbert Lataille
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.winehq.org/pipermail/wine-devel/attachments/20071119/79b31547/attachment.htm 

More information about the wine-devel mailing list