我们正在使用createProcessAsUser函数创建一个子进程,该子进程在使用waffle和JNA库的登录/模拟用户的上下文中运行。但是我们需要在模拟之后加载用户配置文件,但是LoadUserProfile函数在JNA库中不可用。我们发现CreateProcessWithTokenW能够加载用户配置文件,但是这个功能在JNA/Waffle库中也没有。有人能帮助我们如何加载用户配置文件或如何使用Java应用程序中的CreateProcessWithTokenW吗?
imzjd6km1#
要在JNA中使用java的CreateProcessWithTokenW,你需要绑定函数。JNA只是一个层,它使得直接调用本机库函数成为可能。为了实现这一点,JNA使用本机接口的java描述,然后使用这些描述来执行实际的调用。jna平台contrib项目(与主项目一起发布)包含大量已经绑定的win32函数,实际上在Advapi32.java中已经有CreateProcessAsUser和CreateProcessWithLogonW的绑定。基于此,我将尝试以下操作(未经测试!):
CreateProcessWithTokenW
Advapi32.java
CreateProcessAsUser
CreateProcessWithLogonW
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。
w32.ascii
false
W32APIFunctionMapper.UNICODE
W32APITypeMapper.UNICODE
String
wchars
LP*WSTR
1条答案
按热度按时间imzjd6km1#
要在JNA中使用java的
CreateProcessWithTokenW
,你需要绑定函数。JNA只是一个层,它使得直接调用本机库函数成为可能。为了实现这一点,JNA使用本机接口的java描述,然后使用这些描述来执行实际的调用。jna平台contrib项目(与主项目一起发布)包含大量已经绑定的win32函数,实际上在
Advapi32.java
中已经有CreateProcessAsUser
和CreateProcessWithLogonW
的绑定。基于此,我将尝试以下操作(未经测试!):这假定您运行时系统属性
w32.ascii
设置为false
或unset,这是建议的设置。在这种情况下,将使用W32APIFunctionMapper.UNICODE
,它会自动附加“W”后缀。然后还选择W32APITypeMapper.UNICODE
,以确保javaString
对象Map到wchars
,或者在函数调用时Map到LP*WSTR
。