summaryrefslogtreecommitdiffstats
path: root/src/libs/kdtools/kdsysinfo_win.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/kdtools/kdsysinfo_win.cpp')
-rw-r--r--src/libs/kdtools/kdsysinfo_win.cpp39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/libs/kdtools/kdsysinfo_win.cpp b/src/libs/kdtools/kdsysinfo_win.cpp
index 92d87d680..3e99e3925 100644
--- a/src/libs/kdtools/kdsysinfo_win.cpp
+++ b/src/libs/kdtools/kdsysinfo_win.cpp
@@ -210,6 +210,45 @@ QList<ProcessInfo> runningProcesses()
return param.processes;
}
+bool CALLBACK TerminateAppEnum(HWND hwnd, LPARAM lParam)
+{
+ DWORD dwID;
+ GetWindowThreadProcessId(hwnd, &dwID);
+
+ if (dwID == (DWORD)lParam)
+ PostMessage(hwnd, WM_CLOSE, 0, 0);
+
+ return true;
+}
+
+bool killProcess(const ProcessInfo &process, int msecs)
+{
+ DWORD dwTimeout = msecs;
+ if (msecs == -1)
+ dwTimeout = INFINITE;
+
+ // If we can't open the process with PROCESS_TERMINATE rights,
+ // then we give up immediately.
+ HANDLE hProc = OpenProcess(SYNCHRONIZE | PROCESS_TERMINATE, FALSE, process.id);
+
+ if (hProc == 0)
+ return false;
+
+ // TerminateAppEnum() posts WM_CLOSE to all windows whose PID
+ // matches your process's.
+ EnumWindows((WNDENUMPROC)TerminateAppEnum, (LPARAM)process.id);
+
+ // Wait on the handle. If it signals, great. If it times out,
+ // then you kill it.
+ bool returnValue = false;
+ if (WaitForSingleObject(hProc, dwTimeout) != WAIT_OBJECT_0)
+ returnValue = TerminateProcess(hProc, 0);
+
+ CloseHandle(hProc) ;
+
+ return returnValue;
+}
+
// REPARSE_DATA_BUFFER structure from msdn help: http://msdn.microsoft.com/en-us/library/ff552012.aspx
typedef struct _REPARSE_DATA_BUFFER {
ULONG ReparseTag;