java如何使用JNA调用SetProcessReliationPolicy
<>我试图通过JNA:将这段C++代码转换成java代码PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY signaturePolicy = {};
signaturePolicy.MicrosoftSignedOnly = true;
SetProcessMitigationPolicy(ProcessSignaturePolicy, &signaturePolicy, sizeof(signaturePolicy));
我已经有了来自Kernel32.dll
的函数SetProcessMitigationPolicy
,我可以调用它,但是如何传递这样的参数呢
你能举个例子吗
更新:
我已经尝试了下面的代码,但仍然不起作用。函数声明是否正确?显然,函数返回true,我没有得到任何错误
// Main
private static final Kernel32 kernel32 = Kernel32.INSTANCE;
public static void main(String[] args) {
PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY signaturePolicy = new PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY();
signaturePolicy.MicrosoftSignedOnly = 1;
signaturePolicy.write();
BaseTSD.SIZE_T dwLength = new BaseTSD.SIZE_T(signaturePolicy.size());
boolean success = kernel32.SetProcessMitigationPolicy(8, signaturePolicy.getPointer(), dwLength);
System.out.println("Result: " + success);
while (true);
}
// PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY
@Structure.FieldOrder({"MicrosoftSignedOnly"})
public final class PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY extends Structure {
public int MicrosoftSignedOnly;
}
# 1 楼答案
^{} 函数有三个参数
第一个参数是PROCESS_MITIGATION_POLICY枚举。这是一个简单的整数(从0开始),指示要使用哪个策略。示例代码显示了枚举的
ProcessSignaturePolicy
成员。这就是整数8示例代码显示,您正在使用
PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY
结构作为第二个参数。这实际上被映射为一个32位并集,其中一个是DWORD
(可以映射为int),另一个是位字段总计32位的结构。JNA没有映射位字段的方法,所以需要直接设置这些位。所以我要简化映射,只把这个结构映射为Flags
字段:MS文档指定位字段start at the least significant bit。因此
signaturePolicy.MicrosoftSignedOnly = true;
的等效方法是将最低有效位设置为1第二个函数参数是指针(
PVOID
),您的示例显示的是结构的地址。因此,您应该为该参数传递signaturePolicy.getPointer()
通常,当向函数传递
Structure
时,它会自动将Java值写入本机内存。我们将只传递指向结构的指针,因此在传递之前需要手动write()
将值传递给本机内存第三个参数是结构的
SIZE_T
大小更新答案以解决问题中的更新
根据答案,映射是正确的;您为结构映射选择的变量名可能会产生误导,因为您将位字段的名称用于整个32位
Flags
值