From 11cdde2cd3eee2fc727e939470e7a5fa9d3da0ff Mon Sep 17 00:00:00 2001 From: Alain Magloire Date: Fri, 13 Aug 2004 20:23:05 +0000 Subject: [PATCH] 2004-0813 Alex Chapiro Fix for PR PR 71601 * os/win32/x86/spawner.dll * os/win32/x86/starter.exe * library/Win32ProcessEx.c * library/starter/killer.cpp * library/starter/killer.h * library/starter/starter.cpp * library/starter/starter.dsp * library/starter/starter.dsw --- core/org.eclipse.cdt.core.win32/ChangeLog | 13 + .../library/Win32ProcessEx.c | 1 + .../library/starter/killer.cpp | 269 ++++++++++++++++++ .../library/starter/killer.h | 122 ++++++++ .../library/starter/starter.cpp | 54 +++- .../library/starter/starter.dsp | 98 +++++++ .../library/starter/starter.dsw | 29 ++ .../os/win32/x86/spawner.dll | Bin 61440 -> 61440 bytes .../os/win32/x86/starter.exe | Bin 16384 -> 16384 bytes 9 files changed, 581 insertions(+), 5 deletions(-) create mode 100644 core/org.eclipse.cdt.core.win32/library/starter/killer.cpp create mode 100644 core/org.eclipse.cdt.core.win32/library/starter/killer.h create mode 100644 core/org.eclipse.cdt.core.win32/library/starter/starter.dsp create mode 100644 core/org.eclipse.cdt.core.win32/library/starter/starter.dsw diff --git a/core/org.eclipse.cdt.core.win32/ChangeLog b/core/org.eclipse.cdt.core.win32/ChangeLog index 4c4ef9577b5..db16070fca9 100644 --- a/core/org.eclipse.cdt.core.win32/ChangeLog +++ b/core/org.eclipse.cdt.core.win32/ChangeLog @@ -1,3 +1,16 @@ +2004-0813 Alex Chapiro + + Fix for PR PR 71601 + + * os/win32/x86/spawner.dll + * os/win32/x86/starter.exe + * library/Win32ProcessEx.c + * library/starter/killer.cpp + * library/starter/killer.h + * library/starter/starter.cpp + * library/starter/starter.dsp + * library/starter/starter.dsw + 2004-07-20 Alex Chapiro Fix for PR 70359 diff --git a/core/org.eclipse.cdt.core.win32/library/Win32ProcessEx.c b/core/org.eclipse.cdt.core.win32/library/Win32ProcessEx.c index 3971fd2dd9a..1dd173c06e2 100644 --- a/core/org.eclipse.cdt.core.win32/library/Win32ProcessEx.c +++ b/core/org.eclipse.cdt.core.win32/library/Win32ProcessEx.c @@ -508,6 +508,7 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec1 flags = CREATE_NEW_CONSOLE; + flags |= CREATE_UNICODE_ENVIRONMENT; ret = CreateProcessW(0, /* executable name */ szCmdLine, /* command line */ diff --git a/core/org.eclipse.cdt.core.win32/library/starter/killer.cpp b/core/org.eclipse.cdt.core.win32/library/starter/killer.cpp new file mode 100644 index 00000000000..c6e29d90611 --- /dev/null +++ b/core/org.eclipse.cdt.core.win32/library/starter/killer.cpp @@ -0,0 +1,269 @@ +/********************************************************************** + * Copyright (c) 2002-2004 QNX Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-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 new file mode 100644 index 00000000000..3ff15714c9e --- /dev/null +++ b/core/org.eclipse.cdt.core.win32/library/starter/killer.h @@ -0,0 +1,122 @@ +/********************************************************************** + * Copyright (c) 2002-2004 QNX Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-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 21087d46d6b..8af8a285eba 100644 --- a/core/org.eclipse.cdt.core.win32/library/starter/starter.cpp +++ b/core/org.eclipse.cdt.core.win32/library/starter/starter.cpp @@ -28,6 +28,8 @@ int copyTo(_TCHAR * target, const _TCHAR * source, int cpyLength, int availSpace); void DisplayErrorMessage(); +BOOL KillProcessEx(DWORD dwProcessId); // Handle of the process + /////////////////////////////////////////////////////////////////////////////// BOOL WINAPI HandlerRoutine( DWORD dwCtrlType) // control signal type { @@ -176,7 +178,16 @@ extern "C" int _tmain(int argc, _TCHAR * argv[]) { _stprintf(buffer, _T("Starting: %s\n"), szCmdLine); OutputDebugStringW(buffer); #endif + // Create job object if it is possible + HMODULE hKernel = GetModuleHandle("kernel32.dll"); + HANDLE hJob = NULL; + HANDLE (WINAPI * pCreateJobObject)(LPSECURITY_ATTRIBUTES lpJobAttributes, + char * lpName); + *(FARPROC *)&pCreateJobObject = + GetProcAddress(hKernel, "CreateJobObjectA"); + if(NULL != pCreateJobObject) + hJob = pCreateJobObject(NULL, NULL); // Spawn the other processes as part of this Process Group BOOL f = CreateProcessW(NULL, szCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi); @@ -192,6 +203,21 @@ extern "C" int _tmain(int argc, _TCHAR * argv[]) { SetEvent(waitEvent); // Means thar process has been spawned CloseHandle(pi.hThread); h[1] = pi.hProcess; + + if(NULL != hJob) { + HANDLE (WINAPI * pAssignProcessToJobObject)(HANDLE job, HANDLE process); + *(FARPROC *)&pAssignProcessToJobObject = + GetProcAddress(hKernel, "AssignProcessToJobObjectA"); + if(NULL != pAssignProcessToJobObject) + if(!pAssignProcessToJobObject(hJob, pi.hProcess)) { +#ifdef DEBUG_MONITOR + _stprintf(buffer, _T("Cannot assign process %i to a job\n"), pi.dwProcessId); + OutputDebugStringW(buffer); + DisplayErrorMessage(); +#endif + } + } + while(!exitProc) { // Wait for the spawned-process to die or for the event @@ -223,7 +249,25 @@ extern "C" int _tmain(int argc, _TCHAR * argv[]) { OutputDebugStringW(buffer); #endif GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0); - TerminateProcess(h[1], 0); + if(NULL != hJob) { + HANDLE (WINAPI * pTerminateJobObject)(HANDLE job, UINT uExitCode); + *(FARPROC *)&pTerminateJobObject = + GetProcAddress(hKernel, "TerminateJobObjectA"); + if(NULL != pTerminateJobObject) { + if(!pTerminateJobObject(hJob, -1)) { +#ifdef DEBUG_MONITOR + OutputDebugStringW(_T("Cannot terminate job\n")); + DisplayErrorMessage(); +#endif + } + } + } 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: @@ -333,19 +377,19 @@ int copyTo(_TCHAR * target, const _TCHAR * source, int cpyLength, int availSpace void DisplayErrorMessage() { - char * lpMsgBuf; - FormatMessage( + _TCHAR * lpMsgBuf; + FormatMessageW( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - (char *) &lpMsgBuf, + (_TCHAR *) &lpMsgBuf, 0, NULL ); - OutputDebugString(lpMsgBuf); + OutputDebugStringW(lpMsgBuf); // Free the buffer. LocalFree( lpMsgBuf ); } diff --git a/core/org.eclipse.cdt.core.win32/library/starter/starter.dsp b/core/org.eclipse.cdt.core.win32/library/starter/starter.dsp new file mode 100644 index 00000000000..b1db348479b --- /dev/null +++ b/core/org.eclipse.cdt.core.win32/library/starter/starter.dsp @@ -0,0 +1,98 @@ +# Microsoft Developer Studio Project File - Name="starter" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=starter - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "starter.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "starter.mak" CFG="starter - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "starter - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "starter - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "starter - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_UNICODE" /FR /YX /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "starter - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_UNICODE" /YX /FD /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "starter - Win32 Release" +# Name "starter - Win32 Debug" +# Begin Source File + +SOURCE=.\killer.cpp +# End Source File +# Begin Source File + +SOURCE=.\killer.h +# End Source File +# Begin Source File + +SOURCE=.\starter.cpp +# End Source File +# End Target +# End Project diff --git a/core/org.eclipse.cdt.core.win32/library/starter/starter.dsw b/core/org.eclipse.cdt.core.win32/library/starter/starter.dsw new file mode 100644 index 00000000000..6ece142ca93 --- /dev/null +++ b/core/org.eclipse.cdt.core.win32/library/starter/starter.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "starter"=.\starter.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/core/org.eclipse.cdt.core.win32/os/win32/x86/spawner.dll b/core/org.eclipse.cdt.core.win32/os/win32/x86/spawner.dll index d2bb0a6563e4da1a9d5a56ea44aaa70f41780df9..ad5bc2bfa83dcd15227fcd44109768557e1ae74f 100644 GIT binary patch delta 84 zcmZp8z})bFdBOu0eF0g=jZY-xSTh7z7#Jr1lau3H%ErLZe1xU-b_r+jiy4!(u9Jz({Aj%H_*k2v$ delta 81 zcmZp8z})bFdBOvhbCrJ`Ha?M%W6Bbk%qTC%w}Op+KTG;1{ze>&lxluAQ7L k@4I=eym>uX_2w7zemHUq*gM(#+eg}G*|%(d{Xmo-06vW%v;Y7A 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 105b0a1ba76fd1bd30e36f4fbc2e51a348f9712c..91093fb3b0468ad8d22097f0165dff13f69a7655 100644 GIT binary patch literal 16384 zcmeHNe{37o9sk-f;Qk19OFc4LRue8=D%vR2Wi2Ef&Ju@|Ce%L?o3c{l#^;`0$2R9X zTDGjTay%`%231ogbrNG`+aGN7kBK3zunnxHqiicu)j}EsY~5Bdql7IQqY8!f?ep&J zH0?U1N&K;)JL`MzeSg01_w(L8=Uv?MzyYcuA{&S?q9bVe<<;+>e4Bv!`sFWNPtVPJ z^_C-+?pJT=m6CaPPR{O-V*~E~SSFKI+}lOBtY+NFjJsoV$UTsai%qq)^My+2zOStN z@uFL|T&U8X*3gBUz<>Mh$b}ow?rD8cZx`Kq|AkiY`PO?cEJk}H1$B8a*)MV5D>L=` zh`KE`^v3l!w^em#$zfSwxt7QYiQAAy>(I{fUZW45#V@#E91N0wK7B0s588i)GMc zm{F@0!e$VU$J;rVm#8#{HM=GPCITh`CITh`CITh`CITh`CITh`CIbJ12<)3Wh^#_= z;gJr(8Sx+Q5b8!DV6G)@FBJv_!RjbZK_IPa_Co4}v{+IXM7KTo)qTgf>zL$(#?M>} zq0-95_lDDgQ+1^tV=g-+F!YqFrp#r7=q1`qq)kLp6k;yoUem?%3fM?Ebq#x6EARU! z4y7fvKCD~x!lH&44^sx>+mPO*sR zJaf4r!vs|PwP|Fw45ILCg6FqIk=|^~eN&AVeSRa-;Oq=?z}4F7)Nq3_Z3CY_=^@yJ z*%`^tTWtb8uih)OGsQQx8OPAGsG<0tW9TQmWsadAphdP;c3PV*Tx9AZqcCHA=#lxt z`UUU#!^2yJI`%r!UuIZ^wHYIQ?f4uA?Xb`a^E=Z*Bf#ty>H_62>0sJMdIcw9ID<$L zQQk(?y!gKI%NIG=wqnUqTmjR6%K_1kJcdlM5cQlc0gm{#BN&Ye?^+dm;oTagW}|BL zl#bd+H##!0n5ca1HNa4NLO2ViFI@QOy2v*gv>{;{tY!~LL$~v1LqaN;@hYs`am;h- zS9sq<&-3?4p3=xKg?FszoKFmo3g^&kc^g4_l=q+6(=+n*I_bdqHg){hNoNC>*QPW=4jDWmdui zFZBXCKRb<@M)nK)ktJkq$O49JROrRzKsMFvrJy0h76n`G&v&bZ@Zrx(4S!}NFnb|g z&u0|vS~L{UHgsWNB*0gwW9WS-v6AYL1RpS1akg@2uODU;g^yr1&dsp;MvNQ+mzf1& zHdA0Q`x(r%)g2fhWl34W>~-FRj3$EJY_%7vaOyl?_l}_=tV5{}3}!c&Na`O3vlEQ; z7OG^fR(MFSpz8J3ilmH!8uJwF$ z?GFB!Xk|7YV&f4u&L7~T2#L*RiMDzzbbe&ojg^5($2O+*3ag3?i@>WagH5A!m?txv zfE}i*0ugpn+tAG8-nS&Bf7 z(m@0d%m!b9jgFn1T#g*p2FnkAs6W_~PCg{675uPlU_+Y8?#B1%_%qb=QPsAzJLu&*I2pca|m0anx#*@;@}v@;{NhZEZTMB&4&x|dUrw+?*0x)NW@Zi~90_@?rOksj9ahH@i( zoW*St3WSf4hP zV$#zG6hf_b z6_{as>mAU!MxA?VKWFHN>%o*SC1Q@^_$-7GjY}cHGK)!9FGM z0KSP4--Mst;RZ9}JL@0uy#_jmg}xV#l8w6%cjHX)CJlG z`Wk2ybO`h;=w;A2=&zuUK}&8WItYJ$J&S%Ts1xJ|Jpjsqc7whNdK`2J)C_tNbPDt* z(BDBM5G@9+0P%~T>Nev`y&p8~)hobrs*TW>a-mc(?P%8ls&fl8mS#B6?`eoTx;z=goVw+l_-^ z8@1*0$sN@bXK!|nraI1LBHAg+88KZwx#67vK24w;B|##3dA%Z@g-i|jS^IiuczZi2 zsZZ#C^2w44-~Y}hiCVAb(T6-@IQxlo7hYvFfOAtL_2ORxGGrpSjqsGvlaZAI+wDM1 zBp*G3JD-&<$TIqzi11#i`?uqyH-L|!>4qmqx);(As*lkw@GEKl70cFg1#hw@0ww|` b0ww|`0ww|`0ww|`0ww|`0ww~V4FvuLNi|h) delta 1679 zcmc&z(Mwxb7(e$WYT9ZITcQzlP3*PUO<9}~2GxLDo%V>w5M(iP^*cfgSke z`+nc~zTfwqb5D{!&m65_>@WtDsg*sSeB~-RGn}LD@{JoWv zg<4p{voi%Ftbg)cl+}{|EXhlV$QelcM}NDkTSd~y9pY*UF(YCxM-AkWMd!It%_Z;w zUFL&EILRxHR{b7l;=6100(Xpm-JtXQF@BWGzR2erK7Zbkxc3|(r9~ql0qv@=0dhK| z{#6(Lq*F@?B~Z;IN3T2Ggj(HpH&Jt@cgNo8TYme~94q{x@Ba6gg4`q!=v&U*5+3q! zcF(7mga`0WY(kW&Jh^dkIP|lf~6sxPo^Q);C6SR{zyeCTY-}c?V$&QYe^MYs9Be*?aPi|WVcb2e=+lM*aEA>mMT&gmu+{RxN4ToO_k6EP2BayfQ1 zvm}UIIcP@EUrF=`79=wPoXw)&wpfq5ki?i1hRE6=K__(FQJ>Mq)Q8y21W}X{QaZJ? zCW0&=B2ZD66`~jbK8j+uA9Z^wMO`n_v>rR86i(qnbe)+%#f0g)*3*Wqkg`kH7nU1S z24n}6KPqGwN@3;q3i%ZzgW1s1EumQgy_h6H|2>=n_oLti*_fKvZ-LQDG#{Y(Fh0V( zU|)C~i)%e*#93E-K?!kDaBA)Kh^0lLOQASl7t=A|ib^Ej$XZaVsZz83$QNt##gFd? z6Rd-W<>Q?hLAK3Wusohw_EW1+*><7}8$c8U83y`(7?04+x_bmOUV8PNW5_mbRIqIu znYVw2>Ismi-l5gh%UF7Iv&ea}6U`h~mqfFuy-A<4Iph!EpHUm6UVJ;XA;=81PO)hk zM3A(JTBBv=E3+>r7$IMcfR%E%V|CC8m&EI%hnv`6@~r;Q)^ggzlD!)l?}kMC-5?on zQObDNfGwPV1R_x*9#@p$r!)*5Y7H{w;UYT5i!{DQ<6EV%KPgpn&b0RdiX>fZIb!l5 z>n`mS_1Tt}55z!d=bYW0mHG7piKh-i#(){%GvGS#4X^^N0b76%IM_i*2f)@_u&)6@ zU<`-?7lB1!3AhS;4J-q9fg-R2kfVeg2JC%bH)=VUglLaiRqe