Implemented SymGetModuleInfo64.
diff --git a/dlls/dbghelp/dbghelp.spec b/dlls/dbghelp/dbghelp.spec
index ae911b7..243db28 100644
--- a/dlls/dbghelp/dbghelp.spec
+++ b/dlls/dbghelp/dbghelp.spec
@@ -53,7 +53,7 @@
@ stdcall SymGetLinePrev(long ptr)
@ stub SymGetModuleBase64
@ stdcall SymGetModuleBase(long long)
-@ stub SymGetModuleInfo64
+@ stdcall SymGetModuleInfo64(long double ptr)
@ stdcall SymGetModuleInfo(long long ptr)
@ stub SymGetModuleInfoW64
@ stub SymGetModuleInfoW
diff --git a/dlls/dbghelp/module.c b/dlls/dbghelp/module.c
index e39f431..88c18b5 100644
--- a/dlls/dbghelp/module.c
+++ b/dlls/dbghelp/module.c
@@ -551,6 +551,61 @@
return TRUE;
}
+/******************************************************************
+ * SymGetModuleInfo64 (DBGHELP.@)
+ *
+ */
+BOOL WINAPI SymGetModuleInfo64(HANDLE hProcess, DWORD64 dwAddr,
+ PIMAGEHLP_MODULE64 ModuleInfo)
+{
+ struct process* pcs = process_find_by_handle(hProcess);
+ struct module* module;
+ DWORD sz;
+ IMAGEHLP_MODULE64 mod;
+
+ TRACE("%p %s %p\n", hProcess, wine_dbgstr_longlong(dwAddr), ModuleInfo);
+
+ if (!pcs) return FALSE;
+ if (ModuleInfo->SizeOfStruct > sizeof(*ModuleInfo)) return FALSE;
+ module = module_find_by_addr(pcs, dwAddr, DMT_UNKNOWN);
+ if (!module) return FALSE;
+
+ mod.BaseOfImage = module->module.BaseOfImage;
+ mod.ImageSize = module->module.ImageSize;
+ mod.TimeDateStamp = module->module.TimeDateStamp;
+ mod.CheckSum = module->module.CheckSum;
+ mod.NumSyms = module->module.NumSyms;
+ mod.SymType = module->module.SymType;
+ strcpy(mod.ModuleName, module->module.ModuleName);
+ strcpy(mod.ImageName, module->module.ImageName);
+ strcpy(mod.LoadedImageName, module->module.LoadedImageName);
+ /* FIXME: all following attributes need to be set */
+ mod.LoadedPdbName[0] = '\0';
+ mod.CVSig = 0;
+ memset(mod.CVData, 0, sizeof(mod.CVData));
+ mod.PdbSig = 0;
+ memset(&mod.PdbSig70, 0, sizeof(mod.PdbSig70));
+ mod.PdbAge = 0;
+ mod.PdbUnmatched = 0;
+ mod.DbgUnmatched = 0;
+ mod.LineNumbers = 0;
+ mod.GlobalSymbols = 0;
+ mod.TypeInfo = 0;
+ mod.SourceIndexed = 0;
+ mod.Publics = 0;
+
+ if (module->module.SymType == SymNone)
+ {
+ module = module_get_container(pcs, module);
+ if (module && module->module.SymType != SymNone)
+ mod.SymType = module->module.SymType;
+ }
+ sz = ModuleInfo->SizeOfStruct;
+ memcpy(ModuleInfo, &mod, sz);
+ ModuleInfo->SizeOfStruct = sz;
+ return TRUE;
+}
+
/***********************************************************************
* SymGetModuleBase (IMAGEHLP.@)
*/
diff --git a/include/dbghelp.h b/include/dbghelp.h
index 044e2bf..9edfbe1 100644
--- a/include/dbghelp.h
+++ b/include/dbghelp.h
@@ -113,7 +113,8 @@
CHAR LoadedImageName[256];
} IMAGEHLP_MODULE, *PIMAGEHLP_MODULE;
-typedef struct _IMAGEHLP_MODULEW {
+typedef struct _IMAGEHLP_MODULEW
+{
DWORD SizeOfStruct;
DWORD BaseOfImage;
DWORD ImageSize;
@@ -126,6 +127,33 @@
WCHAR LoadedImageName[256];
} IMAGEHLP_MODULEW, *PIMAGEHLP_MODULEW;
+typedef struct _IMAGEHLP_MODULE64
+{
+ DWORD SizeOfStruct;
+ DWORD64 BaseOfImage;
+ DWORD ImageSize;
+ DWORD TimeDateStamp;
+ DWORD CheckSum;
+ DWORD NumSyms;
+ SYM_TYPE SymType;
+ CHAR ModuleName[32];
+ CHAR ImageName[256];
+ CHAR LoadedImageName[256];
+ CHAR LoadedPdbName[256];
+ DWORD CVSig;
+ CHAR CVData[MAX_PATH*3];
+ DWORD PdbSig;
+ GUID PdbSig70;
+ DWORD PdbAge;
+ BOOL PdbUnmatched;
+ BOOL DbgUnmatched;
+ BOOL LineNumbers;
+ BOOL GlobalSymbols;
+ BOOL TypeInfo;
+ BOOL SourceIndexed;
+ BOOL Publics;
+} IMAGEHLP_MODULE64, *PIMAGEHLP_MODULE64;
+
typedef struct _IMAGEHLP_LINE
{
DWORD SizeOfStruct;
@@ -612,6 +640,7 @@
BOOL WINAPI SymEnumerateModules(HANDLE, PSYM_ENUMMODULES_CALLBACK, PVOID);
BOOL WINAPI SymGetModuleInfo(HANDLE, DWORD, PIMAGEHLP_MODULE);
BOOL WINAPI SymGetModuleInfoW(HANDLE, DWORD, PIMAGEHLP_MODULEW);
+BOOL WINAPI SymGetModuleInfo64(HANDLE, DWORD64, PIMAGEHLP_MODULE64);
DWORD WINAPI SymGetModuleBase(HANDLE, DWORD);
DWORD WINAPI SymLoadModule(HANDLE, HANDLE, PSTR, PSTR, DWORD, DWORD);
DWORD64 WINAPI SymLoadModuleEx(HANDLE, HANDLE, PCSTR, PCSTR, DWORD64, DWORD,