PInvoke用于DWORD对齐的内存句柄

时间:2012-07-25 10:07:16

标签: c# pinvoke structlayout

我试图为ACCESS_DENIED_ACE中定义的MSDN结构编写C#等价物:

typedef struct _ACCESS_DENIED_ACE {
  ACE_HEADER  Header;
  ACCESS_MASK Mask;
  DWORD       SidStart;
} ACCESS_DENIED_ACE, *PACCESS_DENIED_ACE;

其中SidStart是受托者SID的第一个DWORD。 SID的剩余字节存储在SidStart成员之后的连续内存中。

我见过像{,1}}一样使用的例子,

(PSID) &accessAllowedAce->SidStart

现在我如何为此编写C#if ( EqualSid (pSid, (PSID) &accessDeniedAce->SidStart) ) { // } 以及如何在StructLayout函数中使用它,并解释您的解决方案的工作原理。

2 个答案:

答案 0 :(得分:2)

从子结构开始。

[StructLayout(LayoutKind.Sequential)]
struct ACE_HEADER
{
    byte AceType;
    byte AceFlags;
    uint AceSize;
}

DWORD = uint

[Flags]
enum ACCESS_MASK : uint
{
    // ...
}

它是一个基于标志的枚举结构,表示为32位(即可以切换多个状态)。 您需要按照文档定义位。

[StructLayout(LayoutKind.Sequential)]
struct ACCESS_DENIED_ACE
{
    ACE_HEADER Header;
    ACCESS_MASK Mask;
    uint SidStart;
}

现在结构简单。

答案 1 :(得分:1)

当我获得IntPtr ACCESS_DENIED_ACE(假设为deniedAceIntPtr)时,我可以通过添加SidStart
    IntPtr tempSid = IntPtr.Add(deniedAceIntPtr,8);