0

我试图为MSDNACCESS_DENIED_ACE中定义的 struct编写 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 成员之后的连续内存中。

我已经看到了使用它的例子(PSID) &accessAllowedAce->SidStart

if ( EqualSid (pSid, (PSID) &accessDeniedAce->SidStart) )
{
   //
}

现在我StructLayout该如何为此编写 C# 以及如何在EqualSid函数中使用它,同时解释您的解决方案是如何工作的。

4

2 回答 2

2

从子结构开始。

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

DWORD = 单位

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

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

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

现在结构简单。

于 2012-07-25T10:51:45.933 回答
1

当我得到IntPtrfor ACCESS_DENIED_ACE(假设deniedAceIntPtr)时,我可以通过添加SidStart

IntPtr tempSid = IntPtr.Add(deniedAceIntPtr, 8);的偏移量来获得 ACCESS_DENIED_ACE 中 SID 的 IntPtr。

于 2012-07-26T07:27:52.950 回答