Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/org.eclipse.cdt.core.win32/ChangeLog13
-rw-r--r--core/org.eclipse.cdt.core.win32/library/Win32ProcessEx.c1
-rw-r--r--core/org.eclipse.cdt.core.win32/library/starter/killer.cpp269
-rw-r--r--core/org.eclipse.cdt.core.win32/library/starter/killer.h122
-rw-r--r--core/org.eclipse.cdt.core.win32/library/starter/starter.cpp56
-rw-r--r--core/org.eclipse.cdt.core.win32/library/starter/starter.dsp98
-rw-r--r--core/org.eclipse.cdt.core.win32/library/starter/starter.dsw29
-rw-r--r--core/org.eclipse.cdt.core.win32/os/win32/x86/spawner.dllbin61440 -> 61440 bytes
-rw-r--r--core/org.eclipse.cdt.core.win32/os/win32/x86/starter.exebin16384 -> 16384 bytes
9 files changed, 582 insertions, 6 deletions
diff --git a/core/org.eclipse.cdt.core.win32/ChangeLog b/core/org.eclipse.cdt.core.win32/ChangeLog
index 4c4ef9577b..db16070fca 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 3971fd2dd9..1dd173c06e 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 0000000000..c6e29d9061
--- /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 <Windows.h>
+#include <Tlhelp32.h>
+#include <process.h>
+#include <tchar.h>
+#include <stdio.h>
+
+#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 0000000000..3ff15714c9
--- /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 <Ntsecapi.h>
+
+
+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 21087d46d6..8af8a285eb 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 0000000000..b1db348479
--- /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 0000000000..6ece142ca9
--- /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 d2bb0a6563..ad5bc2bfa8 100644
--- a/core/org.eclipse.cdt.core.win32/os/win32/x86/spawner.dll
+++ b/core/org.eclipse.cdt.core.win32/os/win32/x86/spawner.dll
Binary files differ
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 105b0a1ba7..91093fb3b0 100644
--- a/core/org.eclipse.cdt.core.win32/os/win32/x86/starter.exe
+++ b/core/org.eclipse.cdt.core.win32/os/win32/x86/starter.exe
Binary files differ

Back to the top