Implemented SymLoadModuleEx.
diff --git a/dlls/dbghelp/dbghelp.c b/dlls/dbghelp/dbghelp.c
index 2651a00..3ebc7c3 100644
--- a/dlls/dbghelp/dbghelp.c
+++ b/dlls/dbghelp/dbghelp.c
@@ -100,6 +100,21 @@
}
/******************************************************************
+ * validate_addr64 (internal)
+ *
+ */
+BOOL validate_addr64(DWORD64 addr)
+{
+ if (addr >> 32)
+ {
+ FIXME("Unsupported address %s\n", wine_dbgstr_longlong(addr));
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+ return TRUE;
+}
+
+/******************************************************************
* SymSetSearchPath (DBGHELP.@)
*
*/
diff --git a/dlls/dbghelp/dbghelp.spec b/dlls/dbghelp/dbghelp.spec
index 3615310..cff2ab7 100644
--- a/dlls/dbghelp/dbghelp.spec
+++ b/dlls/dbghelp/dbghelp.spec
@@ -72,7 +72,7 @@
@ stdcall SymInitialize(long str long)
@ stdcall SymLoadModule64(long long str str double long)
@ stdcall SymLoadModule(long long str str long long)
-@ stub SymLoadModuleEx
+@ stdcall SymLoadModuleEx(long long str str double long ptr long)
@ stdcall SymMatchFileName(str str ptr ptr)
@ stub SymMatchString
@ stdcall SymRegisterCallback64(long ptr double)
diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h
index eb86e50..fdb7e31 100644
--- a/dlls/dbghelp/dbghelp_private.h
+++ b/dlls/dbghelp/dbghelp_private.h
@@ -312,7 +312,8 @@
/* dbghelp.c */
extern struct process* process_find_by_handle(HANDLE hProcess);
extern HANDLE hMsvcrt;
-
+extern BOOL validate_addr64(DWORD64 addr);
+
/* elf_module.c */
typedef BOOL (*elf_enum_modules_cb)(const char*, unsigned long addr, void* user);
extern BOOL elf_enum_modules(HANDLE hProc, elf_enum_modules_cb, void*);
diff --git a/dlls/dbghelp/module.c b/dlls/dbghelp/module.c
index 8cec363..18e0162 100644
--- a/dlls/dbghelp/module.c
+++ b/dlls/dbghelp/module.c
@@ -375,6 +375,23 @@
}
/***********************************************************************
+ * SymLoadModuleEx (DBGHELP.@)
+ */
+DWORD64 WINAPI SymLoadModuleEx(HANDLE hProcess, HANDLE hFile, PCSTR ImageName,
+ PCSTR ModuleName, DWORD64 BaseOfDll, DWORD DllSize,
+ PMODLOAD_DATA Data, DWORD Flags)
+{
+ if (Data || Flags)
+ {
+ FIXME("Unsupported parameters (%p, %lx) for %s\n", Data, Flags, ImageName);
+ if (Flags & 1) return TRUE;
+ }
+ if (!validate_addr64(BaseOfDll)) return FALSE;
+ return SymLoadModule(hProcess, hFile, (char*)ImageName, (char*)ModuleName,
+ (DWORD)BaseOfDll, DllSize);
+}
+
+/***********************************************************************
* SymLoadModule64 (DBGHELP.@)
*/
DWORD WINAPI SymLoadModule64(HANDLE hProcess, HANDLE hFile, char* ImageName,
diff --git a/include/dbghelp.h b/include/dbghelp.h
index 1d3c8a6..734af15 100644
--- a/include/dbghelp.h
+++ b/include/dbghelp.h
@@ -614,7 +614,7 @@
BOOL WINAPI SymGetModuleInfoW(HANDLE, DWORD, PIMAGEHLP_MODULEW);
DWORD WINAPI SymGetModuleBase(HANDLE, DWORD);
DWORD WINAPI SymLoadModule(HANDLE, HANDLE, PSTR, PSTR, DWORD, DWORD);
-DWORD64 WINAPI SymLoadModuleEx(HANDLE, HANDLE, PSTR, PSTR, DWORD64, DWORD,
+DWORD64 WINAPI SymLoadModuleEx(HANDLE, HANDLE, PCSTR, PCSTR, DWORD64, DWORD,
PMODLOAD_DATA, DWORD);
BOOL WINAPI SymUnloadModule(HANDLE, DWORD);