aboutsummaryrefslogtreecommitdiffstats
path: root/src/tools/qtcdebugger/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/qtcdebugger/main.cpp')
-rw-r--r--src/tools/qtcdebugger/main.cpp47
1 files changed, 39 insertions, 8 deletions
diff --git a/src/tools/qtcdebugger/main.cpp b/src/tools/qtcdebugger/main.cpp
index 73f781135c6..b58b012041f 100644
--- a/src/tools/qtcdebugger/main.cpp
+++ b/src/tools/qtcdebugger/main.cpp
@@ -70,6 +70,9 @@ static const char creatorBinaryC[] = "qtcreator.exe";
enum Mode { HelpMode, RegisterMode, UnregisterMode, PromptMode, ForceCreatorMode, ForceDefaultMode };
Mode optMode = PromptMode;
+// WOW: Indicates registry key access mode:
+// - Accessing 32bit using a 64bit built Qt Creator or,
+// - Accessing 64bit using a 32bit built Qt Creator on 64bit Windows
bool optIsWow = false;
bool noguiMode = false;
unsigned long argProcessId = 0;
@@ -172,6 +175,14 @@ static void usage(const QString &binary, const QString &message = QString())
msgBox.exec();
}
+static bool is64BitWindowsSystem() // Courtesy utils library
+{
+ SYSTEM_INFO systemInfo;
+ GetNativeSystemInfo(&systemInfo);
+ return systemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64
+ || systemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64;
+}
+
// ------- Registry helpers
static inline bool registryWriteBinaryKey(HKEY handle,
@@ -303,8 +314,15 @@ bool readDefaultDebugger(QString *defaultDebugger,
{
bool success = false;
HKEY handle;
- if (openRegistryKey(HKEY_LOCAL_MACHINE, optIsWow ? debuggerWow32RegistryKeyC : debuggerRegistryKeyC,
- false, &handle, errorMessage)) {
+ const RegistryAccess::AccessMode accessMode = optIsWow
+#ifdef Q_OS_WIN64
+ ? RegistryAccess::Registry32Mode
+#else
+ ? RegistryAccess::Registry64Mode
+#endif
+ : RegistryAccess::DefaultAccessMode;
+
+ if (openRegistryKey(HKEY_LOCAL_MACHINE, debuggerRegistryKeyC, false, &handle, accessMode, errorMessage)) {
success = registryReadStringKey(handle, debuggerRegistryDefaultValueNameC,
defaultDebugger, errorMessage);
RegCloseKey(handle);
@@ -372,12 +390,13 @@ bool chooseDebugger(QString *errorMessage)
static bool registerDebuggerKey(const WCHAR *key,
const QString &call,
+ RegistryAccess::AccessMode access,
QString *errorMessage)
{
HKEY handle = 0;
bool success = false;
do {
- if (!openRegistryKey(HKEY_LOCAL_MACHINE, key, true, &handle, errorMessage))
+ if (!openRegistryKey(HKEY_LOCAL_MACHINE, key, true, &handle, access, errorMessage))
break;
// Save old key, which might be missing
QString oldDebugger;
@@ -401,11 +420,16 @@ static bool registerDebuggerKey(const WCHAR *key,
bool install(QString *errorMessage)
{
- if (!registerDebuggerKey(debuggerRegistryKeyC, debuggerCall(), errorMessage))
+ if (!registerDebuggerKey(debuggerRegistryKeyC, debuggerCall(), RegistryAccess::DefaultAccessMode, errorMessage))
return false;
#ifdef Q_OS_WIN64
- if (!registerDebuggerKey(debuggerWow32RegistryKeyC, debuggerCall(QLatin1String("-wow")), errorMessage))
+ if (!registerDebuggerKey(debuggerRegistryKeyC, debuggerCall(QLatin1String("-wow")), RegistryAccess::Registry32Mode, errorMessage))
return false;
+#else
+ if (is64BitWindowsSystem()) {
+ if (!registerDebuggerKey(debuggerRegistryKeyC, debuggerCall(QLatin1String("-wow")), RegistryAccess::Registry64Mode, errorMessage))
+ return false;
+ }
#endif
return true;
}
@@ -413,12 +437,13 @@ bool install(QString *errorMessage)
// Unregister helper: Restore the original debugger key
static bool unregisterDebuggerKey(const WCHAR *key,
const QString &call,
+ RegistryAccess::AccessMode access,
QString *errorMessage)
{
HKEY handle = 0;
bool success = false;
do {
- if (!openRegistryKey(HKEY_LOCAL_MACHINE, key, true, &handle, errorMessage))
+ if (!openRegistryKey(HKEY_LOCAL_MACHINE, key, true, &handle, access, errorMessage))
break;
QString debugger;
if (!isRegistered(handle, call, errorMessage, &debugger) && !debugger.isEmpty()) {
@@ -448,12 +473,18 @@ static bool unregisterDebuggerKey(const WCHAR *key,
bool uninstall(QString *errorMessage)
{
- if (!unregisterDebuggerKey(debuggerRegistryKeyC, debuggerCall(), errorMessage))
+ if (!unregisterDebuggerKey(debuggerRegistryKeyC, debuggerCall(), RegistryAccess::DefaultAccessMode, errorMessage))
return false;
#ifdef Q_OS_WIN64
- if (!unregisterDebuggerKey(debuggerWow32RegistryKeyC, debuggerCall(QLatin1String("-wow")), errorMessage))
+ if (!unregisterDebuggerKey(debuggerRegistryKeyC, debuggerCall(QLatin1String("-wow")), RegistryAccess::Registry32Mode, errorMessage))
return false;
+#else
+ if (is64BitWindowsSystem()) {
+ if (!unregisterDebuggerKey(debuggerRegistryKeyC, debuggerCall(QLatin1String("-wow")), RegistryAccess::Registry64Mode, errorMessage))
+ return false;
+ }
#endif
+
return true;
}