From e01d4e3a748d9d5653f8c37bbb442666160c099a Mon Sep 17 00:00:00 2001 From: adrian-kong Date: Sun, 18 Dec 2022 12:33:27 +1100 Subject: [PATCH 1/3] playing around with wtsapi32 --- .../ooo/oshi/foreign/windows/WtsApi32.java | 63 +++++++++++++++++++ src/test/java/ooo/oshi/Kernel32Test.java | 34 +++++----- 2 files changed, 82 insertions(+), 15 deletions(-) create mode 100644 src/main/java/ooo/oshi/foreign/windows/WtsApi32.java 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..0ceffd0 --- /dev/null +++ b/src/main/java/ooo/oshi/foreign/windows/WtsApi32.java @@ -0,0 +1,63 @@ +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("WTSEnumerateProcessesA", FunctionDescriptor.of(JAVA_BOOLEAN, JAVA_INT, JAVA_INT, JAVA_INT, ADDRESS, ADDRESS)); + + private static final MemoryLayout _WTS_PROCESS_INFOA = MemoryLayout.structLayout( + JAVA_INT.withName("SessionId"), + JAVA_INT.withName("ProcessId"), + JAVA_CHAR.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 + Addressable ppProcessInfo = session.allocate(_WTS_PROCESS_INFOA); // array of WTS_PROCESS_INFO + Addressable pCount = session.allocate(JAVA_INT); // process count + var ret = (boolean) WTSEnumerateProcessEx.invokeExact(hServer, 0, version, ppProcessInfo, pCount); + + if (!ret) throw new Exception("error calling WTSEnumerateProcessesA"); + + int processCount = ppProcessInfo.address().get(JAVA_INT, 0) - 1; + System.out.println("Total processes found: " + processCount); + +// for (int i = 0; i < processCount; i++) { +// +// } + + System.out.println(pCount.address().get(JAVA_INT, 0)); + } + } 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); } } From 15f429167660d6e6327092c11d50c9dde725066a Mon Sep 17 00:00:00 2001 From: adrian-kong Date: Sat, 31 Dec 2022 14:35:45 +1100 Subject: [PATCH 2/3] =?UTF-8?q?some=20more=20debugging=20...=20?= =?UTF-8?q?=F0=9F=9B=A0=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ooo/oshi/foreign/windows/WtsApi32.java | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/main/java/ooo/oshi/foreign/windows/WtsApi32.java b/src/main/java/ooo/oshi/foreign/windows/WtsApi32.java index 0ceffd0..8297987 100644 --- a/src/main/java/ooo/oshi/foreign/windows/WtsApi32.java +++ b/src/main/java/ooo/oshi/foreign/windows/WtsApi32.java @@ -22,7 +22,7 @@ private static MethodHandle methodHandle(String methodName, FunctionDescriptor f private static final MethodHandle WTSEnumerateProcessEx = methodHandle("WTSEnumerateProcessesA", FunctionDescriptor.of(JAVA_BOOLEAN, JAVA_INT, JAVA_INT, JAVA_INT, ADDRESS, ADDRESS)); - private static final MemoryLayout _WTS_PROCESS_INFOA = MemoryLayout.structLayout( + private static final GroupLayout _WTS_PROCESS_INFOA = MemoryLayout.structLayout( JAVA_INT.withName("SessionId"), JAVA_INT.withName("ProcessId"), JAVA_CHAR.withName("pProcessName"), @@ -30,7 +30,7 @@ private static MethodHandle methodHandle(String methodName, FunctionDescriptor f ).withName("WTS_PROCESS_INFOA"); /** - * Refer to Win32API + * Refer to Win32API */ public static void enumerateProcesses() { try { @@ -38,20 +38,25 @@ public static void enumerateProcesses() { int hServer = 0; // represents null handle int version = 1; // version of enumerated request, must be 1 // out variables - Addressable ppProcessInfo = session.allocate(_WTS_PROCESS_INFOA); // array of WTS_PROCESS_INFO + 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 - var ret = (boolean) WTSEnumerateProcessEx.invokeExact(hServer, 0, version, ppProcessInfo, pCount); - if (!ret) throw new Exception("error calling WTSEnumerateProcessesA"); + if (!(boolean) WTSEnumerateProcessEx.invokeExact(hServer, 0, version, ppProcessInfo, pCount)) + throw new Exception("error calling WTSEnumerateProcessesA"); - int processCount = ppProcessInfo.address().get(JAVA_INT, 0) - 1; + 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 vh = processArrayLayout.varHandle(PathElement.sequenceElement(2), PathElement.groupElement("ProcessId")); + System.out.println(vh.get(ppProcessInfo)); +// 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(pCount.address().get(JAVA_INT, 0)); } } catch (Throwable ex) { ex.printStackTrace(); From 5dcde1d3ac1d4d7c1b9170c5ce901fbe8493d73b Mon Sep 17 00:00:00 2001 From: adrian-kong Date: Sun, 1 Jan 2023 15:48:31 +1100 Subject: [PATCH 3/3] =?UTF-8?q?=F0=9F=9B=A0=EF=B8=8F=20no=20more=20crashes?= =?UTF-8?q?,=20but=20output=20is=20incorrect?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ooo/oshi/foreign/windows/WtsApi32.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/java/ooo/oshi/foreign/windows/WtsApi32.java b/src/main/java/ooo/oshi/foreign/windows/WtsApi32.java index 8297987..43e7c45 100644 --- a/src/main/java/ooo/oshi/foreign/windows/WtsApi32.java +++ b/src/main/java/ooo/oshi/foreign/windows/WtsApi32.java @@ -20,12 +20,12 @@ private static MethodHandle methodHandle(String methodName, FunctionDescriptor f return LINKER.downcallHandle(WTSAPI32.lookup(methodName).orElseThrow(), fd); } - private static final MethodHandle WTSEnumerateProcessEx = methodHandle("WTSEnumerateProcessesA", FunctionDescriptor.of(JAVA_BOOLEAN, JAVA_INT, JAVA_INT, JAVA_INT, ADDRESS, ADDRESS)); + 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"), - JAVA_CHAR.withName("pProcessName"), + ADDRESS.withName("pProcessName"), ADDRESS.withName("pUserSid") ).withName("WTS_PROCESS_INFOA"); @@ -50,13 +50,19 @@ public static void enumerateProcesses() { // var sequenceVH = processArrayLayout.varHandle(PathElement.sequenceElement(), PathElement.groupElement("ProcessId")); // System.out.println(sequenceVH.get(ppProcessInfo, 0)); - var vh = processArrayLayout.varHandle(PathElement.sequenceElement(2), PathElement.groupElement("ProcessId")); - System.out.println(vh.get(ppProcessInfo)); + 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++) { -// } + 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();