diff -r ffab885766c7 -r 3f82716744b9 Win32OperatingSystem.st --- a/Win32OperatingSystem.st Fri Mar 15 15:31:48 2019 +0100 +++ b/Win32OperatingSystem.st Sat Mar 16 00:51:37 2019 +0100 @@ -358,6 +358,10 @@ # include # endif +// not needed +// #define PSAPI_VERSION 1 +// #include + # ifndef WINDOWSX_H_INCLUDED # define WINDOWSX_H_INCLUDED # include @@ -3855,68 +3859,68 @@ ! exec:aCommandPath withArguments:argString environment:environment fileDescriptors:fdArray fork:doFork - newPgrp:newPgrp inDirectory:aDirectory - showWindow:showWindowBooleanOrNil + newPgrp:newPgrp inDirectory:aDirectory + showWindow:showWindowBooleanOrNil "Internal lowLevel entry for combined fork & exec for WIN32 If fork is false (chain a command): - execute the OS command specified by the argument, aCommandPath, with - arguments in argArray (no arguments, if nil). - If successful, this method does not return and smalltalk is gone. - If not successful, it does return. - Normal use is with forkForCommand. + execute the OS command specified by the argument, aCommandPath, with + arguments in argArray (no arguments, if nil). + If successful, this method does not return and smalltalk is gone. + If not successful, it does return. + Normal use is with forkForCommand. If fork is true (subprocess command execution): - fork a child to do the above. - The Win32ProcessHandle of the child process is returned; nil if the fork failed. + fork a child to do the above. + The Win32ProcessHandle of the child process is returned; nil if the fork failed. fdArray contains the filedescriptors, to be used for the child (if fork is true). - fdArray[1] = 15 -> use fd 15 as stdin. - If an element of the array is set to nil, the corresponding filedescriptor - will be closed for the child. - fdArray[0] == StdIn for child - fdArray[1] == StdOut for child - fdArray[2] == StdErr for child + fdArray[1] = 15 -> use fd 15 as stdin. + If an element of the array is set to nil, the corresponding filedescriptor + will be closed for the child. + fdArray[0] == StdIn for child + fdArray[1] == StdOut for child + fdArray[2] == StdErr for child NOTE that in WIN32 the fds are HANDLES. If newPgrp is true, the subprocess will be established in a new process group. - The processgroup will be equal to id. - newPgrp is not used on WIN32 and VMS systems. + The processgroup will be equal to id. + newPgrp is not used on WIN32 and VMS systems. showWindowOrBoolean may be: - true - a window is shown on start of the command - false - the command window is hidden - nil - the nCmdShown parameter of the commans's winmain function determins, - if a window is shown. - #default - - same as nil + true - a window is shown on start of the command + false - the command window is hidden + nil - the nCmdShown parameter of the commans's winmain function determins, + if a window is shown. + #default + - same as nil " |dirPath handle| aDirectory notNil ifTrue:[ - dirPath := aDirectory asFilename asAbsoluteFilename osNameForDirectory. - (dirPath endsWith:':') ifTrue:[ - dirPath := dirPath , '\'. - ]. + dirPath := aDirectory asFilename asAbsoluteFilename osNameForDirectory. + (dirPath endsWith:':') ifTrue:[ + dirPath := dirPath , '\'. + ]. ]. handle := self - primExec:aCommandPath - commandLine:argString - environment:environment - fileDescriptors:fdArray - fork:doFork - newPgrp:newPgrp - inPath:dirPath - createFlags:nil - inheritHandles:true - showWindow:showWindowBooleanOrNil. + primExec:aCommandPath + commandLine:argString + environment:environment + fileDescriptors:fdArray + fork:doFork + newPgrp:newPgrp + inPath:dirPath + createFlags:nil + inheritHandles:true + showWindow:showWindowBooleanOrNil. handle notNil ifTrue:[ - handle registerForFinalization. + handle registerForFinalization. ]. "/ 'created ' print. cmdLine print. ' -> ' print. rslt printCR. @@ -5872,15 +5876,15 @@ OBJ data; if (__isByteArrayLike(aByteArray) && __isStringLike(which)) { - // be careful: fileInfo points into aByteArray! - // Beware of garbage collection after VerQueryValue()! - // We use a fixed max size of 1000 bytes here. - data = __BYTEARRAY_UNINITIALIZED_NEW_INT(1000); - if (VerQueryValue(__byteArrayVal(aByteArray), __stringVal(which), (LPVOID) &fileInfo, &uLen) == FALSE) { - RETURN (nil); - } - memcpy(__byteArrayVal(data), fileInfo, min(1000, uLen)); - RETURN (data); + // be careful: fileInfo points into aByteArray! + // Beware of garbage collection after VerQueryValue()! + // We use a fixed max size of 1000 bytes here. + data = __BYTEARRAY_UNINITIALIZED_NEW_INT(1000); + if (VerQueryValue(__byteArrayVal(aByteArray), __stringVal(which), (LPVOID) &fileInfo, &uLen) == FALSE) { + RETURN (nil); + } + memcpy(__byteArrayVal(data), fileInfo, min(1000, uLen)); + RETURN (data); } badArgument: ; %}. @@ -5888,8 +5892,8 @@ " 100000 timesRepeat:[ - OperatingSystem getFileInfos:#('ProductVersion' 'CompanyName' 'FileDescription' 'FileVersion' 'ProductName') - fromFile:'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe' + OperatingSystem getFileInfos:#('ProductVersion' 'CompanyName' 'FileDescription' 'FileVersion' 'ProductName') + fromFile:'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe' ]. " @@ -6195,7 +6199,7 @@ bytes := self getFileVersionInfoOf:(filename asFilename osName). bytes isEmptyOrNil ifTrue:[ - ^ Dictionary new. + ^ Dictionary new. ]. self extractVersionValue:'\' from:bytes. @@ -6203,13 +6207,13 @@ lang := vfi unsignedInt16At:1. codePage := vfi unsignedInt16At:3. stringFileInfoBase := '\StringFileInfo\%1%2\' - bindWith:(lang hexPrintString:4) - with:(codePage hexPrintString:4). + bindWith:(lang hexPrintString:4) + with:(codePage hexPrintString:4). ^ Dictionary withKeys:infoKeys valueBlock:[:eachKey| - |sfi| - sfi := self extractVersionValue:(stringFileInfoBase, eachKey) from:bytes. - sfi zeroByteStringAt:1 maximumSize:999 - ]. + |sfi| + sfi := self extractVersionValue:(stringFileInfoBase, eachKey) from:bytes. + sfi zeroByteStringAt:1 maximumSize:999 + ]. " self getFileInfos:#('ProductVersion' 'CompanyName' 'FileDescription' 'FileVersion' 'ProductName') fromFile:'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe' @@ -6359,30 +6363,30 @@ // GetSystemWow64DirectoryW(&fileTime); // can be called directly. { - typedef unsigned int (WINAPI *P_GetSystemWow64DirectoryW)(LPTSTR, unsigned int); - static P_GetSystemWow64DirectoryW pGetSystemWow64DirectoryW = NULL; - static int didCheck = 0; - - if (pGetSystemWow64DirectoryW == NULL) { - if (!didCheck) { - pGetSystemWow64DirectoryW = - (P_GetSystemWow64DirectoryW) - GetProcAddress ( GetModuleHandle ("kernel32.dll"), - "GetSystemWow64DirectoryW"); - - didCheck = 1; - } - } - - if (pGetSystemWow64DirectoryW != NULL) { - __rslt = (*pGetSystemWow64DirectoryW)(buffer, MAXPATHLEN); - } + typedef unsigned int (WINAPI *P_GetSystemWow64DirectoryW)(LPTSTR, unsigned int); + static P_GetSystemWow64DirectoryW pGetSystemWow64DirectoryW = NULL; + static int didCheck = 0; + + if (pGetSystemWow64DirectoryW == NULL) { + if (!didCheck) { + pGetSystemWow64DirectoryW = + (P_GetSystemWow64DirectoryW) + GetProcAddress ( GetModuleHandle ("kernel32.dll"), + "GetSystemWow64DirectoryW"); + + didCheck = 1; + } + } + + if (pGetSystemWow64DirectoryW != NULL) { + __rslt = (*pGetSystemWow64DirectoryW)(buffer, MAXPATHLEN); + } } #else __rslt = GetSystemWow64DirectoryW(buffer, MAXPATHLEN); #endif if (__rslt != 0) { - rslt = __mkStringOrU16String_maxlen(buffer, MAXPATHLEN); + rslt = __mkStringOrU16String_maxlen(buffer, MAXPATHLEN); } %}. ^ rslt @@ -7769,20 +7773,20 @@ %{ if (__isExternalAddressLike(processHandleOrPid) ) { - HANDLE hProcess = _HANDLEVal(processHandleOrPid); - - if (hProcess != 0) { - TerminateProcess( hProcess, __intVal(exitCode) ); - } - RETURN( self ); + HANDLE hProcess = _HANDLEVal(processHandleOrPid); + + if (hProcess != 0) { + TerminateProcess( hProcess, __intVal(exitCode) ); + } + RETURN( self ); } else if( __isSmallInteger(processHandleOrPid) ) { - HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0, __smallIntegerVal(processHandleOrPid)); - - if( hProcess != 0 ) { - TerminateProcess( hProcess, __intVal(exitCode) ); - CloseHandle(hProcess); - } - RETURN( self ); + HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0, __smallIntegerVal(processHandleOrPid)); + + if( hProcess != 0 ) { + TerminateProcess( hProcess, __intVal(exitCode) ); + CloseHandle(hProcess); + } + RETURN( self ); } %}. self primitiveFailed:#invalidParameter. @@ -8030,12 +8034,12 @@ HANDLE __pid; if (!__isExternalAddressLike(pid) || (__pid = _HANDLEVal(pid)) == 0) { - RETURN(self); - } + RETURN(self); + } #ifdef PROCESSDEBUGWIN32 if (flag_PROCESSDEBUGWIN32) { - console_printf("Close ProcessHandle %x\n", __pid); + console_printf("Close ProcessHandle %x\n", __pid); } #endif CloseHandle(__pid); @@ -9376,6 +9380,50 @@ " ! +xx_getAllProcessIds + "not needed - use getAllProcesses. + returns a collection of processID, + of all processes in the system" + +%{ +#if 0 + OBJ pidArray; + DWORD *processes; + DWORD cbNeeded, nProcesses; + int i, moreNeeded = 1; + // Get the list of process identifiers. + int nProcSpace = 512; + + while (moreNeeded) { + processes = (DWORD*)malloc(nProcSpace*sizeof(DWORD)); + if (! EnumProcesses( processes, (nProcSpace*sizeof(DWORD)), &cbNeeded ) ) { + goto failed; + } + moreNeeded = (cbNeeded == (nProcSpace*sizeof(DWORD))); + if (moreNeeded) { + // returned exactly the size I gave it; maybe there are more + nProcSpace *= 2; + free (processes); + } + } + // Calculate how many process identifiers were returned. + nProcesses = cbNeeded / sizeof(DWORD); + pidArray = __ARRAY_NEW_INT(nProcesses); + if (pidArray != nil) { + for (i=0; ia_element[i] = __mkSmallInteger(processes[i]); + } + RETURN ( pidArray ); + } +failed: ; +#endif +%}. + self primitiveFailed. +! + + " + OperatingSystem getProcessId + " getSystemID "if supported by the OS, return the systemID; a unique per machine identification. @@ -10495,22 +10543,22 @@ #define DM_OUT_DEFAULT DM_UPDATE " nBytesNeeded := self - primDocumentProperties:nil - hPrinter:hPrinter - pDeviceName: deviceName - pDevModeOutput:nil - pDevModeInput:nil - fMode:0. + primDocumentProperties:nil + hPrinter:hPrinter + pDeviceName: deviceName + pDevModeOutput:nil + pDevModeInput:nil + fMode:0. devModeOutput := DevModeStructure new:(nBytesNeeded * 2 "never trust MS !!"). rslt := self - primDocumentProperties:nil - hPrinter:hPrinter - pDeviceName: deviceName - pDevModeOutput:devModeOutput - pDevModeInput:pDevModeInputOrNil - fMode:4+2. + primDocumentProperties:nil + hPrinter:hPrinter + pDeviceName: deviceName + pDevModeOutput:devModeOutput + pDevModeInput:pDevModeInputOrNil + fMode:4+2. ^ devModeOutput @@ -12283,33 +12331,33 @@ char *name = (char *)0; if (firstCall) { - DWORD nameSize = sizeof(cachedName); - - if (GetUserName(cachedName, &nameSize) == TRUE) { - name = cachedName; - firstCall = 0; - } + DWORD nameSize = sizeof(cachedName); + + if (GetUserName(cachedName, &nameSize) == TRUE) { + name = cachedName; + firstCall = 0; + } } else { - name = cachedName; + name = cachedName; } /* * try a few common environment variables ... */ if (! name || (name[0] == 0) ) { - name = getenv("LOGIN"); - if (! name || (name[0] == 0) ) { - name = getenv("LOGNAME"); - if (! name || (name[0] == 0) ) { - name = getenv("USER"); - } - } + name = getenv("LOGIN"); + if (! name || (name[0] == 0) ) { + name = getenv("LOGNAME"); + if (! name || (name[0] == 0) ) { + name = getenv("USER"); + } + } } /* * nope - I really font know who you are. */ if (! name || (name[0] == 0) ) { - name = "you"; + name = "you"; } RETURN ( __MKSTRING(name) ); @@ -14746,21 +14794,21 @@ |index objectArray object debugBlock| debugBlock := [:obj| - ^ 'obj:', obj , ' this:', self printString , ' idx:', self indexedName - ]. + ^ 'obj:', obj , ' this:', self printString , ' idx:', self indexedName + ]. objectArray := self data objectArray. index := self indexedNameNumbered. index == 0 ifTrue:[ - object := objectArray at:1 ifAbsent:[debugBlock value:(object at:#ObjectNameTitle)]. + object := objectArray at:1 ifAbsent:[debugBlock value:(object at:#ObjectNameTitle)]. ] ifFalse:[ - object := objectArray detect:[:el| (el at:#ObjectNameTitleIndex) == index] - ifNone:[self error:'counter not found']. - ]. - - ^ (object at:#Counters) - collect:[:el| {el at:#CounterNameTitle. el at:#CounterNameTitleIndex}]. + object := objectArray detect:[:el| (el at:#ObjectNameTitleIndex) == index] + ifNone:[self error:'counter not found']. + ]. + + ^ (object at:#Counters) + collect:[:el| {el at:#CounterNameTitle. el at:#CounterNameTitleIndex}]. "Modified: / 07-03-2019 / 16:29:51 / Stefan Vogel" ! !