int KDumpModuleAnalyzer::GetModuleInfo(KDumpModuleInfo *pRetDumpModuleInfo) { int nResult = false; int nRetCode = false; #ifdef _DEBUG struct IMAGEHLP_SYMBOL64_EX : IMAGEHLP_SYMBOL64 { TCHAR _EX[MAX_PATH]; }; DWORD64 dwDisplacement; IMAGEHLP_SYMBOL64_EX Symbol; Symbol.MaxNameLength = sizeof(Symbol._EX) / sizeof(Symbol._EX[0]); nRetCode = SymGetSymFromAddr64(m_hProcess, m_Stackframe.AddrPC.Offset, &dwDisplacement, &Symbol); if (nRetCode) { #ifdef OPEN_LOG_AND_BREAK KLogPrintf("%s\t%d\t%x\n", Symbol.Name, 0, m_Stackframe.AddrPC.Offset); #endif printf("%s\t%d\t%x\n", Symbol.Name, 0, m_Stackframe.AddrPC.Offset); } #endif KG_PROCESS_ERROR(pRetDumpModuleInfo); memset(pRetDumpModuleInfo, 0, sizeof(KDumpModuleInfo)); pRetDumpModuleInfo->dwStackAddress = m_dwStackAddress; nRetCode = EnumerateLoadedModules64(m_hProcess, KDumpModuleAnalyzer::FindExceptionModule, (void *)pRetDumpModuleInfo); KG_PROCESS_ERROR(nRetCode);//EnumerateLoadedModules64 执行失败 KG_PROCESS_ERROR(pRetDumpModuleInfo->nFindDumpModuleFlag);//FindExceptionModule 没有查找到 #ifdef OPEN_LOG_AND_BREAK KLogPrintf( "Name:%s\tBase:%llp\tOffset:%llp\tStack:%llp", pRetDumpModuleInfo->szModuleName, pRetDumpModuleInfo->dwModuleBase, pRetDumpModuleInfo->dwStackAddress, m_dwStackAddress ); #endif nResult = true; Exit0: return nResult; }
/* static */ BOOL wxDbgHelpDLL::CallEnumerateLoadedModules(HANDLE handle, wxPENUMLOADED_MODULES_CALLBACK callback, PVOID callbackParam) { #ifdef UNICODE if ( EnumerateLoadedModulesW64 ) { #ifdef wxHAS_NON_CONST_MODULE_NAME // We need to pass by a bridge just to convert non-const module name to // the const one taken by our callback. wxEnumLoadedCallbackBridge br(callback, callbackParam); if ( EnumerateLoadedModulesW64(handle, &wxEnumLoadedW64Callback, &br) ) return TRUE; #else // new SDK // We can use our callback directly. if ( EnumerateLoadedModulesW64(handle, callback, callbackParam) ) return TRUE; #endif // old/new SDK } #endif // UNICODE if ( EnumerateLoadedModules64 ) { // We need a bridge if we need to convert to Unicode or if we're using // an older SDK with a non-const first argument, so just use it always // to avoid having too many complicated preprocessor checks. wxEnumLoadedCallbackBridge br(callback, callbackParam); if ( EnumerateLoadedModules64(handle, &wxEnumLoaded64Callback, &br) ) return TRUE; } if ( EnumerateLoadedModules ) { // With this function we need a bridge in any case because the type of // module base argument used by EnumerateLoadedModules() differs from // that used by EnumerateLoadedModules[W]64(). wxEnumLoadedCallbackBridge br(callback, callbackParam); if ( EnumerateLoadedModules(handle, &wxEnumLoadedCallback, &br) ) return TRUE; } return FALSE; }
void PrintVersionInfo(CMString& buffer, unsigned flags) { GetProcessorString(buffer); buffer.Append(TEXT("\r\n")); GetFreeMemoryString(buffer); buffer.Append(TEXT("\r\n")); GetOSDisplayString(buffer); buffer.Append(TEXT("\r\n")); GetInternetExplorerVersion(buffer); buffer.Append(TEXT("\r\n")); GetAdminString(buffer); buffer.Append(TEXT("\r\n")); GetLanguageString(buffer); buffer.Append(TEXT("\r\n")); TCHAR *profpathfull = Utils_ReplaceVarsT(profpath); if (flags & VI_FLAG_PRNVAR) { GetFreeDiskString(profpathfull, buffer); buffer.Append(TEXT("\r\n")); } buffer.AppendFormat(TEXT("\r\nMiranda NG Version: %s"), vertxt); GetWow64String(buffer); buffer.Append(TEXT("\r\n")); TCHAR path[MAX_PATH], mirtime[30]; GetModuleFileName(NULL, path, MAX_PATH); GetLastWriteTime(path, mirtime, 30); buffer.AppendFormat(TEXT("Build time: %s\r\n"), mirtime); TCHAR profpn[MAX_PATH]; mir_sntprintf(profpn, _countof(profpn), TEXT("%s\\%s"), profpathfull, profname); buffer.AppendFormat(TEXT("Profile: %s\r\n"), profpn); if (flags & VI_FLAG_PRNVAR) { WIN32_FIND_DATA FindFileData; HANDLE hFind = FindFirstFile(profpn, &FindFileData); if (hFind != INVALID_HANDLE_VALUE) { FindClose(hFind); unsigned __int64 fsize = (unsigned __int64)FindFileData.nFileSizeHigh << 32 | FindFileData.nFileSizeLow; buffer.AppendFormat(TEXT("Profile size: %I64u Bytes\r\n"), fsize), GetLastWriteTime(&FindFileData.ftCreationTime, mirtime, 30); buffer.AppendFormat(TEXT("Profile creation date: %s\r\n"), mirtime); } } mir_free(profpathfull); GetLanguagePackString(buffer); buffer.Append(TEXT("\r\n")); // buffer.AppendFormat(TEXT("Nightly: %s\r\n"), _tcsstr(vertxt, TEXT("alpha")) ? TEXT("Yes") : TEXT("No")); // buffer.AppendFormat(TEXT("Unicode: %s\r\n"), _tcsstr(vertxt, TEXT("Unicode")) ? TEXT("Yes") : TEXT("No")); GetPluginsString(buffer, flags); if (flags & VI_FLAG_WEATHER) { buffer.AppendFormat(TEXT("\r\n%sWeather ini files:%s\r\n-------------------------------------------------------------------------------\r\n"), (flags & VI_FLAG_FORMAT) ? TEXT("[b]") : TEXT(""), (flags & VI_FLAG_FORMAT) ? TEXT("[/b]") : TEXT("")); GetWeatherStrings(buffer, flags); } if (flags & VI_FLAG_PRNVAR && !servicemode) { buffer.AppendFormat(TEXT("\r\n%sProtocols and Accounts:%s\r\n-------------------------------------------------------------------------------\r\n"), (flags & VI_FLAG_FORMAT) ? TEXT("[b]") : TEXT(""), (flags & VI_FLAG_FORMAT) ? TEXT("[/b]") : TEXT("")); GetProtocolStrings(buffer); } if (flags & VI_FLAG_PRNVAR) { buffer.AppendFormat(TEXT("\r\n%sIcon Packs:%s\r\n-------------------------------------------------------------------------------\r\n"), (flags & VI_FLAG_FORMAT) ? TEXT("[b]") : TEXT(""), (flags & VI_FLAG_FORMAT) ? TEXT("[/b]") : TEXT("")); GetIconStrings(buffer); } if (flags & VI_FLAG_PRNDLL) { __try { buffer.Append(TEXT("\r\nLoaded Modules:\r\n-------------------------------------------------------------------------------\r\n")); EnumerateLoadedModules64(GetCurrentProcess(), LoadedModules64, &buffer); } __except (EXCEPTION_EXECUTE_HANDLER) {} }
// Takes a handle (as returned from dlopen()) and returns the absolute path to the image loaded JL_DLLEXPORT int jl_dllist(jl_array_t *list) { return EnumerateLoadedModules64(GetCurrentProcess(), jl_EnumerateLoadedModulesProc64, list); }