From 1f09c6bc4568b80649d1102edad0a111a7b01aa3 Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Fri, 22 Oct 2010 14:03:25 +0200
Subject: [PATCH] Debugger/Windows: Do not attach to process being debugged.

Reviewed-by: Robert Loehning <robert.loehning@nokia.com>
Task-number: QTCREATORBUG-2086
---
 src/plugins/debugger/debuggerdialogs.cpp    | 15 +++++++++++++++
 src/plugins/debugger/debuggerdialogs.h      |  2 ++
 src/plugins/debugger/shared/dbgwinutils.cpp | 11 +++++++++++
 src/plugins/debugger/shared/dbgwinutils.h   |  2 ++
 4 files changed, 30 insertions(+)

diff --git a/src/plugins/debugger/debuggerdialogs.cpp b/src/plugins/debugger/debuggerdialogs.cpp
index a5431e584bf..370b18ea183 100644
--- a/src/plugins/debugger/debuggerdialogs.cpp
+++ b/src/plugins/debugger/debuggerdialogs.cpp
@@ -55,6 +55,7 @@
 #include <QtGui/QPushButton>
 #include <QtGui/QProxyModel>
 #include <QtGui/QSortFilterProxyModel>
+#include <QtGui/QMessageBox>
 
 using namespace Utils;
 
@@ -424,6 +425,20 @@ void AttachExternalDialog::pidChanged(const QString &pid)
     okButton()->setEnabled(enabled);
 }
 
+void AttachExternalDialog::accept()
+{
+#ifdef Q_OS_WIN
+    const qint64 pid = attachPID();
+    if (pid && isWinProcessBeingDebugged(pid)) {
+        QMessageBox::warning(this, tr("Process Already Under Debugger Control"),
+                             tr("The process %1 is already under the control of a debugger.\n"
+                                "Qt Creator cannot attach to it.").arg(pid));
+        return;
+    }
+#endif
+    QDialog::accept();
+}
+
 
 ///////////////////////////////////////////////////////////////////////
 //
diff --git a/src/plugins/debugger/debuggerdialogs.h b/src/plugins/debugger/debuggerdialogs.h
index 1cc868af4fe..e9b9b2f9154 100644
--- a/src/plugins/debugger/debuggerdialogs.h
+++ b/src/plugins/debugger/debuggerdialogs.h
@@ -92,6 +92,8 @@ public:
     qint64 attachPID() const;
     QString executable() const;
 
+    virtual void accept();
+
 private slots:
     void rebuildProcessList();
     void procSelected(const QModelIndex &index);
diff --git a/src/plugins/debugger/shared/dbgwinutils.cpp b/src/plugins/debugger/shared/dbgwinutils.cpp
index e4de625e22c..1c5a1d210e9 100644
--- a/src/plugins/debugger/shared/dbgwinutils.cpp
+++ b/src/plugins/debugger/shared/dbgwinutils.cpp
@@ -242,5 +242,16 @@ QString winNormalizeFileName(const QString &f)
     return rc.isEmpty() ? f : rc;
 }
 
+bool isWinProcessBeingDebugged(unsigned long pid)
+{
+    HANDLE processHandle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);
+    if (processHandle == NULL)
+        return false;
+    BOOL debugged = FALSE;
+    CheckRemoteDebuggerPresent(processHandle, &debugged);
+    CloseHandle(processHandle);
+    return debugged != FALSE;
+}
+
 } // namespace Internal
 } // namespace Debugger
diff --git a/src/plugins/debugger/shared/dbgwinutils.h b/src/plugins/debugger/shared/dbgwinutils.h
index 573c7ebd65e..8f841acd5cc 100644
--- a/src/plugins/debugger/shared/dbgwinutils.h
+++ b/src/plugins/debugger/shared/dbgwinutils.h
@@ -57,6 +57,8 @@ unsigned long winGetCurrentProcessId();
 
 QString winNormalizeFileName(const QString &f);
 
+bool isWinProcessBeingDebugged(unsigned long pid);
+
 } // namespace Internal
 } // namespace Debugger
 
-- 
GitLab