JNA:获取所有Windows进程命令行

时间:2013-05-04 20:20:47

标签: windows command-line jna

通过使用JNA获取所有当前运行的Windows程序及其命令行的列表来寻找一种方法。这个网站上有一些教程(Get list of processes on Windows in a charset-safe way),它们展示了如何获取正在运行的程序名列表,但我正在寻找完整的命令行。我看过帖子提到使用Module32First函数来做到这一点,但我似乎找不到任何关于如何通过JNA使用它的文档。有什么想法吗?

编辑:

我目前在上述帖子中尝试过以下内容。我们的想法是,我们需要一种在进程中迭代窗口上当前正在运行的进程并获取其命令行的方法。我们不想使用wmic。

   Kernel32 kernel32 = (Kernel32) Native.loadLibrary(Kernel32.class, W32APIOptions.UNICODE_OPTIONS);
    Tlhelp32.PROCESSENTRY32.ByReference processEntry = new Tlhelp32.PROCESSENTRY32.ByReference();          

    WinNT.HANDLE snapshot = kernel32.CreateToolhelp32Snapshot(Tlhelp32.TH32CS_SNAPPROCESS, new WinDef.DWORD(0));
    try  {
        while (kernel32.Process32Next(snapshot, processEntry)) {             
            System.out.println(processEntry.th32ProcessID + "\t" + Native.toString(processEntry.szExeFile));
        }
    }
    finally {
        kernel32.CloseHandle(snapshot);
    }

EDIT2:

查看windows api(http://msdn.microsoft.com/en-us/library/windows/desktop/ms684839(v=vs.85).aspx),它说明如下。我正试图通过JNA获得可执行文件的完整路径。我想这是Module32First函数,JNA不支持MODULE32ENTRY结构。

szExeFile 进程的可执行文件的名称。要检索可执行文件的完整路径,请调用Module32First函数并检查返回的MODULEENTRY32结构的szExePath成员。但是,如果调用进程是32位进程,则必须调用QueryFullProcessImageName函数以检索64位进程的可执行文件的完整路径。

1 个答案:

答案 0 :(得分:0)

到目前为止你尝试了什么?类型映射很简单,JNA旨在允许您轻松扩展现有定义以扩充它们。

// Original C
typedef struct tagMODULEENTRY32 {
  DWORD   dwSize;
  DWORD   th32ModuleID;
  DWORD   th32ProcessID;
  DWORD   GlblcntUsage;
  DWORD   ProccntUsage;
  BYTE    *modBaseAddr;
  DWORD   modBaseSize;
  HMODULE hModule;
  TCHAR   szModule[MAX_MODULE_NAME32 + 1];
  TCHAR   szExePath[MAX_PATH];
} MODULEENTRY32, *PMODULEENTRY32;

// JNA equivalent (unicode version)
public interface MyKernel32 extends Kernel32 {
    class MODULEENTRY32 extends Structure {
        DWORD dwSize;
        DWORD th32ModuleID;
        DWORD th32ProcessID;
        DWORD GlblcntUsage;
        DWORD ProccntUsage;
        Pointer modBaseAddr;
        DWORD modBaseSize;
        HMODULE hModule;
        char[] szModule = new char[MAX_MODUE_NAME32+1];
        char[] szExePath = new char[MAX_PATH];
        public String szModule() { return Native.toString(this.szModule); }
        public String szExePath() { return Native.toString(this.szExePath); }
        protected List getFieldOrder() {
            return Arrays.asList(new String[] {
                "dwSize", "th32ModuleID", "th32ProcessID", "GlblcntUsage", "ProccntUsage", "modBaseAddr", "modBaseSize", "hModule", "szModule", "szExePath",
            });
        }
    }

    MyKernel32 INSTANCE = (MyKernel32)Native.loadLibrary("kernel32", W32DEFAULT_OPTIONS);
    boolean Module32First(HANDLE hSnapshot, MODULEENTRY32 lpme);
}