PInvoking AddSecurityPackageA

问题描述 投票:0回答:1

我正在开展一个项目,我需要PInvoke secur32!AddSecurityPackageA功能,但我仍然在学习如何手动完成这项工作的细节,并可以使用一些帮助。

以下是我正在使用的参考资料:

这里是我的代码示例,我试图定义结构并调用函数:

[DllImport("secur32.dll", EntryPoint = "AddSecurityPackageA")]
  public static extern void AddSecurityPackageA(
  ref string pszPackageName,
  ref SECURITY_PACKAGE_OPTIONS[] Options
);

[StructLayout(LayoutKind.Sequential, CharSet =CharSet.Ansi)]
public class SECURITY_PACKAGE_OPTIONS
{
  public ulong Size;
  public ulong Type;
  public ulong Flags;
  public ulong SignatureSize;
  public IntPtr Signature;
}

string dll = @"c:\temp\test.dll";
SECURITY_PACKAGE_OPTIONS[] pkgOpts = new SECURITY_PACKAGE_OPTIONS();

AddSecurityPackageA(ref dll, ref pkgOpts);

我的问题是:

  1. 在第3和第4行,这是ref的适当使用,根据MSDN文档,这通常是正确的吗?
  2. 在第14行,MSDN上的C ++结构将它作为一个空指针,但在研究时我发现C#等价物是一个IntPtr。这是正确的还是我需要使用unsafe
  3. 一般来说,有没有人在阅读其他人的代码之外找到任何非常好的PInvoke教程?我正在从Python移动,所以它有点不同,我发现的大部分内容都是“画一个圆圈,画出剩余的猫头鹰”或疯狂冗长的MSDN文档做出了很多假设。

谢谢!

c# .net security pinvoke
1个回答
1
投票

一些评论:

  1. 使用W函数而不是A函数。您不希望将自己限制为ANSI。这是一个Unicode世界。
  2. 该函数具有返回值。您必须使用匹配的返回值类型声明该函数。据推测它是uintint但你应该检查C ++头文件。
  3. ref string错了。它应该是string
  4. ref SECURITY_PACKAGE_OPTIONS[]错了。它不是一个数组。它是指向struct的指针。由于您将SECURITY_PACKAGE_OPTIONS声明为类(引用类型),因此可以将ref SECURITY_PACKAGE_OPTIONS[]替换为SECURITY_PACKAGE_OPTIONS
  5. C ++ unsigned long是32位,因此它应该是C#中的uint
  6. IntPtr是正确的,但是没有解决如何声明数字签名并获得指向它的指针的问题。我认为这个问题的范围不在于我们追踪一个如何做到这一点的例子。
© www.soinside.com 2019 - 2024. All rights reserved.