From: <mie...@us...> - 2008-08-18 20:13:36
|
Revision: 3006 http://oorexx.svn.sourceforge.net/oorexx/?rev=3006&view=rev Author: miesfeld Date: 2008-08-18 20:13:42 +0000 (Mon, 18 Aug 2008) Log Message: ----------- Update 'killer' to work with the 64-bit Windows build. The previous version could not find 64-bit processes to kill them. This version (compiled as a 32-bit program) should work unchanged on both 32-bit and 64-bit systems. Modified Paths: -------------- build-utilities/trunk/Makefile.win build-utilities/trunk/platform/windows/Release.notes build-utilities/trunk/platform/windows/killer.c Modified: build-utilities/trunk/Makefile.win =================================================================== --- build-utilities/trunk/Makefile.win 2008-08-18 20:11:27 UTC (rev 3005) +++ build-utilities/trunk/Makefile.win 2008-08-18 20:13:42 UTC (rev 3006) @@ -1,6 +1,6 @@ #------------------------------------------------------------------------------* # -# Copyright (c) 2007 Rexx Language Association. All rights reserved. +# Copyright (c) 2007-2008 Rexx Language Association. 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 @@ -48,11 +48,17 @@ all : $(OBJDIR) $(BINDIR) $(EXE_FILES) touchheaders : $(BINDIR)\stouch.exe $(ooRexx_SRCDIR) - $(BINDIR)\stouch $(ooRexx_SRCDIR)\kernel\messages\RexxErrorCodes.h - $(BINDIR)\stouch $(ooRexx_SRCDIR)\kernel\messages\RexxMessageNumbers.h - $(BINDIR)\stouch $(ooRexx_SRCDIR)\kernel\messages\RexxMessageTable.h - $(BINDIR)\stouch $(ooRexx_SRCDIR)\kernel\platform\windows\winmsgtb.rc - $(BINDIR)\stouch $(ooRexx_SRCDIR)\kernel\platform\unix\rexx.cat + $(BINDIR)\stouch $(ooRexx_SRCDIR)\interpreter\messages\RexxErrorCodes.h + $(BINDIR)\stouch $(ooRexx_SRCDIR)\interpreter\messages\RexxMessageNumbers.h + $(BINDIR)\stouch $(ooRexx_SRCDIR)\interpreter\messages\RexxMessageTable.h + $(BINDIR)\stouch $(ooRexx_SRCDIR)\interpreter\messages\DocErrorMessages.sgml + $(BINDIR)\stouch $(ooRexx_SRCDIR)\interpreter\messages\gencat.inp + $(BINDIR)\stouch $(ooRexx_SRCDIR)\interpreter\platform\windows\winmsgtb.rc + $(BINDIR)\stouch $(ooRexx_SRCDIR)\interpreter\platform\unix\rexx.cat + $(BINDIR)\stouch $(ooRexx_SRCDIR)\interpreter\behaviour\PrimitiveBehaviourNames.h + $(BINDIR)\stouch $(ooRexx_SRCDIR)\interpreter\behaviour\VirtualFunctionTable.cpp + $(BINDIR)\stouch $(ooRexx_SRCDIR)\interpreter\behaviour\ClassTypeCodes.h + $(BINDIR)\stouch $(ooRexx_SRCDIR)\api\oorexxerrors.h clean : @if exist $(OBJDIR) del $(OBJDIR)\*.obj 1>nul 2>&1 @@ -93,7 +99,7 @@ $(CC) $(CFLAGS) /O1 $(SRCDIR)\stouch.c $(BINDIR)\killer.exe : $(BINDIR) $(OBJDIR) $(OBJDIR)\killer.obj - $(LD) /SUBSYSTEM:Console /out:$(BINDIR)\killer.exe $(OBJDIR)\killer.obj psapi.lib + $(LD) /SUBSYSTEM:Console /out:$(BINDIR)\killer.exe $(OBJDIR)\killer.obj $(OBJDIR)\killer.obj : $(SRCDIR)\killer.c $(CC) $(CFLAGS) $(SRCDIR)\killer.c Modified: build-utilities/trunk/platform/windows/Release.notes =================================================================== --- build-utilities/trunk/platform/windows/Release.notes 2008-08-18 20:11:27 UTC (rev 3005) +++ build-utilities/trunk/platform/windows/Release.notes 2008-08-18 20:13:42 UTC (rev 3006) @@ -1,15 +1,18 @@ - Release Notes for 1.0.0 + Release Notes for 1.1.0 ======================= -This is the initial binary release of the ooRexx build-utilities package for +This is the binary release of the ooRexx build-utilities package for Windows. It contains executables to assist in the Windows build process of ooRexx. +The "killer" application in this release has been updated to kill 64-bit +applications on Windows 64-bit systems. This is the only changed from the +1.0.0 release. Two files are available, a regular .zip file and a self-extracting zip file: - ooRexx-build-utils-1.0.0-windows.zip - ooRexx-build-utils-1.0.0-windows.exe + ooRexx-build-utils-1.1.0-windows.zip + ooRexx-build-utils-1.1.0-windows.exe Installation ============ @@ -39,6 +42,9 @@ E:\interpreter>stouch kernel\messages\*.h +Note that the 1.1.0 release of stouch is exactly the same as the 1.0.0 +release. + killer.exe ---------- @@ -54,6 +60,10 @@ E:\killer rxapi +Note that the 1.1.0 release of killer is updated to work with the 64-bit +build of ooRexx. The 1.0.0 version will not kill 64-bit executables on +Windows. + Source ====== Modified: build-utilities/trunk/platform/windows/killer.c =================================================================== --- build-utilities/trunk/platform/windows/killer.c 2008-08-18 20:11:27 UTC (rev 3005) +++ build-utilities/trunk/platform/windows/killer.c 2008-08-18 20:13:42 UTC (rev 3006) @@ -33,88 +33,117 @@ /* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* */ /*----------------------------------------------------------------------------*/ + /* - * Program to kill a named process under Windows - * Only argument: process name + * Program to kill a named process under Windows. The compiled program + * (compiled as 32-bit) should also work on 64-bit Windows. + * + * Only argument: The process name. This can include, or not, the ".exe" + * extension. */ + #include <windows.h> #include <stdio.h> -#include "psapi.h" +#include <tlhelp32.h> +/* Prototypes */ +void tryToKill(PROCESSENTRY32 *pPe32); +void printError(const char *msg); + int main( int argc, char *argv[] ) { - // Find all processes + char szArgName[MAX_PATH] = ""; + BOOL fFound = FALSE; + char *pszExt; + HANDLE hAllProcesses; + PROCESSENTRY32 pe32; - DWORD aProcesses[4096], cbNeeded, cProcesses, processID, cLength; - HANDLE hProcess; - char szProcessName[MAX_PATH] = ""; - char szArgName[MAX_PATH] = ""; - unsigned int i; - BOOL fFound = FALSE; - char *pszExt; - if ( argc != 2 ) { - fprintf( stderr, "No process name supplied\n" ); - return 1; + fprintf(stderr, "No process name supplied\n"); + return 1; } // Support either kill or taskkill syntax pszExt = strrchr( argv[1], '.' ); - if ( pszExt && (stricmp( pszExt, ".exe" ) == 0) ) - sprintf( szArgName, "%s", argv[1] ); + if ( pszExt && (stricmp(pszExt, ".exe") == 0) ) + { + _snprintf(szArgName, sizeof(szArgName), "%s", argv[1]); + } else - sprintf( szArgName, "%s.exe", argv[1] ); + { + _snprintf(szArgName, sizeof(szArgName), "%s.exe", argv[1] ); + } - if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) + // Get a snapshot of all processes running on the system. + pe32.dwSize = sizeof(PROCESSENTRY32); + hAllProcesses = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if( hAllProcesses == INVALID_HANDLE_VALUE ) { - CHAR LastError[256]; - ULONG last_error = GetLastError(); - FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT), LastError, 256, NULL ) ; - fprintf( stderr, "No processes found. %s\n", LastError ); - return 1; + printError("Creating process list"); + return 1; } - // How many processes? + // Get the first process entry. + if( ! Process32First(hAllProcesses, &pe32) ) + { + printError("Process32First()"); + CloseHandle(hAllProcesses); + return 1; + } - cProcesses = cbNeeded / sizeof(DWORD); + // Look at each process until we find the one we want. Then try to kill it. + do + { + if ( stricmp(pe32.szExeFile, szArgName) == 0 ) + { + fFound = TRUE; + tryToKill(&pe32); + break; + } + } while( Process32Next(hAllProcesses, &pe32) ); - // Find our process and kill it + CloseHandle(hAllProcesses); - for ( i = 0; i < cProcesses; i++ ) + if ( ! fFound ) { - // Get a handle to the process. - hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, aProcesses[i] ); - - // Get the process name. - if ( hProcess ) - { - HMODULE hMod; - - if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) ) - { - GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName) ); - if ( stricmp( szProcessName, szArgName ) == 0 ) - { - fFound = TRUE; - if ( TerminateProcess( hProcess, 0 ) ) - { - printf( "%s (Process ID: %u) killed successfully\n", szProcessName, aProcesses[i] ); - } - else - { - CHAR LastError[256]; - ULONG last_error = GetLastError(); - FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT), LastError, 256, NULL ) ; - printf( "%s (Process ID: %u) NOT killed. %s\n", szProcessName, aProcesses[i], LastError ); - } - } - } - CloseHandle( hProcess ); - } + printf("The process \"%s\" was not found.\n", szArgName); } - if ( ! fFound ) - printf( "The process \"%s\" was not found.\n", szArgName ); return 0; } + +void tryToKill(PROCESSENTRY32 *pPe32) +{ + HANDLE hProcess; + + hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pPe32->th32ProcessID); + if( hProcess == NULL ) + { + printError("OpenProcess()"); + } + else + { + if ( TerminateProcess(hProcess, 0) ) + { + printf("%s (process ID: %u) killed successfully\n", pPe32->szExeFile, pPe32->th32ProcessID); + } + else + { + TCHAR msg[64]; + _snprintf(msg, sizeof(msg), "Killing %s (process ID: %u)", pPe32->szExeFile, pPe32->th32ProcessID); + printError(msg); + } + CloseHandle(hProcess); + } +} + +void printError(const char *msg) +{ + TCHAR buf[256]; + DWORD err = GetLastError(); + + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + buf, 256, NULL); + fprintf(stderr, "%s failed with error %d (%s)\n", msg, err, buf); +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2008-09-27 02:55:26
|
Revision: 3405 http://oorexx.svn.sourceforge.net/oorexx/?rev=3405&view=rev Author: miesfeld Date: 2008-09-27 02:55:22 +0000 (Sat, 27 Sep 2008) Log Message: ----------- build-util: Enhance / fix killer so it will kill rxapi, as long as the invoker has the proper authority, for all the cases we are now supporting. On Vista, installed as a service, etc.. Modified Paths: -------------- build-utilities/trunk/Makefile.win build-utilities/trunk/platform/windows/killer.c Modified: build-utilities/trunk/Makefile.win =================================================================== --- build-utilities/trunk/Makefile.win 2008-09-27 00:38:43 UTC (rev 3404) +++ build-utilities/trunk/Makefile.win 2008-09-27 02:55:22 UTC (rev 3405) @@ -99,7 +99,7 @@ $(CC) $(CFLAGS) /O1 $(SRCDIR)\stouch.c $(BINDIR)\killer.exe : $(BINDIR) $(OBJDIR) $(OBJDIR)\killer.obj - $(LD) /SUBSYSTEM:Console /out:$(BINDIR)\killer.exe $(OBJDIR)\killer.obj + $(LD) /SUBSYSTEM:Console /out:$(BINDIR)\killer.exe $(OBJDIR)\killer.obj Advapi32.lib $(OBJDIR)\killer.obj : $(SRCDIR)\killer.c $(CC) $(CFLAGS) $(SRCDIR)\killer.c Modified: build-utilities/trunk/platform/windows/killer.c =================================================================== --- build-utilities/trunk/platform/windows/killer.c 2008-09-27 00:38:43 UTC (rev 3404) +++ build-utilities/trunk/platform/windows/killer.c 2008-09-27 02:55:22 UTC (rev 3405) @@ -36,7 +36,7 @@ /* * Program to kill a named process under Windows. The compiled program - * (compiled as 32-bit) should also work on 64-bit Windows. + * (compiled as 32-bit) will also work on 64-bit Windows. * * Only argument: The process name. This can include, or not, the ".exe" * extension. @@ -46,9 +46,14 @@ #include <stdio.h> #include <tlhelp32.h> +#define BUFFER_SIZE 256 + /* Prototypes */ +HANDLE openForTerminate(DWORD pid); void tryToKill(PROCESSENTRY32 *pPe32); void printError(const char *msg); +void formatMsg(char *buf, const char *additional); +HANDLE openWithDebugPrivilege(char *errMsg, DWORD processID); int main( int argc, char *argv[] ) { @@ -113,37 +118,147 @@ return 0; } + void tryToKill(PROCESSENTRY32 *pPe32) { - HANDLE hProcess; + HANDLE hProcess = openForTerminate(pPe32->th32ProcessID); - hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pPe32->th32ProcessID); - if( hProcess == NULL ) + if ( hProcess != NULL ) { - printError("OpenProcess()"); - } - else - { if ( TerminateProcess(hProcess, 0) ) { printf("%s (process ID: %u) killed successfully\n", pPe32->szExeFile, pPe32->th32ProcessID); } else { - TCHAR msg[64]; - _snprintf(msg, sizeof(msg), "Killing %s (process ID: %u)", pPe32->szExeFile, pPe32->th32ProcessID); + TCHAR msg[BUFFER_SIZE]; + _snprintf(msg, BUFFER_SIZE, "Killing %s (process ID: %u)", pPe32->szExeFile, pPe32->th32ProcessID); printError(msg); } CloseHandle(hProcess); } } +/** + * Attempts to open a process with process terminate access. On Vista, opening + * with all access can fail when opening with just terminate access will + * succeed. + * + * If the process is not opened, then an attempt to open the process by granting + * the current access token the SeDebugPivilege is made. If the privilege is + * granted, the open will succeed. If it isn't granted then the invoker just + * doesn't have the authority to kill the process, and the process won't be + * opened. + * + * @param pid The id of the process to be opened. + * + * @return The opened handle, or null on failure. Caller is responsible for + * closing the handle. + */ +HANDLE openForTerminate(DWORD pid) +{ + HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pid); + + if( hProcess == NULL ) + { + TCHAR errBuf[BUFFER_SIZE]; + hProcess = openWithDebugPrivilege(errBuf, pid); + if ( hProcess == NULL ) + { + fprintf(stderr, errBuf); + } + } + return hProcess; +} + void printError(const char *msg) { - TCHAR buf[256]; + TCHAR buf[BUFFER_SIZE]; + formatMsg(buf, msg); + fprintf(stderr, buf); +} + +void formatMsg(char *buf, const char *additional) +{ + TCHAR sysMsg[BUFFER_SIZE]; DWORD err = GetLastError(); FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - buf, 256, NULL); - fprintf(stderr, "%s failed with error %d (%s)\n", msg, err, buf); + sysMsg, BUFFER_SIZE, NULL); + + _snprintf(buf, BUFFER_SIZE, "%s failed with error %d (%s)\n", additional, err, sysMsg); } + +/** + * Attempts to enable the SeDebugPrivilege in the current access token and then + * open the process with terminate access. After the open process the previous + * privilege level of the access token is restored. + * + * @param errMsg Passed in buffer used to format a message on error and + * return to the caller. + * + * @param processID ID of the process to be opened. + * + * @return The opened handle to the process on success, otherwise the handle is + * NULL. + */ +HANDLE openWithDebugPrivilege(char *errMsg, DWORD processID) +{ + TOKEN_PRIVILEGES newPrivileges; + TOKEN_PRIVILEGES oldPrivileges; + DWORD oldLength = 0; + LUID luid; + HANDLE hCurrent; + HANDLE hProcess = NULL; + HANDLE hToken; + DWORD pid; + BOOL success = FALSE; + + if ( ! LookupPrivilegeValue(NULL, "SeDebugPrivilege", &luid ) ) + { + formatMsg(errMsg, "LookupPrivilegeValue()"); + return hProcess; + } + + pid = GetCurrentProcessId(); + hCurrent = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid); + if ( hCurrent == NULL ) + { + formatMsg(errMsg, "OpenProcess() (this process)"); + return hProcess; + } + if ( ! OpenProcessToken(hCurrent, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) ) + { + CloseHandle(hCurrent); + formatMsg(errMsg, "OpenProcessToken()"); + return FALSE; + } + + newPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + newPrivileges.Privileges[0].Luid = luid; + newPrivileges.PrivilegeCount = 1; + + // Try to enable the debug privilege + success = AdjustTokenPrivileges(hToken, FALSE, &newPrivileges, sizeof(TOKEN_PRIVILEGES), &oldPrivileges, &oldLength); + + if ( success ) + { + // Now try to open the process. If the debug privilege was granted this + // will work. If the privilege was not granted, it will fail again. + hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, processID); + if ( hProcess == NULL ) + { + formatMsg(errMsg, "OpenProcess()"); + } + // Restore the toke to the state it was in prior to the adjustment. + success = AdjustTokenPrivileges(hToken, FALSE, &oldPrivileges, oldLength, NULL, NULL); + } + else + { + formatMsg(errMsg, "AdjustTokenPrivileges()"); + } + + CloseHandle(hCurrent); + CloseHandle(hToken); + return hProcess; +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2010-08-18 23:23:57
|
Revision: 6118 http://oorexx.svn.sourceforge.net/oorexx/?rev=6118&view=rev Author: miesfeld Date: 2010-08-18 23:23:50 +0000 (Wed, 18 Aug 2010) Log Message: ----------- Write our own NSIS plugin, so we can get it to do what we want Modified Paths: -------------- build-utilities/trunk/Makefile.win build-utilities/trunk/NMAKE_lineout.exe build-utilities/trunk/NMAKE_stop.exe build-utilities/trunk/Nmake.inc build-utilities/trunk/platform/windows/Release.notes build-utilities/trunk/platform/windows/asm_src/Makefile.win Added Paths: ----------- build-utilities/trunk/platform/windows/ooRexxProcess/ build-utilities/trunk/platform/windows/ooRexxProcess/Makefile.win build-utilities/trunk/platform/windows/ooRexxProcess/ooRexxProcess.cpp build-utilities/trunk/platform/windows/ooRexxProcess/ooRexxProcess.hpp build-utilities/trunk/platform/windows/ooRexxProcess/testProcess.nsi Modified: build-utilities/trunk/Makefile.win =================================================================== --- build-utilities/trunk/Makefile.win 2010-08-18 18:31:39 UTC (rev 6117) +++ build-utilities/trunk/Makefile.win 2010-08-18 23:23:50 UTC (rev 6118) @@ -1,6 +1,6 @@ #------------------------------------------------------------------------------* # -# Copyright (c) 2007-2008 Rexx Language Association. All rights reserved. +# Copyright (c) 2007-2010 Rexx Language Association. 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 @@ -45,7 +45,7 @@ EXE_FILES = $(BINDIR)\stouch.exe $(BINDIR)\killer.exe -all : $(OBJDIR) $(BINDIR) $(EXE_FILES) +all : $(OBJDIR) $(BINDIR) $(EXE_FILES) ooRexxProcess_Plugin touchheaders : $(BINDIR)\stouch.exe $(ooRexx_SRCDIR) $(BINDIR)\stouch $(ooRexx_SRCDIR)\interpreter\messages\RexxErrorCodes.h @@ -122,3 +122,8 @@ cd $(ASMDIR) nmake /nologo /F Makefile.win TOPDIR=$(TOPDIR) all cd $(TOPDIR) + +ooRexxProcess_Plugin: + cd $(PLUGINDIR) + nmake /nologo /F Makefile.win TOPDIR=$(TOPDIR) all + cd $(TOPDIR) Modified: build-utilities/trunk/NMAKE_lineout.exe =================================================================== (Binary files differ) Modified: build-utilities/trunk/NMAKE_stop.exe =================================================================== (Binary files differ) Modified: build-utilities/trunk/Nmake.inc =================================================================== --- build-utilities/trunk/Nmake.inc 2010-08-18 18:31:39 UTC (rev 6117) +++ build-utilities/trunk/Nmake.inc 2010-08-18 23:23:50 UTC (rev 6118) @@ -56,16 +56,20 @@ # MSVC8_64 = -WINDIR = $(TOPDIR)\platform\windows -SRCDIR = $(WINDIR) -BINDIR = $(WINDIR)\bin -OBJDIR = $(WINDIR)\obj -ASMDIR = $(WINDIR)\asm_src +WINDIR = $(TOPDIR)\platform\windows +SRCDIR = $(WINDIR) +BINDIR = $(WINDIR)\bin +OBJDIR = $(WINDIR)\obj +ASMDIR = $(WINDIR)\asm_src +PLUGINDIR = $(WINDIR)\ooRexxProcess +# To build the NSIS plugin, ooRexxProcess, you must set the directory to the +# NSIS plugin library and header files. +NSIS_API_DIR = C:\Tools\NSIS\Examples\Plugin\nsis # Default ooRexx top level build directory. Change this to point to the correct # directory, or define on the command line to Nmake. -ooRexx_SRCDIR = ..\interpreter +ooRexx_SRCDIR = ..\main # CC, CPP, CXX are predefined for MSVC, but nothing is predefined for the linker # or lib utility, etc.. Modified: build-utilities/trunk/platform/windows/Release.notes =================================================================== --- build-utilities/trunk/platform/windows/Release.notes 2010-08-18 18:31:39 UTC (rev 6117) +++ build-utilities/trunk/platform/windows/Release.notes 2010-08-18 23:23:50 UTC (rev 6118) @@ -1,18 +1,20 @@ - Release Notes for 1.1.0 + Release Notes for 1.2.0 ======================= This is the binary release of the ooRexx build-utilities package for -Windows. It contains executables to assist in the Windows build process of -ooRexx. +Windows. It contains executables and dynamic link libraries to assist in +the Windows build process of ooRexx. -The "killer" application in this release has been updated to kill 64-bit -applications on Windows 64-bit systems. This is the only changed from the -1.0.0 release. +All binaries have been rebuilt and the ooRexxProcess.dll has been added to +this release. This DLL is a NSIS plugin that is required for the +packaging step of the Windows ooRexx build. This is the only change from +the 1.2.0 release. -Two files are available, a regular .zip file and a self-extracting zip file: +Two files are available, a regular .zip file and a self-extracting zip +file: - ooRexx-build-utils-1.1.0-windows.zip - ooRexx-build-utils-1.1.0-windows.exe + ooRexx-build-utils-1.2.0-windows.zip + ooRexx-build-utils-1.2.0-windows.exe Installation ============ @@ -23,16 +25,63 @@ Contents ======== -Two executables are included in this release. +Two executables are and one dynamic link library are included in this +release. +ooRexxProcess.dll +----------------- + +ooRexxProcess is a NSIS plugin. The Windows ooRexx installation package is +created using the NSIS system. oorexx.nsi the NSIS script used to create +the installation package requires the ooRexxProcess plugin. + +If you intend to build the Windows ooRexx installation package from +source, you must use this DLL because its functions are used in +oorexx.nsi. To use the plugin, copy the DLL to the Plugins subdirectory +of your NSIS installation directory. + +The plugin can be used in any NSIS script. It has two functions, +findProcess and killProcess. + +Usage (in NSIS script): + + ooRexxProcess::findProcess <processName> + Pop <varName> + + ooRexxProcess::killProcess <processName> + Pop <varName> + +Returns a numeric value, 0 for success. + +Example (in NSIS script): + + ooRexxProcess::killProcess "rxapi" + Pop $0 + + ; $0 now contains 0 for success, 1 if no rxapi process was found. + +Return codes: + + 0 Success. + 1 The specified process was not found. + 2 No process name was passed to the function. + 3 The process was found, everything worked, but termination failed. + 4 Creating the process list failed. + 5 The Process32First() API failed. + 6 The LookupPrivilegeValue() API failed. + 7 The OpenProcess() API, for our process, failed. + 8 The OpenProcessToken() API failed. + 9 The OpenProcess() API, for the specified process, failed. +10 The AdjuctTokenPrivileges() API failed. + stouch.exe ---------- stouch is a simple 'touch' program. It updates the last access and modification times of each fileName arg on the command line to the current -time. Wildcards are accepted. There are no options to specify the time or -date to use when touching the files. The current date and time is always -used. +time. Wildcards are accepted. There are no options to specify the time +or date to use when touching the files. The current date and time is +always used. stouch is used by the touchheaders.bat file in the ooRexx source tree. @@ -42,7 +91,7 @@ E:\interpreter>stouch kernel\messages\*.h -Note that the 1.1.0 release of stouch is exactly the same as the 1.0.0 +Note that the 1.2.0 release of stouch is exactly the same as the 1.1.0 release. killer.exe @@ -50,7 +99,8 @@ killer is a simple process killer that acts like kill.exe or taskkill.exe. It kills the process specified on the command line. The process is -specified by image name, (not by process ID.) +specified by image name, (not by process ID.) It works on both 32-bit and +64-bit Windows. killer is used in the Windows build process to kill rxapi.exe. @@ -60,9 +110,8 @@ E:\killer rxapi -Note that the 1.1.0 release of killer is updated to work with the 64-bit -build of ooRexx. The 1.0.0 version will not kill 64-bit executables on -Windows. +Note that the 1.2.0 release of killer is exactly the same as the 1.1.0 +release. Source ====== Modified: build-utilities/trunk/platform/windows/asm_src/Makefile.win =================================================================== --- build-utilities/trunk/platform/windows/asm_src/Makefile.win 2010-08-18 18:31:39 UTC (rev 6117) +++ build-utilities/trunk/platform/windows/asm_src/Makefile.win 2010-08-18 23:23:50 UTC (rev 6118) @@ -1,6 +1,6 @@ #------------------------------------------------------------------------------* # -# Copyright (c) 2007 Rexx Language Association. All rights reserved. +# Copyright (c) 2007-2010 Rexx Language Association. 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 Added: build-utilities/trunk/platform/windows/ooRexxProcess/Makefile.win =================================================================== --- build-utilities/trunk/platform/windows/ooRexxProcess/Makefile.win (rev 0) +++ build-utilities/trunk/platform/windows/ooRexxProcess/Makefile.win 2010-08-18 23:23:50 UTC (rev 6118) @@ -0,0 +1,62 @@ +#------------------------------------------------------------------------------* +# +# Copyright (c) 2010-2010 Rexx Language Association. 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. A copy is also available at the following address: +# http://www.oorexx.org/license.html +# +# Redistribution and use in source and binary forms, with or +# without modification, are permitted provided that the following +# conditions are met: +# +# Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the distribution. +# +# Neither the name of Rexx Language Association nor the names +# of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +#------------------------------------------------------------------------------* + +!include $(TOPDIR)\Nmake.inc + +LIB = $(LIB);$(NSIS_API_DIR) +INCLUDE = $(INCLUDE);$(NSIS_API_DIR) + +VC_ARGS_NOT_NEEDED = /c /W3 /nologo /FD /Fo".\Release/" /Fp".\Release/ooRexxProcess.pch" /Fd".\Release/" + +VCDEFS = /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_USRDLL" /D "ooRexxProcess_EXPORTS" /D "NSISCALL=__stdcall" /D "_VC80_UPGRADE=0x0600" /D "_WINDLL" /D "_MBCS" + +CFLAGS = $(CFLAGS) $(VCDEFS) /O1 /I "." /GF /EHsc /MD /GS- /Gy /TP + +VCLD_ARGS_NOT_NEEDED = /NOLOGO /MANIFEST /MANIFESTFILE:".\Release\ooRexxProcess.dll.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" +CONTINUED = /PDB:".\Release/ooRexxProcess.pdb" + +LDFLAGS = /MANIFEST:NO /OUT:$(BINDIR)\ooRexxProcess.dll /INCREMENTAL:NO /DLL /NODEFAULTLIB /NODEFAULTLIB:"libc.lib" /ENTRY:"DllMain" /DYNAMICBASE:NO /IMPLIB:$(BINDIR)\ooRexxProcess.lib /MACHINE:X86 + +EXLIBS = pluginapi.lib odbc32.lib odbccp32.lib shlwapi.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib + +all: $(BINDIR) $(OBJDIR) $(BINDIR)\ooRexxProcess.dll + +$(OBJDIR)\ooRexxProcess.obj : ooRexxProcess.cpp ooRexxProcess.hpp + $(CC) $(CFLAGS) ooRexxProcess.cpp + +$(BINDIR)\ooRexxProcess.dll : $(BINDIR) $(OBJDIR) $(OBJDIR)\ooRexxProcess.obj + $(LD) $(LDFLAGS) $(OBJDIR)\ooRexxProcess.obj $(EXLIBS) Added: build-utilities/trunk/platform/windows/ooRexxProcess/ooRexxProcess.cpp =================================================================== --- build-utilities/trunk/platform/windows/ooRexxProcess/ooRexxProcess.cpp (rev 0) +++ build-utilities/trunk/platform/windows/ooRexxProcess/ooRexxProcess.cpp 2010-08-18 23:23:50 UTC (rev 6118) @@ -0,0 +1,364 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2010-2010 Rexx Language Association. 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. A copy is also available at the following address: */ +/* http://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +/** + * NSIS plugin used by the ooRexx Windows installer. + * + * Contains functions: findProcess and killProcess + * + * Usage (in nsis script): + * + * ooRexxProcess::findProcess <processName> + * Pop <varName> + * + * ooRexxProcess::killProcess <processName> + * Pop <varName> + * + * Returns a numeric value, 0 for success. + * + * Example (in nsis script): + * + * ooRexxProcess::killProcess "rxapi" + * Pop $0 + * + * ; $0 now contains 0 for success, 1 if no rxapi process was found. + * + * Return codes: + * + * 0 Success. + * 1 The specified process was not found. + * 2 No process name was passed to the function. + * 3 The process was found, everything worked, but termination failed. + * 4 Creating the process list failed. + * 5 The Process32First() API failed. + * 6 The LookupPrivilegeValue() API failed. + * 7 The OpenProcess() API, for our process, failed. + * 8 The OpenProcessToken() API failed. + * 9 The OpenProcess() API, for the specified process, failed. + * 10 The AdjuctTokenPrivileges() API failed. + * + * TODO - It would be nice to figure out a way of passing back the GetLastError + * error code in addition to the above codes. + */ + +/* + * Notes from the NSIS example plugin code: + * + * note if you want parameters from the stack, pop them off in order. + * i.e. if you are called via ooRexxProcess::myFunction file.dat poop.dat + * calling popstring() the first time would give you file.dat, + * and the second time would give you poop.dat. + * you should empty the stack of your parameters, and ONLY your + * parameters. + * + */ + +#include <windows.h> +#include <shlwapi.h> +#include <tlhelp32.h> +#include <pluginapi.h> +#include "ooRexxProcess.hpp" + +BEGIN_EXTERN_C() + +void __declspec(dllexport) findProcess(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, + extra_parameters *extra) +{ + char buf[1024]; + char processName[BUFFER_SIZE]; + + EXDLL_INIT(); + g_hwndParent = hwndParent; + + if ( getName(processName) ) + { + findMaybeKill(processName, false); + } + + setReturn(); +} + +void __declspec(dllexport) killProcess(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, + extra_parameters *extra) +{ + char processName[BUFFER_SIZE]; + + EXDLL_INIT(); + g_hwndParent = hwndParent; + + if ( getName(processName) ) + { + findMaybeKill(processName, true); + } + + setReturn(); +} + +END_EXTERN_C() + +static bool getName(char *processName) +{ + char *pExt; + + *processName = '\0'; + popstring(processName); + + if ( *processName == '\0' ) + { + returnCode = R_NO_ARG; + return false; + } + + pExt = StrRChr(processName, NULL, '.'); + if ( pExt == NULL || (lstrcmpi(pExt, ".exe") != 0) ) + { + lstrcat(processName, ".exe"); + } + + return true; +} + +static void findMaybeKill(char *process, bool killIt) +{ + bool found = false; + HANDLE hAllProcesses; + PROCESSENTRY32 pe32; + + // Get a snapshot of all processes running on the system. + pe32.dwSize = sizeof(PROCESSENTRY32); + hAllProcesses = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + + if( hAllProcesses == INVALID_HANDLE_VALUE ) + { + printError("Creating process list", NULL); + returnCode = R_NO_PROCESS_LIST; + return; + } + + // Get the first process entry. + if( ! Process32First(hAllProcesses, &pe32) ) + { + printError("Process32First()", NULL); + CloseHandle(hAllProcesses); + returnCode = R_PROCESS_32_FIRST; + return; + } + + // Look at each process until we find the one we want. Then try to kill it. + do + { + if ( lstrcmpi(pe32.szExeFile, process) == 0 ) + { + found = true; + if ( killIt ) + { + tryToKill(&pe32); + } + break; + } + } while( Process32Next(hAllProcesses, &pe32) ); + + CloseHandle(hAllProcesses); + + if ( ! found ) + { + returnCode = R_NOT_FOUND; + } +} + +static void tryToKill(PROCESSENTRY32 *pPe32) +{ + HANDLE hProcess = openForTerminate(pPe32->th32ProcessID); + + if ( hProcess != NULL ) + { + if ( ! TerminateProcess(hProcess, 0) ) + { + returnCode = R_FAILED_TO_KILL_PROCESS; + } + CloseHandle(hProcess); + } +} + +/** + * Attempts to open a process with process terminate access. On Vista, opening + * with all access can fail when opening with just terminate access will + * succeed. + * + * If the process is not opened, then an attempt to open the process by granting + * the current access token the SeDebugPivilege is made. If the privilege is + * granted, the open will succeed. If it isn't granted then the invoker just + * doesn't have the authority to kill the process, and the process won't be + * opened. + * + * @param pid The id of the process to be opened. + * + * @return The opened handle, or null on failure. Caller is responsible for + * closing the handle. + */ +static HANDLE openForTerminate(DWORD pid) +{ + HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pid); + + if( hProcess == NULL ) + { + TCHAR errBuf[BUFFER_SIZE]; + hProcess = openWithDebugPrivilege(errBuf, pid); + if ( hProcess == NULL ) + { + printError(NULL, errBuf); + } + } + return hProcess; +} + +/** + * Attempts to enable the SeDebugPrivilege in the current access token and then + * open the process with terminate access. After the open process the previous + * privilege level of the access token is restored. + * + * @param errMsg Passed in buffer used to format a message on error and + * return to the caller. + * + * @param processID ID of the process to be opened. + * + * @return The opened handle to the process on success, otherwise the handle is + * NULL. + */ +static HANDLE openWithDebugPrivilege(char *errMsg, DWORD processID) +{ + TOKEN_PRIVILEGES newPrivileges; + TOKEN_PRIVILEGES oldPrivileges; + DWORD oldLength = 0; + LUID luid; + HANDLE hCurrent; + HANDLE hProcess = NULL; + HANDLE hToken; + DWORD pid; + BOOL success = FALSE; + + if ( ! LookupPrivilegeValue(NULL, "SeDebugPrivilege", &luid ) ) + { + formatMsg(errMsg, "LookupPrivilegeValue()"); + returnCode = R_LOOKUP_PRIVILEGE_VALUE; + return hProcess; + } + + pid = GetCurrentProcessId(); + hCurrent = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid); + if ( hCurrent == NULL ) + { + formatMsg(errMsg, "OpenProcess() (this process)"); + returnCode = R_OPEN_PROCESS_THIS_PROCESS; + return hProcess; + } + if ( ! OpenProcessToken(hCurrent, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) ) + { + CloseHandle(hCurrent); + formatMsg(errMsg, "OpenProcessToken()"); + returnCode = R_OPEN_PROCESS_TOKEN; + return NULL; + } + + newPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + newPrivileges.Privileges[0].Luid = luid; + newPrivileges.PrivilegeCount = 1; + + // Try to enable the debug privilege + success = AdjustTokenPrivileges(hToken, FALSE, &newPrivileges, sizeof(TOKEN_PRIVILEGES), &oldPrivileges, &oldLength); + + if ( success ) + { + // Now try to open the process. If the debug privilege was granted this + // will work. If the privilege was not granted, it will fail again. + hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, processID); + if ( hProcess == NULL ) + { + formatMsg(errMsg, "OpenProcess()"); + returnCode = R_OPEN_PROCESS; + } + // Restore the token to the state it was in prior to the adjustment. + success = AdjustTokenPrivileges(hToken, FALSE, &oldPrivileges, oldLength, NULL, NULL); + } + else + { + formatMsg(errMsg, "AdjustTokenPrivileges()"); + returnCode = R_ADJUST_TOKEN_PRIVILEGES; + } + + CloseHandle(hCurrent); + CloseHandle(hToken); + return hProcess; +} + +BOOL WINAPI DllMain(HANDLE hInst, ULONG reason, LPVOID lpReserved) +{ + if ( reason == DLL_PROCESS_ATTACH ) + { + g_hInstance=hInst; + } + return TRUE; +} + + +#ifdef PLUGIN_DEBUG + +static void printError(const char *msg, const char *errBuf) +{ + if ( errBuf == NULL ) + { + TCHAR buf[BUFFER_SIZE]; + formatMsg(buf, msg); + MessageBox(g_hwndParent, buf, 0, MB_OK); + } + else + { + MessageBox(g_hwndParent, errBuf, 0, MB_OK); + } +} + +static void formatMsg(char *buf, const char *additional) +{ + TCHAR sysMsg[BUFFER_SIZE]; + DWORD err = GetLastError(); + + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + sysMsg, BUFFER_SIZE, NULL); + + wsprintf(buf, "%s failed with error %d (%s)\n", additional, err, sysMsg); +} +#endif Added: build-utilities/trunk/platform/windows/ooRexxProcess/ooRexxProcess.hpp =================================================================== --- build-utilities/trunk/platform/windows/ooRexxProcess/ooRexxProcess.hpp (rev 0) +++ build-utilities/trunk/platform/windows/ooRexxProcess/ooRexxProcess.hpp 2010-08-18 23:23:50 UTC (rev 6118) @@ -0,0 +1,106 @@ +/*----------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 2010-2010 Rexx Language Association. 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. A copy is also available at the following address: */ +/* http://www.oorexx.org/license.html */ +/* */ +/* Redistribution and use in source and binary forms, with or */ +/* without modification, are permitted provided that the following */ +/* conditions are met: */ +/* */ +/* Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in */ +/* the documentation and/or other materials provided with the distribution. */ +/* */ +/* Neither the name of Rexx Language Association nor the names */ +/* of its contributors may be used to endorse or promote products */ +/* derived from this software without specific prior written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ +/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */ +/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */ +/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */ +/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */ +/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */ +/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */ +/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ +/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ +/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/*----------------------------------------------------------------------------*/ + +#ifndef ooRexxProcess_Included +#define ooRexxProcess_Included + +#ifdef __cplusplus +#define BEGIN_EXTERN_C() extern "C" { +#define END_EXTERN_C() } +#else +#define BEGIN_EXTERN_C() +#define END_EXTERN_C() +#endif + +#define BUFFER_SIZE 260 + +// Return values - always numeric. +enum RESULT +{ + R_SUCCESS = 0, // Success. + R_NOT_FOUND, // Process not found. + R_NO_ARG, // Process name not passed to function. + R_FAILED_TO_KILL_PROCESS, // The process was found, everything worked, but TerminateProcess failed. + R_NO_PROCESS_LIST, // Creating the process list failed. + R_PROCESS_32_FIRST, // Process32First() API failed. + R_LOOKUP_PRIVILEGE_VALUE, // LookupPrivilegeValue() API failed. + R_OPEN_PROCESS_THIS_PROCESS, // OpenProcess() API, for our process, failed. + R_OPEN_PROCESS_TOKEN, // OpenProcessToken() API failed. + R_OPEN_PROCESS, // OpenProcess() API, for the specified process, failed. + R_ADJUST_TOKEN_PRIVILEGES // AdjuctTokenPrivileges() API failed. +}; + +char *returnCodes[] = +{ + "0", + "1", + "3", + "4", + "5" +}; + +/* Prototypes */ +static bool getName(char *processName); +static HANDLE openForTerminate(DWORD pid); +static void findMaybeKill(char *process, bool killIt); +static HANDLE openWithDebugPrivilege(char *errMsg, DWORD processID); +static void tryToKill(PROCESSENTRY32 *pPe32); + + +enum RESULT returnCode = R_SUCCESS; +HANDLE g_hInstance; +HWND g_hwndParent; + +static _inline void setReturn(void) +{ + pushstring(returnCodes[returnCode]); +} + +#ifdef PLUGIN_DEBUG +static void printError(const char *msg, const char *errBuf); +static void formatMsg(char *buf, const char *additional); +#define printError(msg, errBuf) printError(msg, errBuf) +#define formatMsg(buf, additional) formatMsg(buf, additional) + +#else + +#define printError(msg, errBuf) +#define formatMsg(buf, additional) +#endif + + +#endif Added: build-utilities/trunk/platform/windows/ooRexxProcess/testProcess.nsi =================================================================== --- build-utilities/trunk/platform/windows/ooRexxProcess/testProcess.nsi (rev 0) +++ build-utilities/trunk/platform/windows/ooRexxProcess/testProcess.nsi 2010-08-18 23:23:50 UTC (rev 6118) @@ -0,0 +1,26 @@ +OutFile "testProcess.exe" + +!include LogicLib.nsh + +# default section +Section + + StrCpy $0 "Mark Miesfeld" + ooRexxProcess::findProcess "rxapi" + Pop $R0 + MessageBox MB_OK "findProcess rxapi ret = $R0" + + ooRexxProcess::findProcess "rxapi.exe" + Pop $R0 + MessageBox MB_OK "findProcess rxapi.exe ret = $R0" + + ${if} $R0 == 0 ; 0 equals success, equals found. + ooRexxProcess::killProcess "rxapi.exe" + Pop $R0 + MessageBox MB_OK "killProcess rxapi.exe ret = $R0" + ${endif} + + +SectionEnd + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2010-08-19 03:32:45
|
Revision: 6119 http://oorexx.svn.sourceforge.net/oorexx/?rev=6119&view=rev Author: miesfeld Date: 2010-08-19 03:32:38 +0000 (Thu, 19 Aug 2010) Log Message: ----------- A little clean up of the NSIS plugin code Modified Paths: -------------- build-utilities/trunk/NMAKE_lineout.exe build-utilities/trunk/NMAKE_stop.exe build-utilities/trunk/Nmake.inc build-utilities/trunk/platform/windows/ooRexxProcess/Makefile.win build-utilities/trunk/platform/windows/ooRexxProcess/ooRexxProcess.cpp build-utilities/trunk/platform/windows/ooRexxProcess/testProcess.nsi Modified: build-utilities/trunk/NMAKE_lineout.exe =================================================================== (Binary files differ) Modified: build-utilities/trunk/NMAKE_stop.exe =================================================================== (Binary files differ) Modified: build-utilities/trunk/Nmake.inc =================================================================== --- build-utilities/trunk/Nmake.inc 2010-08-18 23:23:50 UTC (rev 6118) +++ build-utilities/trunk/Nmake.inc 2010-08-19 03:32:38 UTC (rev 6119) @@ -77,5 +77,5 @@ COMMONCFLAGS = /nologo /D_CRT_SECURE_NO_DEPRECATE /D_CRT_NONSTDC_NO_DEPRECATE -CFLAGS = /c $(COMMONCFLAGS) /Fo$(OBJDIR)\ /W4 +CFLAGS = /c $(COMMONCFLAGS) /Fo$(OBJDIR)\ /W3 Modified: build-utilities/trunk/platform/windows/ooRexxProcess/Makefile.win =================================================================== --- build-utilities/trunk/platform/windows/ooRexxProcess/Makefile.win 2010-08-18 23:23:50 UTC (rev 6118) +++ build-utilities/trunk/platform/windows/ooRexxProcess/Makefile.win 2010-08-19 03:32:38 UTC (rev 6119) @@ -40,18 +40,13 @@ LIB = $(LIB);$(NSIS_API_DIR) INCLUDE = $(INCLUDE);$(NSIS_API_DIR) -VC_ARGS_NOT_NEEDED = /c /W3 /nologo /FD /Fo".\Release/" /Fp".\Release/ooRexxProcess.pch" /Fd".\Release/" - VCDEFS = /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_USRDLL" /D "ooRexxProcess_EXPORTS" /D "NSISCALL=__stdcall" /D "_VC80_UPGRADE=0x0600" /D "_WINDLL" /D "_MBCS" CFLAGS = $(CFLAGS) $(VCDEFS) /O1 /I "." /GF /EHsc /MD /GS- /Gy /TP -VCLD_ARGS_NOT_NEEDED = /NOLOGO /MANIFEST /MANIFESTFILE:".\Release\ooRexxProcess.dll.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" -CONTINUED = /PDB:".\Release/ooRexxProcess.pdb" - LDFLAGS = /MANIFEST:NO /OUT:$(BINDIR)\ooRexxProcess.dll /INCREMENTAL:NO /DLL /NODEFAULTLIB /NODEFAULTLIB:"libc.lib" /ENTRY:"DllMain" /DYNAMICBASE:NO /IMPLIB:$(BINDIR)\ooRexxProcess.lib /MACHINE:X86 -EXLIBS = pluginapi.lib odbc32.lib odbccp32.lib shlwapi.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib +EXLIBS = pluginapi.lib shlwapi.lib kernel32.lib user32.lib comdlg32.lib advapi32.lib shell32.lib all: $(BINDIR) $(OBJDIR) $(BINDIR)\ooRexxProcess.dll Modified: build-utilities/trunk/platform/windows/ooRexxProcess/ooRexxProcess.cpp =================================================================== --- build-utilities/trunk/platform/windows/ooRexxProcess/ooRexxProcess.cpp 2010-08-18 23:23:50 UTC (rev 6118) +++ build-utilities/trunk/platform/windows/ooRexxProcess/ooRexxProcess.cpp 2010-08-19 03:32:38 UTC (rev 6119) @@ -98,7 +98,6 @@ void __declspec(dllexport) findProcess(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra) { - char buf[1024]; char processName[BUFFER_SIZE]; EXDLL_INIT(); Modified: build-utilities/trunk/platform/windows/ooRexxProcess/testProcess.nsi =================================================================== --- build-utilities/trunk/platform/windows/ooRexxProcess/testProcess.nsi 2010-08-18 23:23:50 UTC (rev 6118) +++ build-utilities/trunk/platform/windows/ooRexxProcess/testProcess.nsi 2010-08-19 03:32:38 UTC (rev 6119) @@ -1,3 +1,40 @@ +#------------------------------------------------------------------------------* +# +# Copyright (c) 2010-2010 Rexx Language Association. 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. A copy is also available at the following address: +# http://www.oorexx.org/license.html +# +# Redistribution and use in source and binary forms, with or +# without modification, are permitted provided that the following +# conditions are met: +# +# Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the distribution. +# +# Neither the name of Rexx Language Association nor the names +# of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +#------------------------------------------------------------------------------* + OutFile "testProcess.exe" !include LogicLib.nsh This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mie...@us...> - 2010-08-19 15:58:45
|
Revision: 6120 http://oorexx.svn.sourceforge.net/oorexx/?rev=6120&view=rev Author: miesfeld Date: 2010-08-19 15:58:39 +0000 (Thu, 19 Aug 2010) Log Message: ----------- A few more tweaks for the ooRexxProcess.dll plugin Modified Paths: -------------- build-utilities/trunk/Makefile.win build-utilities/trunk/NMAKE_lineout.exe build-utilities/trunk/NMAKE_stop.exe build-utilities/trunk/Nmake.inc build-utilities/trunk/platform/windows/ooRexxProcess/Makefile.win build-utilities/trunk/platform/windows/ooRexxProcess/testProcess.nsi Modified: build-utilities/trunk/Makefile.win =================================================================== --- build-utilities/trunk/Makefile.win 2010-08-19 03:32:38 UTC (rev 6119) +++ build-utilities/trunk/Makefile.win 2010-08-19 15:58:39 UTC (rev 6120) @@ -45,7 +45,7 @@ EXE_FILES = $(BINDIR)\stouch.exe $(BINDIR)\killer.exe -all : $(OBJDIR) $(BINDIR) $(EXE_FILES) ooRexxProcess_Plugin +all : $(OBJDIR) $(BINDIR) $(EXE_FILES) touchheaders : $(BINDIR)\stouch.exe $(ooRexx_SRCDIR) $(BINDIR)\stouch $(ooRexx_SRCDIR)\interpreter\messages\RexxErrorCodes.h @@ -63,8 +63,11 @@ clean : @if exist $(OBJDIR) del $(OBJDIR)\*.obj 1>nul 2>&1 @if exist $(BINDIR) del $(BINDIR)\*.exe 1>nul 2>&1 + @if exist $(BINDIR) del $(BINDIR)\*.dll 1>nul 2>&1 + @if exist $(BINDIR) del $(BINDIR)\*.exp 1>nul 2>&1 + @if exist $(BINDIR) del $(BINDIR)\*.lib 1>nul 2>&1 - @echo clean: deleted all *.obj and *.exe files + @echo clean: deleted all obj, dll, and exe files distclean : clean @if exist $(OBJDIR) rd /q /s $(OBJDIR) @@ -74,6 +77,10 @@ $(MAKE) /nologo /F Makefile.win TOPDIR=$(TOPDIR) clean cd $(TOPDIR) + cd $(PLUGINDIR) + nmake /nologo /F Makefile.win TOPDIR=$(TOPDIR) clean + cd $(TOPDIR) + @echo distclean: removed build destination directories # maintainers-clean will delete the Nmake Helper Command executables. A version Modified: build-utilities/trunk/NMAKE_lineout.exe =================================================================== (Binary files differ) Modified: build-utilities/trunk/NMAKE_stop.exe =================================================================== (Binary files differ) Modified: build-utilities/trunk/Nmake.inc =================================================================== --- build-utilities/trunk/Nmake.inc 2010-08-19 03:32:38 UTC (rev 6119) +++ build-utilities/trunk/Nmake.inc 2010-08-19 15:58:39 UTC (rev 6120) @@ -63,9 +63,9 @@ ASMDIR = $(WINDIR)\asm_src PLUGINDIR = $(WINDIR)\ooRexxProcess -# To build the NSIS plugin, ooRexxProcess, you must set the directory to the -# NSIS plugin library and header files. -NSIS_API_DIR = C:\Tools\NSIS\Examples\Plugin\nsis +# To build the NSIS plugin, ooRexxProcess, you must set NSIS_HOME_DIR to point +# to your installation of NSIS. Do not include the trailing '\'. +NSIS_HOME_DIR = C:\Tools\NSIS # Default ooRexx top level build directory. Change this to point to the correct # directory, or define on the command line to Nmake. Modified: build-utilities/trunk/platform/windows/ooRexxProcess/Makefile.win =================================================================== --- build-utilities/trunk/platform/windows/ooRexxProcess/Makefile.win 2010-08-19 03:32:38 UTC (rev 6119) +++ build-utilities/trunk/platform/windows/ooRexxProcess/Makefile.win 2010-08-19 15:58:39 UTC (rev 6120) @@ -37,21 +37,43 @@ !include $(TOPDIR)\Nmake.inc -LIB = $(LIB);$(NSIS_API_DIR) -INCLUDE = $(INCLUDE);$(NSIS_API_DIR) +!if [if NOT exist $(NSIS_HOME_DIR) exit 1] +!error You must set a correct NSIS_HOME_DIR in Nmake.inc +!endif -VCDEFS = /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_USRDLL" /D "ooRexxProcess_EXPORTS" /D "NSISCALL=__stdcall" /D "_VC80_UPGRADE=0x0600" /D "_WINDLL" /D "_MBCS" +LIB = $(LIB);$(NSIS_HOME_DIR)\Examples\Plugin\nsis +INCLUDE = $(INCLUDE);$(NSIS_HOME_DIR)\Examples\Plugin\nsis +VCDEFS = /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_USRDLL" /D "ooRexxProcess_EXPORTS" /D "NSISCALL=__stdcall" /D "_WINDLL" /D "_MBCS" + CFLAGS = $(CFLAGS) $(VCDEFS) /O1 /I "." /GF /EHsc /MD /GS- /Gy /TP LDFLAGS = /MANIFEST:NO /OUT:$(BINDIR)\ooRexxProcess.dll /INCREMENTAL:NO /DLL /NODEFAULTLIB /NODEFAULTLIB:"libc.lib" /ENTRY:"DllMain" /DYNAMICBASE:NO /IMPLIB:$(BINDIR)\ooRexxProcess.lib /MACHINE:X86 EXLIBS = pluginapi.lib shlwapi.lib kernel32.lib user32.lib comdlg32.lib advapi32.lib shell32.lib -all: $(BINDIR) $(OBJDIR) $(BINDIR)\ooRexxProcess.dll +all : $(BINDIR) $(OBJDIR) $(BINDIR)\ooRexxProcess.dll $(BINDIR)\testProcess.exe +$(BINDIR) : + @if not exist $(BINDIR) md $(BINDIR) + +$(OBJDIR) : + @if not exist $(OBJDIR) md $(OBJDIR) + $(OBJDIR)\ooRexxProcess.obj : ooRexxProcess.cpp ooRexxProcess.hpp $(CC) $(CFLAGS) ooRexxProcess.cpp $(BINDIR)\ooRexxProcess.dll : $(BINDIR) $(OBJDIR) $(OBJDIR)\ooRexxProcess.obj $(LD) $(LDFLAGS) $(OBJDIR)\ooRexxProcess.obj $(EXLIBS) + +$(BINDIR)\testProcess.exe : testProcess.nsi + @makensis testProcess.nsi + @copy testProcess.exe $(BINDIR) + @del testProcess.exe 1>nul 2>&1 + +clean : + @if exist $(OBJDIR) del $(OBJDIR)\ooRexxProcess.obj 1>nul 2>&1 + @if exist $(BINDIR) del $(BINDIR)\ooRexxProcess.* 1>nul 2>&1 + @del testProcess.exe 1>nul 2>&1 + + Modified: build-utilities/trunk/platform/windows/ooRexxProcess/testProcess.nsi =================================================================== --- build-utilities/trunk/platform/windows/ooRexxProcess/testProcess.nsi 2010-08-19 03:32:38 UTC (rev 6119) +++ build-utilities/trunk/platform/windows/ooRexxProcess/testProcess.nsi 2010-08-19 15:58:39 UTC (rev 6120) @@ -42,7 +42,6 @@ # default section Section - StrCpy $0 "Mark Miesfeld" ooRexxProcess::findProcess "rxapi" Pop $R0 MessageBox MB_OK "findProcess rxapi ret = $R0" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |