Fix MinGW valgrind build

QueryFullProcessImageName is only available on Windows >= Vista.
iSetting _WIN32_WINNT fixes availability on MinGW and moving the
functionality to winutils avoids code duplication.

Change-Id: I0ff1a12a1c092b1ad9cde75b636b52c5b959ce7d
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Oliver Wolff
2018-02-05 12:15:57 +01:00
parent 88a889d45a
commit 74d718c001
4 changed files with 26 additions and 46 deletions

View File

@@ -26,10 +26,10 @@
#include "winutils.h"
#include "qtcassert.h"
// Enable WinAPI Windows XP and later
// Enable WinAPI Windows Vista and later
#ifdef Q_OS_WIN
#undef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#define _WIN32_WINNT 0x0600 // Needed for QueryFullProcessImageName
#include <windows.h>
#endif
@@ -168,6 +168,23 @@ QTCREATOR_UTILS_EXPORT bool is64BitWindowsBinary(const QString &binaryIn)
#endif
}
QTCREATOR_UTILS_EXPORT QString imageName(quint32 processId)
{
QString result;
#ifdef Q_OS_WIN
HANDLE handle = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, processId);
if (handle == NULL)
return result;
wchar_t path[MAX_PATH];
DWORD pathLen = MAX_PATH;
if (QueryFullProcessImageName(handle, 0, path, &pathLen))
result = QString::fromUtf16(reinterpret_cast<const ushort*>(path));
CloseHandle(handle);
#endif
return result;
}
WindowsCrashDialogBlocker::WindowsCrashDialogBlocker()
#ifdef Q_OS_WIN
: silenceErrorMode(SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS),

View File

@@ -44,6 +44,9 @@ QTCREATOR_UTILS_EXPORT bool is64BitWindowsSystem();
// Check for a 64bit binary.
QTCREATOR_UTILS_EXPORT bool is64BitWindowsBinary(const QString &binary);
// Get the path to the executable for a given PID.
QTCREATOR_UTILS_EXPORT QString imageName(quint32 processId);
//
// RAII class to temporarily prevent windows crash messages from popping up using the
// application-global (!) error mode.

View File

@@ -54,40 +54,6 @@ namespace Internal {
#ifdef Q_OS_WIN
// Resolve QueryFullProcessImageNameW out of kernel32.dll due
// to incomplete MinGW import libs and it not being present
// on Windows XP.
static BOOL 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);
}
static QString imageName(DWORD processId)
{
QString rc;
HANDLE handle = OpenProcess(PROCESS_QUERY_INFORMATION , FALSE, processId);
if (handle == INVALID_HANDLE_VALUE)
return rc;
WCHAR buffer[MAX_PATH];
DWORD bufSize = MAX_PATH;
if (queryFullProcessImageName(handle, 0, buffer, &bufSize))
rc = QString::fromUtf16(reinterpret_cast<const ushort*>(buffer));
CloseHandle(handle);
return rc;
}
LocalProcessList::LocalProcessList(const IDevice::ConstPtr &device, QObject *parent)
: DeviceProcessList(device, parent)
, m_myPid(GetCurrentProcessId())
@@ -108,7 +74,7 @@ QList<DeviceProcessItem> LocalProcessList::getLocalProcesses()
DeviceProcessItem p;
p.pid = pe.th32ProcessID;
// Image has the absolute path, but can fail.
const QString image = imageName(pe.th32ProcessID);
const QString image = Utils::imageName(pe.th32ProcessID);
p.exe = p.cmdLine = image.isEmpty() ?
QString::fromWCharArray(pe.szExeFile) :
image;

View File

@@ -98,6 +98,8 @@
#include <QStandardPaths>
#include <QWinEventNotifier>
#include <utils/winutils.h>
#include <windows.h>
#endif
@@ -1503,15 +1505,7 @@ void HeobData::processFinished()
debugger->setStartMode(AttachExternal);
debugger->setCloseMode(DetachAtClose);
debugger->setContinueAfterAttach(true);
HANDLE p = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, m_data[1]);
if (p != NULL) {
wchar_t path[MAX_PATH];
DWORD pathLen = MAX_PATH;
if (QueryFullProcessImageName(p, 0, path, &pathLen))
debugger->setInferiorExecutable(QString::fromWCharArray(path));
CloseHandle(p);
}
debugger->setInferiorExecutable(Utils::imageName(m_data[1]));
connect(m_runControl, &RunControl::started, this, &HeobData::debugStarted);
connect(m_runControl, &RunControl::stopped, this, &HeobData::debugStopped);