[APPSHIM_APITEST] Add tests for ForceDXSetupSuccess
authorMark Jansen <mark.jansen@reactos.org>
Thu, 7 Mar 2019 20:18:52 +0000 (21:18 +0100)
committerMark Jansen <mark.jansen@reactos.org>
Sun, 10 Mar 2019 11:45:34 +0000 (12:45 +0100)
modules/rostests/apitests/appshim/forcedxsetup.c [new file with mode: 0644]
modules/rostests/apitests/appshim/layer_hooks.c
modules/rostests/apitests/appshim/testlist.c

diff --git a/modules/rostests/apitests/appshim/forcedxsetup.c b/modules/rostests/apitests/appshim/forcedxsetup.c
new file mode 100644 (file)
index 0000000..a2b7314
--- /dev/null
@@ -0,0 +1,226 @@
+/*
+ * PROJECT:     appshim_apitest
+ * LICENSE:     GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
+ * PURPOSE:     Tests for ForceDxSetupSuccess shim
+ * COPYRIGHT:   Copyright 2019 Mark Jansen (mark.jansen@reactos.org)
+ */
+
+#include <ntstatus.h>
+#define WIN32_NO_STATUS
+#include <windows.h>
+#include "wine/test.h"
+
+#include "appshim_apitest.h"
+
+static HMODULE g_hShimDll;
+static HMODULE g_hSentinelModule = (HMODULE)&g_hShimDll;  /* Not a valid hmodule, so a nice sentinel */
+static tGETHOOKAPIS pGetHookAPIs;
+
+static INT (WINAPI *DirectXSetupGetVersion)(DWORD *lpdwVersion, DWORD *lpdwMinorVersion);
+
+
+typedef HMODULE(WINAPI* LOADLIBRARYAPROC)(PCSTR);
+typedef HMODULE(WINAPI* LOADLIBRARYWPROC)(PCWSTR);
+typedef FARPROC(WINAPI* GETPROCADDRESSPROC)(HMODULE, PCSTR);
+typedef BOOL(WINAPI* FREELIBRARYPROC)(HMODULE);
+
+
+static HMODULE WINAPI my_LoadLibraryA(PCSTR Name)
+{
+    return g_hSentinelModule;
+}
+
+static void test_LoadLibraryA(PHOOKAPI hook)
+{
+    LOADLIBRARYAPROC proc;
+
+    ok_str(hook->LibraryName, "KERNEL32.DLL");
+    hook->OriginalFunction = my_LoadLibraryA;
+    proc = hook->ReplacementFunction;
+
+    /* Original function is not called */
+    ok_ptr(proc("dsetup"), g_hShimDll);
+    ok_ptr(proc("dsetup.dll"), g_hShimDll);
+    ok_ptr(proc("DSETUP.DLL"), g_hShimDll);
+    ok_ptr(proc("DSeTuP.DlL"), g_hShimDll);
+
+    ok_ptr(proc("dsetup32"), g_hShimDll);
+    ok_ptr(proc("dsetup32.dll"), g_hShimDll);
+    ok_ptr(proc("DSETUP32.DLL"), g_hShimDll);
+    ok_ptr(proc("DSeTuP32.DlL"), g_hShimDll);
+
+    ok_ptr(proc("c:\\bogus/dsetup"), g_hShimDll);
+    ok_ptr(proc("c:\\bogus\\dsetup.dll"), g_hShimDll);
+    ok_ptr(proc("c:/bogus/DSETUP.DLL"), g_hShimDll);
+    ok_ptr(proc("c:\\bogus\\DSeTuP.DlL"), g_hShimDll);
+
+    ok_ptr(proc("////////////////////dsetup32"), g_hShimDll);
+    ok_ptr(proc("\\\\\\\\\\\\\\dsetup32.dll"), g_hShimDll);
+    ok_ptr(proc("xxxxxxxxxxx\\DSETUP32.DLL"), g_hShimDll);
+    ok_ptr(proc("xxxxxxxxxxx//DSeTuP32.DlL"), g_hShimDll);
+
+    /* Original function is called */
+    ok_ptr(proc(NULL), g_hSentinelModule);
+    ok_ptr(proc("dsetup\\something"), g_hSentinelModule);
+    ok_ptr(proc("dsetup.dl"), g_hSentinelModule);
+    ok_ptr(proc("c:\\DSETUP.DLL."), g_hSentinelModule);
+    ok_ptr(proc("DSeTuP.D"), g_hSentinelModule);
+}
+
+static HMODULE WINAPI my_LoadLibraryW(PCWSTR Name)
+{
+    return g_hSentinelModule;
+}
+
+static void test_LoadLibraryW(PHOOKAPI hook)
+{
+    LOADLIBRARYWPROC proc;
+
+    ok_str(hook->LibraryName, "KERNEL32.DLL");
+
+    hook->OriginalFunction = my_LoadLibraryW;
+    proc = hook->ReplacementFunction;
+
+    /* Original function is not called */
+    ok_ptr(proc(L"dsetup"), g_hShimDll);
+    ok_ptr(proc(L"dsetup.dll"), g_hShimDll);
+    ok_ptr(proc(L"DSETUP.DLL"), g_hShimDll);
+    ok_ptr(proc(L"DSeTuP.DlL"), g_hShimDll);
+
+    ok_ptr(proc(L"dsetup32"), g_hShimDll);
+    ok_ptr(proc(L"dsetup32.dll"), g_hShimDll);
+    ok_ptr(proc(L"DSETUP32.DLL"), g_hShimDll);
+    ok_ptr(proc(L"DSeTuP32.DlL"), g_hShimDll);
+
+    ok_ptr(proc(L"c:\\bogus/dsetup"), g_hShimDll);
+    ok_ptr(proc(L"c:\\bogus\\dsetup.dll"), g_hShimDll);
+    ok_ptr(proc(L"c:/bogus/DSETUP.DLL"), g_hShimDll);
+    ok_ptr(proc(L"c:\\bogus\\DSeTuP.DlL"), g_hShimDll);
+
+    ok_ptr(proc(L"////////////////////dsetup32"), g_hShimDll);
+    ok_ptr(proc(L"\\\\\\\\\\\\\\dsetup32.dll"), g_hShimDll);
+    ok_ptr(proc(L"xxxxxxxxxxx\\DSETUP32.DLL"), g_hShimDll);
+    ok_ptr(proc(L"xxxxxxxxxxx//DSeTuP32.DlL"), g_hShimDll);
+
+    /* Original function is called */
+    ok_ptr(proc(NULL), g_hSentinelModule);
+    ok_ptr(proc(L"dsetup\\something"), g_hSentinelModule);
+    ok_ptr(proc(L"dsetup.dl"), g_hSentinelModule);
+    ok_ptr(proc(L"c:\\DSETUP.DLL."), g_hSentinelModule);
+    ok_ptr(proc(L"DSeTuP.D"), g_hSentinelModule);
+}
+
+static void test_GetProcAddress(PHOOKAPI hook)
+{
+    GETPROCADDRESSPROC proc;
+    DWORD n;
+    PCSTR Functions[] = {
+        "DirectXSetup",
+        "DirectXSetupA",
+        "DirectXSetupW",
+        "DirectXSetupGetVersion",
+        /* And not case sensitive? */
+        "directxsetup",
+        "DIRECTXSETUPA",
+        "DiReCtXsEtUpW",
+        NULL
+    };
+    HMODULE mod = GetModuleHandleA("kernel32.dll");
+
+    ok_str(hook->LibraryName, "KERNEL32.DLL");
+    hook->OriginalFunction = GetProcAddress;    /* Some versions seem to call GetProcAddress regardless of what is put here.. */
+    proc = hook->ReplacementFunction;
+
+    ok_ptr(proc(mod, "CreateFileA"), GetProcAddress(mod, "CreateFileA"));
+    ok_ptr(proc(g_hShimDll, "CreateFileA"), NULL);
+
+    for (n = 0; Functions[n]; ++n)
+    {
+        FARPROC fn = proc(g_hShimDll, Functions[n]);
+        ok(fn != NULL, "Got NULL for %s\n", Functions[n]);
+        /* And yet, no export! */
+        ok_ptr(GetProcAddress(g_hShimDll, Functions[n]), NULL);
+    }
+
+    /* Not every function is shimmed */
+    ok_ptr(proc(g_hShimDll, "DirectXSetupShowEULA"), NULL);
+    /* Retrieve a pointer for our next test */
+    DirectXSetupGetVersion = (PVOID)proc(g_hShimDll, "DirectXSetupGetVersion");
+}
+
+static int g_NumShim = 0;
+static int g_NumSentinel = 0;
+static int g_NumCalls = 0;
+BOOL WINAPI my_FreeLibrary(HMODULE module)
+{
+    if (module == g_hSentinelModule)
+        ++g_NumSentinel;
+    else if (module == g_hShimDll)
+        ++g_NumShim;
+    ++g_NumCalls;
+    return 33;
+}
+
+static void test_FreeLibrary(PHOOKAPI hook)
+{
+    FREELIBRARYPROC proc;
+
+    ok_str(hook->LibraryName, "KERNEL32.DLL");
+    hook->OriginalFunction = my_FreeLibrary;
+    proc = hook->ReplacementFunction;
+
+    ok_int(proc(NULL), 33);
+    ok_int(proc(NULL), 33);
+    ok_int(proc(g_hSentinelModule), 33);
+    ok_int(proc(g_hSentinelModule), 33);
+    ok_int(proc(g_hShimDll), TRUE);
+    ok_int(proc(g_hShimDll), TRUE);
+
+    ok_int(g_NumShim, 0);
+    ok_int(g_NumSentinel, 2);
+    ok_int(g_NumCalls, 4);
+}
+
+
+START_TEST(forcedxsetup)
+{
+    DWORD num_shims = 0, n;
+    PHOOKAPI hook;
+
+    if (!LoadShimDLL(L"aclayers.dll", &g_hShimDll, &pGetHookAPIs))
+        return;
+
+    hook = pGetHookAPIs("", L"ForceDxSetupSuccess", &num_shims);
+
+    ok(hook != NULL, "Expected hook to be a valid pointer\n");
+    ok(num_shims == 6, "Expected num_shims to be 6, was: %u\n", num_shims);
+
+    if (!hook || !num_shims)
+        return;
+
+    for (n = 0; n < num_shims; ++n)
+    {
+        if (!_stricmp(hook[n].FunctionName, "LoadLibraryA"))
+            test_LoadLibraryA(hook + n);
+        else if (!_stricmp(hook[n].FunctionName, "LoadLibraryW"))
+            test_LoadLibraryW(hook + n);
+        else if (!_stricmp(hook[n].FunctionName, "GetProcAddress"))
+            test_GetProcAddress(hook + n);
+        else if (!_stricmp(hook[n].FunctionName, "FreeLibrary"))
+            test_FreeLibrary(hook + n);
+    }
+
+    ok(DirectXSetupGetVersion != NULL, "No DirectXSetupGetVersion\n");
+    if (DirectXSetupGetVersion)
+    {
+        DWORD dwVersion = 0xdeadbeef;
+        DWORD dwMinorVersion = 0xbeefdead;
+        INT Res = DirectXSetupGetVersion(&dwVersion, &dwMinorVersion);
+        ok_int(Res, 1);
+        ok_hex(dwVersion, MAKELONG(7, 4));     // DirectX 7.0
+        ok_hex(dwMinorVersion, MAKELONG(1792, 0));
+
+        Res = DirectXSetupGetVersion(NULL, NULL);
+        ok_int(Res, 1);
+    }
+}
index e156862..715de78 100644 (file)
@@ -27,12 +27,24 @@ typedef struct expect_shim_data
 {
     const WCHAR* ShimName;
     DWORD MinVersion;
-    expect_shim_hook hooks[4];
+    expect_shim_hook hooks[6];
 } expect_shim_data;
 
 
 static expect_shim_data data[] =
 {
+    {
+        L"ForceDXSetupSuccess",
+        0,
+        {
+            { "KERNEL32.DLL", "LoadLibraryA" },
+            { "KERNEL32.DLL", "LoadLibraryW" },
+            { "KERNEL32.DLL", "LoadLibraryExA" },
+            { "KERNEL32.DLL", "LoadLibraryExW" },
+            { "KERNEL32.DLL", "GetProcAddress" },
+            { "KERNEL32.DLL", "FreeLibrary" },
+        }
+    },
     {
         L"VerifyVersionInfoLite",
         0,
index a3e7b71..78bf621 100644 (file)
@@ -4,6 +4,7 @@
 #include <wine/test.h>
 
 extern void func_dispmode(void);
+extern void func_forcedxsetup(void);
 extern void func_genral_hooks(void);
 extern void func_ignorefreelib(void);
 extern void func_layer_hooks(void);
@@ -12,6 +13,7 @@ extern void func_versionlie(void);
 const struct test winetest_testlist[] =
 {
     { "dispmode", func_dispmode },
+    { "forcedxsetup", func_forcedxsetup },
     { "genral_hooks", func_genral_hooks },
     { "ignorefreelib", func_ignorefreelib },
     { "layer_hooks", func_layer_hooks },