当前位置: 首页 > 面试题库 >

使用JNA获取正在运行的进程

廖臻
2023-03-14
问题内容

我正在尝试获取Windows机器上所有当前正在运行的进程的列表。

我正在尝试通过JNA的winapi调用EnumProcesses-> OpenProcess-> GetModuleBaseNameW->
CloseHandle尝试OpenProcess调用时失败。GetLastError返回5(ERROR_ACCESS_DENIED)。

这是我的代码:

public static final int PROCESS_QUERY_INFORMATION = 0x0400;
public static final int PROCESS_VM_READ = 0x0010;
public static final int PROCESS_VM_WRITE = 0x0020;
public static final int PROCESS_VM_OPERATION = 0x0008;


public interface Psapi extends StdCallLibrary {
    Psapi INSTANCE = (Psapi) Native.loadLibrary("Psapi", Psapi.class);

    boolean EnumProcesses(int[] ProcessIDsOut, int size, int[] BytesReturned);

    DWORD GetModuleBaseNameW(Pointer hProcess, Pointer hModule, byte[] lpBaseName, int nSize);

}

public interface Kernel32 extends StdCallLibrary {
    Kernel32 INSTANCE = (Kernel32) Native.loadLibrary("Kernel32", Kernel32.class);

    Pointer OpenProcess(int dwDesiredAccess, boolean bInheritHandle, int dwProcessId);

    boolean CloseHandle(Pointer hObject);

}

public static void main(String[] args) {
    int[] processlist = new int[1024];
    int[] dummylist = new int[1024];
    Psapi.INSTANCE.EnumProcesses(processlist, 1024, dummylist);

    for (int pid : processlist) {
        System.out.println(pid);
        Pointer ph = Kernel32.INSTANCE.OpenProcess(PROCESS_VM_READ, false, pid);

        try {
            Thread.sleep(1000);
        } catch (Exception ignore) {
        }

        System.err.println(com.sun.jna.platform.win32.Kernel32.INSTANCE.GetLastError()); // <- 5
        System.err.println(ph); // <- null
        if (ph != null) {
            byte[] filename = new byte[512];
            Psapi.INSTANCE.GetModuleBaseNameW(ph, new Pointer(0), filename, 512);

            try {
                Thread.sleep(1000);
            } catch (Exception ignore) {
            }

            System.err.println(Native.toString(filename));
            Kernel32.INSTANCE.CloseHandle(ph);
        }

    }

}

问题答案:

调用OpenProcesswith
PROCESS_VM_READ表示您想读取该进程的内存。为此,您需要SE_DEBUG_PRIVLEGE。您的应用程序没有该特权,这就是为什么访问被拒绝的原因。

检查MSDN文章ReadProcessMemory。有关如何获取该特权的一些社区内容。



 类似资料:
  • 问题内容: 我试图弄清楚如何从用CreateProcessW创建的过程中读取标准输出/错误。我看了看文档,用谷歌搜索了这个列表,但是我还没有找到好的指针/样本:) 到目前为止,这是我想到的(在Windows上运行良好,这是我的Java代码中的相关代码段): 那么…我该如何获取该过程的输出?任何人都已经做到了,并愿意分享一个样本吗? 谢谢大家的任何帮助。 问题答案: 为了向使用功能创建的进程写入控制

  • 问题内容: 有没有办法获取正在运行的JVM的参数?是否有像jstat这样的命令行工具将JVM的pid作为输入并返回其启动参数?我对启动JVM时给出的-Xmx和- Xms值特别感兴趣。谢谢。 编辑 :澄清我的约束。我们要检查的JVM正在生产服务器上运行。因此,我们更喜欢最小的干扰。我们能够使用jstat监视JVM,因此我们希望有一个类似的简单解决方案来访问参数。 编辑 :我们还尝试使用jvisual

  • 问题内容: 这听起来并不像恶意的那样,我想获取当前窗口的大小,而不是查看它们的内容。目的是弄清楚如果其他所有窗口都全屏显示,那么我也应该像这样启动。或者,尽管分辨率很高,但所有其他进程的分辨率仅为800x600,那么这可能正是用户想要的。为什么要让他们浪费时间和精力来调整我的窗口的大小以匹配他们拥有的所有其他窗口?我主要是Windows devoloper,但如果有跨平台的方法可以做到,那么至少不

  • 问题内容: 我在上一个线程http://codingdict.com/questions/105948上问了类似的问题,但是我被引导使用JNI, “它并没有取得太大的成功。。。我已经阅读了一些教程,虽然有些可以很好地工作,但其他的我仍然无法获得我所需要的信息,这就是前台窗口的标题。 现在,我正在研究JNA,但我不知道如何访问GetForegroundWindow()…我认为一旦使用以下代码(在另一

  • 当我的selenium程序由于某些错误而崩溃时,它似乎会留下正在运行的进程。 例如,这是我的流程列表: 这是我的代码: 有时,浏览器加载网页元素的速度不够快,所以当它试图点击它没有找到的东西时,Selenium会崩溃。其他时候它工作正常。 为了简单起见,这是一个简单的例子,但是对于一个更复杂的硒程序,什么是保证干净退出而不留下正在运行的进程的方法?它应该在意外崩溃和成功运行时干净退出。