From 0146926f199da36b6c61d522eed54f76461a8e52 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 17 Mar 2010 10:57:19 +0100 Subject: Debugger: Improve engine detection. Try to detect engine by looking at toolchain, executable, attach mode. Find out path to executable in attach to running dialog. Reviewed-by: hjk --- src/plugins/debugger/shared/dbgwinutils.cpp | 45 ++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 7 deletions(-) (limited to 'src/plugins/debugger/shared/dbgwinutils.cpp') diff --git a/src/plugins/debugger/shared/dbgwinutils.cpp b/src/plugins/debugger/shared/dbgwinutils.cpp index 102958d9c1..104e1f1b4f 100644 --- a/src/plugins/debugger/shared/dbgwinutils.cpp +++ b/src/plugins/debugger/shared/dbgwinutils.cpp @@ -29,16 +29,44 @@ #include "winutils.h" #include "debuggerdialogs.h" + +#include + #include #include -#ifdef USE_PSAPI -# include +#include + +#ifdef __GNUC__ +# include #endif namespace Debugger { namespace Internal { -#ifdef USE_PSAPI +#ifdef __GNUC__ +// Resolve QueryFullProcessImageNameW out of kernel32.dll due +// to incomplete MinGW import libs. +static inline BOOL minGW_QueryFullProcessImageName(HANDLE h, + DWORD flags, + LPWSTR buffer, + DWORD *size) +{ + // Resolve required symbols from the kernel32.dll + typedef BOOL (WINAPI *QueryFullProcessImageNameWProtoType) + (HANDLE, DWORD, LPWSTR, PDWORD); + static QueryFullProcessImageNameWProtoType queryFullProcessImageNameW = 0; + if (!queryFullProcessImageNameW) { + QLibrary kernel32Lib(QLatin1String("kernel32.dll"), 0); + if (kernel32Lib.isLoaded() || kernel32Lib.load()) + queryFullProcessImageNameW = (QueryFullProcessImageNameWProtoType)kernel32Lib.resolve("QueryFullProcessImageNameW"); + } + if (!queryFullProcessImageNameW) + return FALSE; + // Read out process + return (*queryFullProcessImageNameW)(h, flags, buffer, size); +} +#endif + static inline QString imageName(DWORD processId) { QString rc; @@ -46,12 +74,17 @@ static inline QString imageName(DWORD processId) if (handle == INVALID_HANDLE_VALUE) return rc; WCHAR buffer[MAX_PATH]; - if (GetProcessImageFileName(handle, buffer, MAX_PATH)) + DWORD bufSize = MAX_PATH; +#ifdef __GNUC__ + if (minGW_QueryFullProcessImageName(handle, 0, buffer, &bufSize)) + rc = QString::fromUtf16(reinterpret_cast(buffer)); +#else + if (QueryFullProcessImageNameW(handle, 0, buffer, &bufSize)) rc = QString::fromUtf16(buffer); +#endif CloseHandle(handle); return rc; } -#endif QList winProcessList() { @@ -67,9 +100,7 @@ QList winProcessList() ProcData procData; procData.ppid = QString::number(pe.th32ProcessID); procData.name = QString::fromUtf16(reinterpret_cast(pe.szExeFile)); -#ifdef USE_PSAPI procData.image = imageName(pe.th32ProcessID); -#endif rc.push_back(procData); } CloseHandle(snapshot); -- cgit v1.2.1