diff --git a/core/org.eclipse.cdt.core.win32/library/starter/killer.cpp b/core/org.eclipse.cdt.core.win32/library/starter/killer.cpp deleted file mode 100644 index 69e345ffe96..00000000000 --- a/core/org.eclipse.cdt.core.win32/library/starter/killer.cpp +++ /dev/null @@ -1,269 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2002 - 2005 QNX Software Systems and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * QNX Software Systems - initial API and implementation - * - * starter.cpp - * - * This is a helper function for the process killing - * Implementation based on the article "Terminating Windows Processes" - * see http://www.alexfedotov.com/articles/killproc.asp -***********************************************************************/ - - - -#define STRICT -#include -#include -#include -#include -#include - -#include "killer.h" - -#define SystemProcessesAndThreadsInformation 5 - -#define MAX_CMD_LINE_LENGTH 512 - -//#define DEBUG_MONITOR - -void DisplayErrorMessage(); - -BOOL KillProcessEx( - IN DWORD dwProcessId // Handle of the process - ) -{ - - OSVERSIONINFO osvi; - DWORD dwError; -#ifdef DEBUG_MONITOR - _TCHAR buffer[MAX_CMD_LINE_LENGTH]; -#endif - - // determine operating system version - osvi.dwOSVersionInfoSize = sizeof(osvi); - GetVersionEx(&osvi); - - if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) - { - HINSTANCE hNtDll; - NTSTATUS (WINAPI * pZwQuerySystemInformation)(UINT, PVOID, - ULONG, PULONG); - - // get NTDLL.DLL handle - hNtDll = GetModuleHandleW(_T("ntdll.dll")); - if(hNtDll == NULL) { -#ifdef DEBUG_MONITOR - _stprintf(buffer, _T("Failed to get ntdll.dll handle")); - OutputDebugStringW(buffer); -#endif - return FALSE; - } - - // find address of ZwQuerySystemInformation - *(FARPROC *)&pZwQuerySystemInformation = - GetProcAddress(hNtDll, "ZwQuerySystemInformation"); - if (pZwQuerySystemInformation == NULL) - return SetLastError(ERROR_PROC_NOT_FOUND), NULL; - - // get default process heap handle - HANDLE hHeap = GetProcessHeap(); - - NTSTATUS Status; - ULONG cbBuffer = 0x8000; - PVOID pBuffer = NULL; - - // it is difficult to predict what buffer size will be - // enough, so we start with 32K buffer and increase its - // size as needed - do - { - pBuffer = HeapAlloc(hHeap, 0, cbBuffer); - if (pBuffer == NULL) - return SetLastError(ERROR_NOT_ENOUGH_MEMORY), FALSE; - - Status = pZwQuerySystemInformation( - SystemProcessesAndThreadsInformation, - pBuffer, cbBuffer, NULL); - - if (Status == STATUS_INFO_LENGTH_MISMATCH) - { - HeapFree(hHeap, 0, pBuffer); - cbBuffer *= 2; - } - else if (!NT_SUCCESS(Status)) - { - HeapFree(hHeap, 0, pBuffer); - return SetLastError(Status), NULL; - } - } - while (Status == STATUS_INFO_LENGTH_MISMATCH); - - // call the helper - dwError = KillProcessTreeNtHelper( - (PSYSTEM_PROCESS_INFORMATION)pBuffer, - dwProcessId); - - HeapFree(hHeap, 0, pBuffer); - } - else - { - // call the helper - dwError = KillProcessTreeWinHelper(dwProcessId); - } - - SetLastError(dwError); - return dwError == ERROR_SUCCESS; -} - -// Heloer function for process killing - -static BOOL KillProcess( - IN DWORD dwProcessId - ) -{ - // get process handle - HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, dwProcessId); - if (hProcess == NULL) - return FALSE; - - DWORD dwError = ERROR_SUCCESS; - - // try to terminate the process - if (!TerminateProcess(hProcess, (DWORD)-1)) - dwError = GetLastError(); - - // close process handle - CloseHandle(hProcess); - - SetLastError(dwError); -#ifdef DEBUG_MONITOR - if(dwError != ERROR_SUCCESS) { - _stprintf(buffer, _T("Process %i killed"), dwProcessId); - OutputDebugStringW(buffer); - } else { - _stprintf(buffer, _T("Failed to kill process %i"), dwProcessId); - OutputDebugStringW(buffer); - DisplayMessage(); - } -#endif - return dwError == ERROR_SUCCESS; -} - -// a helper function that walks a process tree recursively -// on Windows NT and terminates all processes in the tree -static BOOL KillProcessTreeNtHelper( - IN PSYSTEM_PROCESS_INFORMATION pInfo, - IN DWORD dwProcessId - ) -{ -#ifdef DEBUG_MONITOR - _TCHAR buffer[MAX_CMD_LINE_LENGTH]; -#endif - if(pInfo == NULL) { -#ifdef DEBUG_MONITOR - _stprintf(buffer, _T("KillProcessTreeNtHelper: wrong parameter")); - OutputDebugStringW(buffer); -#endif - return FALSE; - } - - - // terminate all children first - for (;;) - { - if (pInfo->InheritedFromProcessId == dwProcessId) - KillProcessTreeNtHelper(pInfo, pInfo->ProcessId); - - if (pInfo->NextEntryDelta == 0) - break; - - // find address of the next structure - pInfo = (PSYSTEM_PROCESS_INFORMATION)(((PUCHAR)pInfo) - + pInfo->NextEntryDelta); - } - - // terminate the specified process - if (!KillProcess(dwProcessId)) - return GetLastError(); - - return ERROR_SUCCESS; -} - -// a helper function that walks a process tree recursively -// on Windows 9x and terminates all processes in the tree -static BOOL KillProcessTreeWinHelper( - IN DWORD dwProcessId - ) -{ -#ifdef DEBUG_MONITOR - _TCHAR buffer[MAX_CMD_LINE_LENGTH]; -#endif - HINSTANCE hKernel; - HANDLE (WINAPI * pCreateToolhelp32Snapshot)(DWORD, DWORD); - BOOL (WINAPI * pProcess32First)(HANDLE, PROCESSENTRY32 *); - BOOL (WINAPI * pProcess32Next)(HANDLE, PROCESSENTRY32 *); - - // get KERNEL32.DLL handle - hKernel = GetModuleHandleW(_T("kernel32.dll")); - if(hKernel == NULL) { -#ifdef DEBUG_MONITOR - _stprintf(buffer, _T("KillProcessTreeNtHelper: wrong parameter")); - OutputDebugStringW(buffer); -#endif - return FALSE; - } - - // find necessary entrypoints in KERNEL32.DLL - *(FARPROC *)&pCreateToolhelp32Snapshot = - GetProcAddress(hKernel, "CreateToolhelp32Snapshot"); - *(FARPROC *)&pProcess32First = - GetProcAddress(hKernel, "Process32First"); - *(FARPROC *)&pProcess32Next = - GetProcAddress(hKernel, "Process32Next"); - - if (pCreateToolhelp32Snapshot == NULL || - pProcess32First == NULL || - pProcess32Next == NULL) - return ERROR_PROC_NOT_FOUND; - - HANDLE hSnapshot; - PROCESSENTRY32 Entry; - - // create a snapshot of all processes - hSnapshot = pCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); - if (hSnapshot == INVALID_HANDLE_VALUE) - return GetLastError(); - - Entry.dwSize = sizeof(Entry); - if (!pProcess32First(hSnapshot, &Entry)) - { - DWORD dwError = GetLastError(); - CloseHandle(hSnapshot); - return dwError; - } - - // terminate children first - do - { - if (Entry.th32ParentProcessID == dwProcessId) - KillProcessTreeWinHelper(Entry.th32ProcessID); - - Entry.dwSize = sizeof(Entry); - } - while (pProcess32Next(hSnapshot, &Entry)); - - CloseHandle(hSnapshot); - - // terminate the specified process - if (!KillProcess(dwProcessId)) - return GetLastError(); - - return ERROR_SUCCESS; -} - diff --git a/core/org.eclipse.cdt.core.win32/library/starter/killer.h b/core/org.eclipse.cdt.core.win32/library/starter/killer.h deleted file mode 100644 index 9b8b1368139..00000000000 --- a/core/org.eclipse.cdt.core.win32/library/starter/killer.h +++ /dev/null @@ -1,122 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2002 - 2005 QNX Software Systems and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * QNX Software Systems - initial API and implementation - * - * StdAfx.h - * - * This is a header file for helper function for the process killing - * Implementation based on the article "Terminating Windows Processes" - * see http://www.alexfedotov.com/articles/killproc.asp and - * http://www.alexfedotov.com/samples/threads.asp -***********************************************************************/ - -#if !defined(_KILLER_H_INCLUDED_) -#define _KILLER_H_INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#include - - -typedef LONG KPRIORITY; // From ntddk.h - -// -// Process Virtual Memory Counters -// NtQueryInformationProcess using ProcessVmCounters -// From ntddk.h - -typedef struct _VM_COUNTERS { - SIZE_T PeakVirtualSize; - SIZE_T VirtualSize; - ULONG PageFaultCount; - SIZE_T PeakWorkingSetSize; - SIZE_T WorkingSetSize; - SIZE_T QuotaPeakPagedPoolUsage; - SIZE_T QuotaPagedPoolUsage; - SIZE_T QuotaPeakNonPagedPoolUsage; - SIZE_T QuotaNonPagedPoolUsage; - SIZE_T PagefileUsage; - SIZE_T PeakPagefileUsage; -} VM_COUNTERS; -typedef VM_COUNTERS *PVM_COUNTERS; - -// -// ClientId -// - -typedef struct _CLIENT_ID { - HANDLE UniqueProcess; - HANDLE UniqueThread; -} CLIENT_ID; -typedef CLIENT_ID *PCLIENT_ID; - -typedef struct _SYSTEM_THREAD_INFORMATION { - LARGE_INTEGER KernelTime; // time spent in kernel mode - LARGE_INTEGER UserTime; // time spent in user mode - LARGE_INTEGER CreateTime; // thread creation time - ULONG WaitTime; // wait time - PVOID StartAddress; // start address - CLIENT_ID ClientId; // thread and process IDs - KPRIORITY Priority; // dynamic priority - KPRIORITY BasePriority; // base priority - ULONG ContextSwitchCount; // number of context switches - LONG State; // current state - LONG WaitReason; // wait reason -} SYSTEM_THREAD_INFORMATION, * PSYSTEM_THREAD_INFORMATION; - -typedef struct _SYSTEM_PROCESS_INFORMATION { - ULONG NextEntryDelta; // offset to the next entry - ULONG ThreadCount; // number of threads - ULONG Reserved1[6]; // reserved - LARGE_INTEGER CreateTime; // process creation time - LARGE_INTEGER UserTime; // time spent in user mode - LARGE_INTEGER KernelTime; // time spent in kernel mode - UNICODE_STRING ProcessName; // process name - KPRIORITY BasePriority; // base process priority - ULONG ProcessId; // process identifier - ULONG InheritedFromProcessId; // parent process identifier - ULONG HandleCount; // number of handles - ULONG Reserved2[2]; // reserved - VM_COUNTERS VmCounters; // virtual memory counters -#if _WIN32_WINNT >= 0x500 - IO_COUNTERS IoCounters; // i/o counters -#endif - SYSTEM_THREAD_INFORMATION Threads[1]; // threads -} SYSTEM_PROCESS_INFORMATION, * PSYSTEM_PROCESS_INFORMATION; - - -static BOOL KillProcessTreeNtHelper( - IN PSYSTEM_PROCESS_INFORMATION pInfo, - IN DWORD dwProcessId); - -static BOOL KillProcessTreeWinHelper( - IN DWORD dwProcessId); - -// From ntstatus.h -// MessageId: STATUS_INFO_LENGTH_MISMATCH -// -// MessageText: -// -// The specified information record length does not match the length required for the specified information class. -// -#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L) - -// From ntstatus.h -// Generic test for success on any status value (non-negative numbers -// indicate success). -// - -#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0) - - - - -#endif // _KILLER_H_INCLUDED_ \ No newline at end of file diff --git a/core/org.eclipse.cdt.core.win32/library/starter/starter.cpp b/core/org.eclipse.cdt.core.win32/library/starter/starter.cpp index 9ea10f52569..b353aebfa17 100644 --- a/core/org.eclipse.cdt.core.win32/library/starter/starter.cpp +++ b/core/org.eclipse.cdt.core.win32/library/starter/starter.cpp @@ -29,7 +29,7 @@ int copyTo(_TCHAR * target, const _TCHAR * source, int cpyLength, int availSpace); void DisplayErrorMessage(); -BOOL KillProcessEx(DWORD dwProcessId); // Handle of the process +//BOOL KillProcessEx(DWORD dwProcessId); // Handle of the process /////////////////////////////////////////////////////////////////////////////// BOOL WINAPI HandlerRoutine( DWORD dwCtrlType) // control signal type @@ -214,7 +214,7 @@ extern "C" int _tmain(int argc, _TCHAR * argv[]) { OutputDebugStringW(buffer); #endif // Create job object if it is possible - HMODULE hKernel = GetModuleHandle("kernel32.dll"); + HMODULE hKernel = GetModuleHandle(L"kernel32.dll"); HANDLE hJob = NULL; HANDLE (WINAPI * pCreateJobObject)(LPSECURITY_ATTRIBUTES lpJobAttributes, char * lpName); @@ -297,12 +297,6 @@ extern "C" int _tmain(int argc, _TCHAR * argv[]) { } } } else - if(!KillProcessEx(pi.dwProcessId)) { -#ifdef DEBUG_MONITOR - _stprintf(buffer, _T("Cannot kill process (PID %i) tree\n"), pi.dwProcessId); - OutputDebugStringW(buffer); -#endif - } exitProc = TRUE; break; default: diff --git a/core/org.eclipse.cdt.core.win32/os/win32/x86/starter.exe b/core/org.eclipse.cdt.core.win32/os/win32/x86/starter.exe index 3bc462c0f01..d436988369f 100644 Binary files a/core/org.eclipse.cdt.core.win32/os/win32/x86/starter.exe and b/core/org.eclipse.cdt.core.win32/os/win32/x86/starter.exe differ