C# PInvoking AddSecurityPackageA

C# PInvoking AddSecurityPackageA,c#,.net,security,pinvoke,C#,.net,Security,Pinvoke,我正在做一个项目,我需要PInvokesecur32!AddSecurityPackageA函数,但我仍在学习如何手动执行此操作的细节,可能需要一些帮助 以下是我正在使用的参考资料: 下面是我的代码示例,我试图在其中定义结构并调用函数: [DllImport("secur32.dll", EntryPoint = "AddSecurityPackageA")] public static extern void AddSecurityPackageA( ref string ps

我正在做一个项目,我需要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);
我的问题是:

  • 在第3行和第4行,这是否正确使用了
    ref
    ,根据MSDN文档,这通常正确吗
  • 在第14行,MSDN上的C++结构将此作为空指针,但在研究中发现C等价物是<代码> ItPTR < /C>。这是正确的还是我需要使用
    不安全的
  • 总的来说,除了阅读别人的代码之外,有没有人找到过真正好的PInvoke教程?我将从Python开始,所以它有点不同,我发现的很多东西要么是“画一个圆圈,画猫头鹰的其余部分”,要么是疯狂冗长的MSDN文档,其中有很多假设
  • 谢谢大家!

    一些评论:

  • 使用
    W
    功能,而不是
    A
    功能。你不想把自己局限于ANSI。这是一个Unicode世界
  • 该函数有一个返回值。必须使用匹配的返回值类型声明函数。大概是<代码> uint < /C> >或<代码> int >代码>,但是您应该检查C++头文件。
  • ref字符串
    错误。它应该是
    字符串
  • ref SECURITY\u PACKAGE\u OPTIONS[]
    错误。它不是数组。它是指向
    结构的指针。由于您将
    SECURITY\u PACKAGE\u OPTIONS
    声明为一个类,一个引用类型,因此可以将
    ref SECURITY\u PACKAGE\u OPTIONS[]
    替换为
    SECURITY\u PACKAGE\u OPTIONS
  • C++
    unsigned long
    是32位的,所以在C#中应该是
    uint
  • IntPtr
    是正确的,但如何声明数字签名并获取指向它的指针的问题尚未解决。我认为,我们不在这个问题的范围之内,要找到一个如何做到这一点的例子
  • 这个对我很有用:

        [DllImport("secur32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern uint AddSecurityPackage(
            string pszPackageName,
            SECURITY_PACKAGE_OPTIONS Options
        );
    
        [DllImport("secur32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern uint DeleteSecurityPackage(
            string pszPackageName
        );
    

    C++ ULUN是32位,所以它应该是C uuuin,选项只是一个项目,不是数组,所以它应该是<代码> REF SualyTyPoCualGyOpDype选项< /C>如果SufyTyPyPayGracyOb选项是一个结构,或者如果它是一个类,则不需要REF。IntPtr是正确的,您不需要不安全的(您几乎从不需要它,它更多地用于性能原因)。该函数返回一个32位(用于检查错误)函数,对返回给您的延迟表示歉意。这非常有帮助。如果你不介意的话,我还有几个问题。首先,我检查了
    sspi.h
    头文件,发现
    SECURITY\u PACKAGE\u OPTIONS
    选项被标记为可选。因此,我是否可以完全删除结构并将其清空?第二,我在标题中找不到输出类型,但我确实找到了,这表明如果成功,它将返回0x00000000。我能不能说,
    如果输出!=0,cw(出现问题)