Hans Leidekker : fusion: Assembly version must be taken from the metadata, not the file version.

Alexandre Julliard julliard at winehq.org
Thu Feb 19 09:18:50 CST 2009


Module: wine
Branch: master
Commit: fdfeb33f37db5e2dd035aaab5da6842bb890a856
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=fdfeb33f37db5e2dd035aaab5da6842bb890a856

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Thu Feb 19 14:03:22 2009 +0100

fusion: Assembly version must be taken from the metadata, not the file version.

Office 2007 SP1 installer depends on this. I will supply a test as
soon as I figure out how to create a variation of the test assembly
in dlls/fusion/tests/asmcache.c.

---

 dlls/fusion/assembly.c |   46 ++++++++++++++--------------------------------
 1 files changed, 14 insertions(+), 32 deletions(-)

diff --git a/dlls/fusion/assembly.c b/dlls/fusion/assembly.c
index 7be541c..2373d0f 100644
--- a/dlls/fusion/assembly.c
+++ b/dlls/fusion/assembly.c
@@ -793,45 +793,27 @@ HRESULT assembly_get_path(ASSEMBLY *assembly, LPSTR *path)
 
 HRESULT assembly_get_version(ASSEMBLY *assembly, LPSTR *version)
 {
-    LPSTR verdata;
-    VS_FIXEDFILEINFO *ffi;
-    HRESULT hr = S_OK;
-    DWORD size;
+    ASSEMBLYTABLE *asmtbl;
+    LONG offset;
 
-    size = GetFileVersionInfoSizeA(assembly->path, NULL);
-    if (!size)
-        return HRESULT_FROM_WIN32(GetLastError());
+    *version = NULL;
 
-    verdata = HeapAlloc(GetProcessHeap(), 0, size);
-    if (!verdata)
-        return E_OUTOFMEMORY;
-
-    if (!GetFileVersionInfoA(assembly->path, 0, size, verdata))
-    {
-        hr = HRESULT_FROM_WIN32(GetLastError());
-        goto done;
-    }
+    offset = assembly->tables[TableFromToken(mdtAssembly)].offset;
+    if (offset == -1)
+        return E_FAIL;
 
-    if (!VerQueryValueA(verdata, "\\", (LPVOID *)&ffi, &size))
-    {
-        hr = HRESULT_FROM_WIN32(GetLastError());
-        goto done;
-    }
+    asmtbl = assembly_data_offset(assembly, offset);
+    if (!asmtbl)
+        return E_FAIL;
 
-    *version = HeapAlloc(GetProcessHeap(), 0, MAX_PATH);
+    *version = HeapAlloc(GetProcessHeap(), 0, sizeof("%u.%u.%u.%u") + 4 * strlen("65535"));
     if (!*version)
-    {
-        hr = E_OUTOFMEMORY;
-        goto done;
-    }
+        return E_OUTOFMEMORY;
 
-    sprintf(*version, "%d.%d.%d.%d", HIWORD(ffi->dwFileVersionMS),
-            LOWORD(ffi->dwFileVersionMS), HIWORD(ffi->dwFileVersionLS),
-            LOWORD(ffi->dwFileVersionLS));
+    sprintf(*version, "%u.%u.%u.%u", asmtbl->MajorVersion, asmtbl->MinorVersion,
+            asmtbl->BuildNumber, asmtbl->RevisionNumber);
 
-done:
-    HeapFree(GetProcessHeap(), 0, verdata);
-    return hr;
+    return S_OK;
 }
 
 HRESULT assembly_get_architecture(ASSEMBLY *assembly, DWORD fixme)




More information about the wine-cvs mailing list