>From 08c17f0e2db536b9ba3b2d841ab73c53781e0f3d Mon Sep 17 00:00:00 2001
From: Paul Vriens <Paul.Vriens.Wine@gmail.com>
Date: Tue, 3 Feb 2009 12:21:31 +0100
Subject: [PATCH] Make sure we can test .NET dlls on Windows

---
 programs/winetest/main.c |   78 ++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 75 insertions(+), 3 deletions(-)

diff --git a/programs/winetest/main.c b/programs/winetest/main.c
index fc7a378..2df01f2 100644
--- a/programs/winetest/main.c
+++ b/programs/winetest/main.c
@@ -113,6 +113,52 @@ static char * get_file_version(char * file_name)
     return version;
 }
 
+static BOOL get_dotnet_file_version(char * file_name, char * file_version)
+{
+    HRESULT (WINAPI *pLoadLibraryShim)(LPCWSTR, LPCWSTR, LPVOID, HMODULE *);
+    HRESULT (WINAPI *pGetCORSystemDirectory)(LPWSTR, DWORD, DWORD *);
+    HRESULT hr;
+    HMODULE hmscoree, hdll;
+    static char version[32];
+    char dllnameA[MAX_PATH];
+    WCHAR dllnameW[MAX_PATH];
+    WCHAR dirW[MAX_PATH];
+    DWORD len;
+    BOOL ret = FALSE;
+
+    sprintf(version, "failed");
+
+    hmscoree = LoadLibraryA("mscoree.dll");
+    if (!hmscoree)
+        goto done;
+
+    pLoadLibraryShim = (void *)GetProcAddress(hmscoree, "LoadLibraryShim");
+    pGetCORSystemDirectory = (void *)GetProcAddress(hmscoree, "GetCORSystemDirectory");
+    if (!pLoadLibraryShim || !pGetCORSystemDirectory)
+        goto done;
+
+    strcpy(dllnameA, file_name);
+    strcat(dllnameA, ".dll");
+    MultiByteToWideChar(CP_ACP, 0, dllnameA, -1, dllnameW, MAX_PATH);
+    hr = pLoadLibraryShim(dllnameW, NULL, NULL, &hdll);
+    if (FAILED(hr))
+        goto done;
+
+    hr = pGetCORSystemDirectory(dirW, MAX_PATH, &len);
+    if (FAILED(hr))
+        goto done;
+
+    lstrcatW(dirW, dllnameW);
+    WideCharToMultiByte(CP_ACP, 0, dirW, -1, dllnameA, MAX_PATH, 0, 0);
+    sprintf(version, get_file_version(dllnameA));
+    ret = TRUE;
+    
+done:
+    FreeLibrary(hmscoree);
+    strcpy(file_version, version);
+    return ret;
+}
+
 static int running_under_wine (void)
 {
     HMODULE module = GetModuleHandleA("ntdll.dll");
@@ -492,10 +538,16 @@ static BOOL CALLBACK
 extract_test_proc (HMODULE hModule, LPCTSTR lpszType,
                    LPTSTR lpszName, LONG_PTR lParam)
 {
+    static const char* dotnetdlls[] = {
+      "fusion",
+      NULL
+    };
     const char *tempdir = (const char *)lParam;
     char dllname[MAX_PATH];
     HMODULE dll;
     DWORD err;
+    BOOL dotnetdll = FALSE;
+    char dotnetdllversion[32];
 
     if (test_filtered_out( lpszName, NULL )) return TRUE;
 
@@ -506,14 +558,34 @@ extract_test_proc (HMODULE hModule, LPCTSTR lpszType,
 
     dll = LoadLibraryExA(dllname, NULL, LOAD_LIBRARY_AS_DATAFILE);
     if (!dll) {
-        xprintf ("    %s=dll is missing\n", dllname);
-        return TRUE;
+        int i;
+
+        for (i = 0; dotnetdlls[i]; i++)
+            if (!strcmp(dllname, dotnetdlls[i])) {
+                dotnetdll = TRUE;
+                break;
+            }
+
+        if (!dotnetdll) {
+            xprintf ("    %s=dll is missing\n", dllname);
+            return TRUE;
+        }
+
+        /* Check the existence of the dll and the version info in one go */
+        dotnetdll = get_dotnet_file_version(dllname, dotnetdllversion);
+        if (!dotnetdll) {
+            xprintf ("    %s=dll is missing\n", dllname);
+            return TRUE;
+        }
     }
     FreeLibrary(dll);
 
     if (!(err = get_subtests( tempdir, &wine_tests[nr_of_files], lpszName )))
     {
-        xprintf ("    %s=%s\n", dllname, get_file_version(dllname));
+        if (!dotnetdll)
+            xprintf ("    %s=%s\n", dllname, get_file_version(dllname));
+        else
+            xprintf ("    %s=%s\n", dllname, dotnetdllversion);
         nr_of_tests += wine_tests[nr_of_files].subtest_count;
         nr_of_files++;
     }
-- 
1.6.0.6


