Code polishing, continuing cb23999fbf

Add more error messages to processes run for toolchain detection.
Move Windows-specific code to dbgwinutils, remove inclusion of
<windows.h>. Fix MinGW gcc 4.5 warnings.
This commit is contained in:
Friedemann Kleint
2010-09-09 09:58:17 +02:00
parent f63b316728
commit 97e7c12e3c
12 changed files with 141 additions and 61 deletions

View File

@@ -31,8 +31,19 @@
#include "debuggerdialogs.h"
#include <QtCore/QDebug>
#include <QtCore/QString>
#ifdef Q_OS_WIN
# ifdef __GNUC__ // Required for OpenThread under MinGW
# define _WIN32_WINNT 0x0502
# endif // __GNUC__
# include <windows.h>
# include <utils/winutils.h>
# if !defined(PROCESS_SUSPEND_RESUME) // Check flag for MinGW
# define PROCESS_SUSPEND_RESUME (0x0800)
# endif // PROCESS_SUSPEND_RESUME
#endif // Q_OS_WIN
#include <windows.h>
#include <tlhelp32.h>
#include <psapi.h>
#include <QtCore/QLibrary>
@@ -98,5 +109,63 @@ QList<ProcData> winProcessList()
return rc;
}
bool winResumeThread(unsigned long dwThreadId, QString *errorMessage)
{
bool ok = false;
HANDLE handle = NULL;
do {
if (!dwThreadId)
break;
handle = OpenThread(SYNCHRONIZE |THREAD_QUERY_INFORMATION |THREAD_SUSPEND_RESUME,
FALSE, dwThreadId);
if (handle==NULL) {
*errorMessage = QString::fromLatin1("Unable to open thread %1: %2").
arg(dwThreadId).arg(Utils::winErrorMessage(GetLastError()));
break;
}
if (ResumeThread(handle) == DWORD(-1)) {
*errorMessage = QString::fromLatin1("Unable to resume thread %1: %2").
arg(dwThreadId).arg(Utils::winErrorMessage(GetLastError()));
break;
}
ok = true;
} while (false);
if (handle != NULL)
CloseHandle(handle);
return ok;
}
// Open the process and break into it
bool winDebugBreakProcess(unsigned long pid, QString *errorMessage)
{
bool ok = false;
HANDLE inferior = NULL;
do {
const DWORD rights = PROCESS_QUERY_INFORMATION|PROCESS_SET_INFORMATION
|PROCESS_VM_OPERATION|PROCESS_VM_WRITE|PROCESS_VM_READ
|PROCESS_DUP_HANDLE|PROCESS_TERMINATE|PROCESS_CREATE_THREAD|PROCESS_SUSPEND_RESUME ;
inferior = OpenProcess(rights, FALSE, pid);
if (inferior == NULL) {
*errorMessage = QString::fromLatin1("Cannot open process %1: %2").
arg(pid).arg(Utils::winErrorMessage(GetLastError()));
break;
}
if (!DebugBreakProcess(inferior)) {
*errorMessage = QString::fromLatin1("DebugBreakProcess failed: %1").arg(Utils::winErrorMessage(GetLastError()));
break;
}
ok = true;
} while (false);
if (inferior != NULL)
CloseHandle(inferior);
return ok;
}
unsigned long winGetCurrentProcessId()
{
return GetCurrentProcessId();
}
} // namespace Internal
} // namespace Debugger