C# PInvoking AddSecurityPackageA
我正在做一个项目,我需要PInvokeC# 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
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);
我的问题是:
ref
,根据MSDN文档,这通常正确吗不安全的
W
功能,而不是A
功能。你不想把自己局限于ANSI。这是一个Unicode世界ref字符串
错误。它应该是字符串
ref SECURITY\u PACKAGE\u OPTIONS[]
错误。它不是数组。它是指向结构的指针。由于您将SECURITY\u PACKAGE\u OPTIONS
声明为一个类,一个引用类型,因此可以将ref SECURITY\u PACKAGE\u OPTIONS[]
替换为SECURITY\u PACKAGE\u OPTIONS
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(出现问题)
?