From f1f4d8e043b17d4c5e25bffce53134293d968aed Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Mon, 7 May 2012 14:00:36 +0200 Subject: add killProcess method - only implemented under windows where it could be needed for update - even the delete file method moves files to temp which can not be removed, it is much safer to kill the process Change-Id: Ide043657d5f74186da02cb18a87072b18910c964 Reviewed-by: Oliver Wolff Reviewed-by: Karsten Heimrich --- src/libs/kdtools/kdsysinfo.h | 1 + src/libs/kdtools/kdsysinfo_mac.cpp | 8 ++++++++ src/libs/kdtools/kdsysinfo_win.cpp | 39 ++++++++++++++++++++++++++++++++++++++ src/libs/kdtools/kdsysinfo_x11.cpp | 8 ++++++++ 4 files changed, 56 insertions(+) (limited to 'src/libs/kdtools') diff --git a/src/libs/kdtools/kdsysinfo.h b/src/libs/kdtools/kdsysinfo.h index be1b76fca..bab32979a 100644 --- a/src/libs/kdtools/kdsysinfo.h +++ b/src/libs/kdtools/kdsysinfo.h @@ -70,6 +70,7 @@ struct ProcessInfo quint64 installedMemory(); QList mountedVolumes(); QList runningProcesses(); +bool killProcess(const ProcessInfo &process, int msecs = 30000); bool pathIsOnLocalDevice(const QString &path); } // namespace KDUpdater diff --git a/src/libs/kdtools/kdsysinfo_mac.cpp b/src/libs/kdtools/kdsysinfo_mac.cpp index 6ec6b6760..e81b88495 100644 --- a/src/libs/kdtools/kdsysinfo_mac.cpp +++ b/src/libs/kdtools/kdsysinfo_mac.cpp @@ -138,4 +138,12 @@ bool pathIsOnLocalDevice(const QString &path) return true; } +bool killProcess(const ProcessInfo &process, int msecs) +{ + Q_UNUSED(process); + Q_UNUSED(msecs); + + return true; +} + } // namespace KDUpdater 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 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; diff --git a/src/libs/kdtools/kdsysinfo_x11.cpp b/src/libs/kdtools/kdsysinfo_x11.cpp index 1a93afb15..5a816dc18 100644 --- a/src/libs/kdtools/kdsysinfo_x11.cpp +++ b/src/libs/kdtools/kdsysinfo_x11.cpp @@ -122,4 +122,12 @@ bool pathIsOnLocalDevice(const QString &path) return true; } +bool killProcess(const ProcessInfo &process, int msecs) +{ + Q_UNUSED(process); + Q_UNUSED(msecs); + + return true; +} + } // namespace KDUpdater -- cgit v1.2.3