/****************************************************************** * dbg_init * * Initializes the dbghelp library, and also sets the application directory * as a place holder for symbol searches. */ BOOL dbg_init(HANDLE hProc, const WCHAR* in, BOOL invade) { BOOL ret; ret = SymInitialize(hProc, NULL, invade); if (ret && in) { const WCHAR* last; for (last = in + lstrlenW(in) - 1; last >= in; last--) { if (*last == '/' || *last == '\\') { WCHAR* tmp; tmp = HeapAlloc(GetProcessHeap(), 0, (1024 + 1 + (last - in) + 1) * sizeof(WCHAR)); if (tmp && SymGetSearchPathW(hProc, tmp, 1024)) { WCHAR* x = tmp + lstrlenW(tmp); *x++ = ';'; memcpy(x, in, (last - in) * sizeof(WCHAR)); x[last - in] = '\0'; ret = SymSetSearchPathW(hProc, tmp); } else ret = FALSE; HeapFree(GetProcessHeap(), 0, tmp); break; } } } return ret; }
/** * Loads modules for current process. */ static void LoadProcessModules(const FString &RemoteStorage) { int32 ErrorCode = 0; HANDLE ProcessHandle = GetCurrentProcess(); // Enumerate process modules. HMODULE* ModuleHandlePointer = GetProcessModules(ProcessHandle); if (!ModuleHandlePointer) { ErrorCode = GetLastError(); return; } // Load the modules. for( int32 ModuleIndex = 0; ModuleHandlePointer[ModuleIndex]; ModuleIndex++ ) { MODULEINFO ModuleInfo = {0}; #if WINVER > 0x502 WCHAR ModuleName[FProgramCounterSymbolInfo::MAX_NAME_LENGHT] = {0}; WCHAR ImageName[FProgramCounterSymbolInfo::MAX_NAME_LENGHT] = {0}; #else ANSICHAR ModuleName[FProgramCounterSymbolInfo::MAX_NAME_LENGHT] = { 0 }; ANSICHAR ImageName[FProgramCounterSymbolInfo::MAX_NAME_LENGHT] = { 0 }; #endif #if PLATFORM_64BITS static_assert(sizeof( MODULEINFO ) == 24, "Broken alignment for 64bit Windows include."); #else static_assert(sizeof( MODULEINFO ) == 12, "Broken alignment for 32bit Windows include."); #endif FGetModuleInformation( ProcessHandle, ModuleHandlePointer[ModuleIndex], &ModuleInfo, sizeof( ModuleInfo ) ); FGetModuleFileNameEx( ProcessHandle, ModuleHandlePointer[ModuleIndex], ImageName, FProgramCounterSymbolInfo::MAX_NAME_LENGHT ); FGetModuleBaseName( ProcessHandle, ModuleHandlePointer[ModuleIndex], ModuleName, FProgramCounterSymbolInfo::MAX_NAME_LENGHT ); // Set the search path to find PDBs in the same folder as the DLL. #if WINVER > 0x502 WCHAR SearchPath[MAX_PATH] = {0}; WCHAR* FileName = NULL; const auto Result = GetFullPathNameW( ImageName, MAX_PATH, SearchPath, &FileName ); #else ANSICHAR SearchPath[MAX_PATH] = { 0 }; ANSICHAR* FileName = NULL; const auto Result = GetFullPathNameA( ImageName, MAX_PATH, SearchPath, &FileName ); #endif FString SearchPathList; if (Result != 0 && Result < MAX_PATH) { *FileName = 0; #if WINVER > 0x502 SearchPathList = SearchPath; #else SearchPathList = ANSI_TO_TCHAR(SearchPath); #endif } if (!RemoteStorage.IsEmpty()) { if (!SearchPathList.IsEmpty()) { SearchPathList.AppendChar(';'); } SearchPathList.Append(RemoteStorage); } #if WINVER > 0x502 SymSetSearchPathW(ProcessHandle, *SearchPathList); // Load module. const DWORD64 BaseAddress = SymLoadModuleExW( ProcessHandle, ModuleHandlePointer[ModuleIndex], ImageName, ModuleName, (DWORD64) ModuleInfo.lpBaseOfDll, (uint32) ModuleInfo.SizeOfImage, NULL, 0 ); if( !BaseAddress ) { ErrorCode = GetLastError(); UE_LOG(LogWindows, Warning, TEXT("SymLoadModuleExW. Error: %d"), GetLastError()); } #else SymSetSearchPath(ProcessHandle, TCHAR_TO_ANSI(*SearchPathList)); // Load module. const DWORD64 BaseAddress = SymLoadModuleEx( ProcessHandle, ModuleHandlePointer[ModuleIndex], ImageName, ModuleName, (DWORD64)ModuleInfo.lpBaseOfDll, (uint32)ModuleInfo.SizeOfImage, NULL, 0 ); if (!BaseAddress) { ErrorCode = GetLastError(); UE_LOG(LogWindows, Warning, TEXT("SymLoadModuleEx. Error: %d"), GetLastError()); } #endif } // Free the module handle pointer allocated in case the static array was insufficient. FMemory::Free(ModuleHandlePointer); }