From 2ba5d92ebbb666a51196dd1facab207a60ab86ee Mon Sep 17 00:00:00 2001 From: Doug Schaefer Date: Tue, 2 May 2006 20:11:25 +0000 Subject: [PATCH] Removed killer.cpp. --- .../library/starter/killer.cpp | 269 ------------------ .../library/starter/killer.h | 122 -------- .../library/starter/starter.cpp | 10 +- .../os/win32/x86/starter.exe | Bin 16384 -> 8192 bytes 4 files changed, 2 insertions(+), 399 deletions(-) delete mode 100644 core/org.eclipse.cdt.core.win32/library/starter/killer.cpp delete mode 100644 core/org.eclipse.cdt.core.win32/library/starter/killer.h 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 3bc462c0f018fe9eb946781af9d2ee10608a872d..d436988369fd16eaf642d8cca575adeb819b91dc 100644 GIT binary patch literal 8192 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 literal 16384 zcmeHNe~=qh9sed5;o4qJ)Qdz~B$O?-QqH3(w0JG%yvuQgE6uMKgc2Rgf%@4ol_`M%%Jd;2!Kvm0*NLrp|v12IOlA1yz;`uT%T<4}L}(jR}6o}BmG zW&16C&s`RlQU!Nj&TWz7!|tJYHk(u2n?<**X5Fc*yL)5EJ)BF3Z3`F97wVyReIr;t zGQIX>gC0G7?a9O7H@?2|9x|Mcfh{tE5ikFM6`!PJn%eczv{ z-$&GEX`**){_ckE6xl5cEEf&;t4fqj*pw@wl+BtSK>q&ULXYLFhIY4c(DxH z3^Q6`g|HpO5s5uT5adM zcqpx^OCq`j!J>)1&w9CrQ6`R*&WxfqR(IfvFQ*rNV4r7g_4jAJuXVyZPZ7D=mI2H@!4;@otAlB)garp;ID$wK zQC>mSy!igwp|c!pTd8U;a7$pO*#??9$lh0Ed(!gw&FZ|p1qH65& zLxbg}TlG2EIr*~Hz+Zbxm_oP6F1%-{HY&V{zSbO&Mz7}Am16ieriA;9NmjgT!3F8I zH1i8G4-@SHVFoIc>N(??E_Vy9MRq~5ybM+jyw{@b_f)>((k==zXNFtXU|8vHv##S; z+>S^5m9>0MOkMx7@Ag z-ZTZ5)}G>FTk>#s{;Zq8I=me}MIw%oU7j-ltJPDjj0j=Ruao5!cWBpyk;aesD8v?+8iNkCjY=+b5?dj-C=MI%xem9R?z{eU403j#_IT8vUw@D&s6PdD|aEl7H;1omEST_1)*M7|yIEcgXs zA3Y0OfG%KoK2$*WvT_e^5Juz0f57NfZiM(1V{HE%qX3L%iVQ{vV5D8u%geN+EfIE% zHzA{mV&lB38>&cpnqOk}(Y>$^rQb4``@lrgZyLK{p zIo}MhF6QIXCUz7$7p}cke14IoKgc&I{seVQ9557QFt zD*o}By$#Qe?fR*byUKx3i{lq8+{l$R0@^Z5Qmc`0v;lkQL?S{7?X@g4n+`55dr6&Jc!Vr>@} z3cO*?hal7zE(TM^ZSw)0bLrf}_j86GT?Vc;#sjXip-XCu^gIS*&b>Tdjqes#TR zj8l!@NFHwG0es^X-?*P$;{a3fo$^M5qa z$kf+rue{CIU3=O0GMq-a-Z!Z=YxBw*j$)Ix!)+60T&ywmD07ZL&z9b+pZDO5J*0`B zEL2-$SbC~sV@KX|u%(ad_WN))4-)|s0TTfe0TY1+0#9CsM{Up%&~HJ10^yGVwSolD zD$o}}5l{kjH|Xo2CqPeuo(KIN^cT?l%ZXf|b`U@M&_+OmpfpGUZ3pcFeGT+D=n2r% zphKW>(CeUS5dT2nV$f$nYd|-G20@L3KjrPgJ^C>a@to_&_3$M((ZC$p1CR|scE00( zvHovcdc}CYM;1k*Z|eQdOeQx(Uds)l;+JznVxhn-i0-h4M5QlYP<*nSlZmcxSac>5 zGOUO`!zCMX2{j}3#5$+LE5=MDMSms43KNi=2MI#f_{u=@k=WkihmRqL?fKyO(ahNrl8NWyGw2t~SrVI%en6cd3U z^-}ChLwN;BDxys5t-6r5P%M^@#bR4i*_0w?? F{{+zamdgMD