diff --git a/src/main/java/ooo/oshi/foreign/windows/WtsApi32.java b/src/main/java/ooo/oshi/foreign/windows/WtsApi32.java new file mode 100644 index 0000000..43e7c45 --- /dev/null +++ b/src/main/java/ooo/oshi/foreign/windows/WtsApi32.java @@ -0,0 +1,74 @@ +package ooo.oshi.foreign.windows; + +import java.lang.foreign.*; +import java.lang.invoke.MethodHandle; + +import static java.lang.foreign.ValueLayout.*; + +public class WtsApi32 { + + private static final SymbolLookup WTSAPI32; + private static final Linker LINKER; + + static { + LINKER = Linker.nativeLinker(); + System.loadLibrary("wtsapi32"); + WTSAPI32 = SymbolLookup.loaderLookup(); + } + + private static MethodHandle methodHandle(String methodName, FunctionDescriptor fd) { + return LINKER.downcallHandle(WTSAPI32.lookup(methodName).orElseThrow(), fd); + } + + private static final MethodHandle WTSEnumerateProcessEx = methodHandle("WTSEnumerateProcessesW", FunctionDescriptor.of(JAVA_BOOLEAN, JAVA_INT, JAVA_INT, JAVA_INT, ADDRESS, ADDRESS)); + + private static final GroupLayout _WTS_PROCESS_INFOA = MemoryLayout.structLayout( + JAVA_INT.withName("SessionId"), + JAVA_INT.withName("ProcessId"), + ADDRESS.withName("pProcessName"), + ADDRESS.withName("pUserSid") + ).withName("WTS_PROCESS_INFOA"); + + /** + * Refer to Win32API + */ + public static void enumerateProcesses() { + try { + try (MemorySession session = MemorySession.openConfined()) { + int hServer = 0; // represents null handle + int version = 1; // version of enumerated request, must be 1 + // out variables + var processArrayLayout = MemoryLayout.sequenceLayout(1024, _WTS_PROCESS_INFOA); + Addressable ppProcessInfo = session.allocate(processArrayLayout); // array of WTS_PROCESS_INFO + Addressable pCount = session.allocate(JAVA_INT); // process count + + if (!(boolean) WTSEnumerateProcessEx.invokeExact(hServer, 0, version, ppProcessInfo, pCount)) + throw new Exception("error calling WTSEnumerateProcessesA"); + + int processCount = pCount.address().get(JAVA_INT, 0); + System.out.println("Total processes found: " + processCount); + +// var sequenceVH = processArrayLayout.varHandle(PathElement.sequenceElement(), PathElement.groupElement("ProcessId")); +// System.out.println(sequenceVH.get(ppProcessInfo, 0)); + var sess_vh = processArrayLayout.varHandle(PathElement.sequenceElement(), PathElement.groupElement("SessionId")); + var pid_vh = processArrayLayout.varHandle(PathElement.sequenceElement(), PathElement.groupElement("ProcessId")); + var pname_vh = processArrayLayout.varHandle(PathElement.sequenceElement(), PathElement.groupElement("pProcessName")); + var sid_vh = processArrayLayout.varHandle(PathElement.sequenceElement(), PathElement.groupElement("pUserSid")); +// System.out.println(ppProcessInfo.address().get(JAVA_INT,0)); +// System.out.println(ppProcessInfo.address().get(JAVA_INT,32)); +// System.out.println(ppProcessInfo.address().get(JAVA_CHAR,64)); + for (int i = 0; i < processCount; i++) { + System.out.println(sess_vh.get(ppProcessInfo, i)); + System.out.println(pid_vh.get(ppProcessInfo, i)); + System.out.println(pname_vh.get(ppProcessInfo, i)); + System.out.println(sid_vh.get(ppProcessInfo, i)); + } + } + } catch (Throwable ex) { + ex.printStackTrace(); + } + + } + + +} diff --git a/src/test/java/ooo/oshi/Kernel32Test.java b/src/test/java/ooo/oshi/Kernel32Test.java index 8da3e2f..eb8ac8a 100644 --- a/src/test/java/ooo/oshi/Kernel32Test.java +++ b/src/test/java/ooo/oshi/Kernel32Test.java @@ -1,24 +1,28 @@ package ooo.oshi; import ooo.oshi.foreign.windows.Kernel32Library; +import ooo.oshi.foreign.windows.WtsApi32; import ooo.oshi.software.os.OperatingSystem; public class Kernel32Test { public static void main(String[] args) { - - System.out.println("The operating system is: " + SystemInfo.getCurrentPlatform().getName()); - SystemInfo si = new SystemInfo(); - OperatingSystem os = si.getOperatingSystem(); - int currentProcessId = os.getProcessId(); - System.out.println("The current Process ID is: " + currentProcessId); - - String computerName = Kernel32Library.getComputerName(); - System.out.println("Computer Name: " + computerName); - - String tempPath = Kernel32Library.getTempPath(); - System.out.println("Temp Path: " + tempPath); - - String processName = Kernel32Library.queryFullProcessImageName(currentProcessId, 0); - System.out.println("Current Process: " + processName); + + + WtsApi32.enumerateProcesses(); + +// System.out.println("The operating system is: " + SystemInfo.getCurrentPlatform().getName()); +// SystemInfo si = new SystemInfo(); +// OperatingSystem os = si.getOperatingSystem(); +// int currentProcessId = os.getProcessId(); +// System.out.println("The current Process ID is: " + currentProcessId); +// +// String computerName = Kernel32Library.getComputerName(); +// System.out.println("Computer Name: " + computerName); +// +// String tempPath = Kernel32Library.getTempPath(); +// System.out.println("Temp Path: " + tempPath); +// +// String processName = Kernel32Library.queryFullProcessImageName(currentProcessId, 0); +// System.out.println("Current Process: " + processName); } }