如何在使用JNA的Java中使用CreateProcessWithTokenW

zdwk9cvp  于 2023-01-07  发布在  Java
关注(0)|答案(1)|浏览(233)

我们正在使用createProcessAsUser函数创建一个子进程,该子进程在使用waffle和JNA库的登录/模拟用户的上下文中运行。
但是我们需要在模拟之后加载用户配置文件,但是LoadUserProfile函数在JNA库中不可用。
我们发现CreateProcessWithTokenW能够加载用户配置文件,但是这个功能在JNA/Waffle库中也没有。
有人能帮助我们如何加载用户配置文件或如何使用Java应用程序中的CreateProcessWithTokenW吗?

imzjd6km

imzjd6km1#

要在JNA中使用java的CreateProcessWithTokenW,你需要绑定函数。JNA只是一个层,它使得直接调用本机库函数成为可能。为了实现这一点,JNA使用本机接口的java描述,然后使用这些描述来执行实际的调用。
jna平台contrib项目(与主项目一起发布)包含大量已经绑定的win32函数,实际上在Advapi32.java中已经有CreateProcessAsUserCreateProcessWithLogonW的绑定。基于此,我将尝试以下操作(未经测试!):

public interface Advapi32Ext extends StdCallLibrary {
    Advapi32Ext INSTANCE = Native.load("Advapi32", Advapi32Ext.class, W32APIOptions.DEFAULT_OPTIONS);

    boolean CreateProcessWithToken(
        HANDLE hToken,
        int dwLogonFlags,
        String lpApplicationName,
        String lpCommandLine,
        int dwCreationFlags,
        Pointer lpEnvironment,
        String lpCurrentDirectory,
        STARTUPINFO lpStartupInfo,
        PROCESS_INFORMATION lpProcessInfo
    );
}

这假定您运行时系统属性w32.ascii设置为false或unset,这是建议的设置。在这种情况下,将使用W32APIFunctionMapper.UNICODE,它会自动附加“W”后缀。然后还选择W32APITypeMapper.UNICODE,以确保java String对象Map到wchars,或者在函数调用时Map到LP*WSTR

相关问题