diff options
author | Friedemann Kleint <Friedemann.Kleint@nokia.com> | 2010-03-17 10:57:19 +0100 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@nokia.com> | 2010-03-17 10:57:19 +0100 |
commit | 0146926f199da36b6c61d522eed54f76461a8e52 (patch) | |
tree | d3760120d8184eab286edbd0212c3cf1f7801484 /src/plugins/debugger/shared/dbgwinutils.cpp | |
parent | 3e750afc7333b5e477cc1646c4f59e81acd1e963 (diff) | |
download | qt-creator-0146926f199da36b6c61d522eed54f76461a8e52.tar.gz |
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
Diffstat (limited to 'src/plugins/debugger/shared/dbgwinutils.cpp')
-rw-r--r-- | src/plugins/debugger/shared/dbgwinutils.cpp | 45 |
1 files changed, 38 insertions, 7 deletions
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 <QtCore/QDebug> + #include <windows.h> #include <tlhelp32.h> -#ifdef USE_PSAPI -# include <psapi.h> +#include <psapi.h> + +#ifdef __GNUC__ +# include <QtCore/QLibrary> #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<const ushort*>(buffer)); +#else + if (QueryFullProcessImageNameW(handle, 0, buffer, &bufSize)) rc = QString::fromUtf16(buffer); +#endif CloseHandle(handle); return rc; } -#endif QList<ProcData> winProcessList() { @@ -67,9 +100,7 @@ QList<ProcData> winProcessList() ProcData procData; procData.ppid = QString::number(pe.th32ProcessID); procData.name = QString::fromUtf16(reinterpret_cast<ushort*>(pe.szExeFile)); -#ifdef USE_PSAPI procData.image = imageName(pe.th32ProcessID); -#endif rc.push_back(procData); } CloseHandle(snapshot); |