https://git.reactos.org/?p=reactos.git;a=commitdiff;h=c296ee510f6ecfa15f393…
commit c296ee510f6ecfa15f3939ce20faa101d12fa5a0
Author:     Mark Jansen <mark.jansen(a)reactos.org>
AuthorDate: Sun Jan 13 19:41:51 2019 +0100
Commit:     Mark Jansen <mark.jansen(a)reactos.org>
CommitDate: Mon Jan 21 20:42:16 2019 +0100
    [DBGHELP_APITEST] Skip the test when the function is not found
---
 modules/rostests/apitests/dbghelp/pdb.c | 44 ++++++++++++++++++++++++++-------
 1 file changed, 35 insertions(+), 9 deletions(-)
diff --git a/modules/rostests/apitests/dbghelp/pdb.c
b/modules/rostests/apitests/dbghelp/pdb.c
index 2db3935fe4..8f4988ac0c 100644
--- a/modules/rostests/apitests/dbghelp/pdb.c
+++ b/modules/rostests/apitests/dbghelp/pdb.c
@@ -11,6 +11,7 @@
 #include <dbghelp.h>
 #include <cvconst.h>    // SymTagXXX
 #include <stdio.h>
+#include <delayimp.h>
 #include "wine/test.h"
@@ -189,6 +190,37 @@ static void init_dbghelp_version()
           LOWORD(fileInfo.dwProductVersionLS));
 }
+static
+int g_SymRegisterCallbackW64NotFound = 0;
+
+static
+BOOL WINAPI SymRegisterCallbackW64_Stub(HANDLE hProcess, PSYMBOL_REGISTERED_CALLBACK64
CallbackFunction, ULONG64 UserContext)
+{
+    g_SymRegisterCallbackW64NotFound++;
+    return FALSE;
+}
+
+/* A delay-load failure hook will be called when resolving a delay-load dependency (dll
or function) fails */
+FARPROC WINAPI DliFailHook(unsigned dliNotify, PDelayLoadInfo pdli)
+{
+    /* Was the failure a function, and did we get info */
+    if (dliNotify == dliFailGetProc && pdli)
+    {
+        /* Is it our function? */
+        if (pdli->dlp.fImportByName && !strcmp(pdli->dlp.szProcName,
"SymRegisterCallbackW64"))
+        {
+            /* Redirect execution to the stub */
+            return (FARPROC)SymRegisterCallbackW64_Stub;
+        }
+    }
+    /* This is not the function you are looking for, continue default behavior (throw
exception) */
+    return NULL;
+}
+
+/* Register the failure hook using the magic name '__pfnDliFailureHook2'. */
+PfnDliHook __pfnDliFailureHook2 = DliFailHook;
+
+
 /* Maybe our dbghelp.dll is too old? */
 static BOOL can_enumerate(HANDLE hProc, DWORD64 BaseAddress)
 {
@@ -544,18 +576,12 @@ static void test_SymRegCallback(HANDLE hProc, const char*
szModuleName, BOOL tes
     }
     else
     {
-        // dbghelp fileversion 5.2.3790.3959
-        // SymRegisterCallbackW64 crash only happens on real Windows 2003
-        // Fileversion 5.2.3790.3959 is used in Windows 2003.
-        // In ROS there is no crash.
-        // I could not figure out whats wrong.
-        if ((dbghelpFileVer.dwProductVersionMS == MAKELONG(2, 5)) &&
-            (dbghelpFileVer.dwProductVersionLS == MAKELONG(3959, 3790)))
+        Ret = SymRegisterCallbackW64(hProc, SymRegisterCallback64Proc,
(ULONG_PTR)&ctx);
+        if (g_SymRegisterCallbackW64NotFound)
         {
-            skip("dbghelp.dll ver 5.2.3790.3959 (w2k3), SymRegisterCallbackW64 would
crash!\n");
+            skip("SymRegisterCallbackW64 not found in dbghelp.dll\n");
             return;
         }
-        Ret = SymRegisterCallbackW64(hProc, SymRegisterCallback64Proc,
(ULONG_PTR)&ctx);
     }
     ok_int(Ret, TRUE);