From: Rolf K. <lab...@us...> - 2009-02-19 10:16:08
|
Update of /cvsroot/opengtoolkit/pipe/c_source In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv20728/c_source Modified Files: pipes.c Log Message: Add an exit code to the Kill Porcess function. Index: pipes.c =================================================================== RCS file: /cvsroot/opengtoolkit/pipe/c_source/pipes.c,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -d -r1.20 -r1.21 *** pipes.c 13 Dec 2006 10:17:29 -0000 1.20 --- pipes.c 19 Feb 2009 10:15:56 -0000 1.21 *************** *** 50,54 **** MgErr LibAPI PipeWrite(uInt32 fd, uInt32 offset, uInt32 *bytesWritten, LStrHandle data); ! MgErr LibAPI KillProcess(uInt32 pid); #if defined(MSWin) --- 50,54 ---- MgErr LibAPI PipeWrite(uInt32 fd, uInt32 offset, uInt32 *bytesWritten, LStrHandle data); ! MgErr LibAPI KillProcess(uInt32 pid, int32 exitCode); #if defined(MSWin) *************** *** 229,252 **** if (mode == kReadMode || mode == kReadWriteMode) { ! RestoreStandardIO(STANDARD_IN, &hSaveStdin, hChildStdin, fdIn, err); } if (mode == kWriteMode || mode == kReadWriteMode) { ! RestoreStandardIO(STANDARD_OUT, &hSaveStdout, hChildStdout, fdOut, err); } if (fdErr && *fdErr) { ! RestoreStandardIO(STANDARD_ERR, &hSaveStderr, hChildStderr, fdErr, err); } return err; } ! MgErr LibAPI KillProcess(uInt32 pid) { MgErr err = noErr; #if defined(MSWin) HANDLE handle; #endif --- 229,255 ---- if (mode == kReadMode || mode == kReadWriteMode) { ! RestoreStandardIO(STANDARD_IN, &hSaveStdin, hChildStdin, fdIn, err); } if (mode == kWriteMode || mode == kReadWriteMode) { ! RestoreStandardIO(STANDARD_OUT, &hSaveStdout, hChildStdout, fdOut, err); } if (fdErr && *fdErr) { ! RestoreStandardIO(STANDARD_ERR, &hSaveStderr, hChildStderr, fdErr, err); } return err; } ! MgErr LibAPI KillProcess(uInt32 pid, int32 exitCode) { MgErr err = noErr; #if defined(MSWin) HANDLE handle; + HANDLE hToken; + LUID sedebugnameValue; + TOKEN_PRIVILEGES tkp; #endif *************** *** 255,267 **** #if defined(MSWin) handle = OpenProcess(PROCESS_TERMINATE, FALSE, pid); if (!handle) return Win32ToLVErr(GetLastError()); ! if (!TerminateProcess(handle, 0)) err = Win32ToLVErr(GetLastError()); CloseHandle(handle); #elif defined(Unix) ! kill( pid, SIGKILL ); #else err = mgNotImplementd; --- 258,285 ---- #if defined(MSWin) + + /* try to acquire SeDebugPrivilege */ + if (OpenProcessToken(GetCurrentProcess(), + TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) + { + if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue)) + { + tkp.PrivilegeCount = 1; + tkp.Privileges[0].Luid = sedebugnameValue; + tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof tkp, NULL, NULL); + } + } + CloseHandle(hToken); + handle = OpenProcess(PROCESS_TERMINATE, FALSE, pid); if (!handle) return Win32ToLVErr(GetLastError()); ! if (!TerminateProcess(handle, (UINT)exitCode)) err = Win32ToLVErr(GetLastError()); CloseHandle(handle); #elif defined(Unix) ! kill(pid, SIGKILL); #else err = mgNotImplementd; *************** *** 269,272 **** --- 287,291 ---- return err; } + MgErr LibAPI PipeClose(uInt32 fd) { |