PInvoke将DWORD对齐的句柄写入内存



我试图为MSDN中定义的ACCESS_DENIED_ACE结构编写一个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) )
{
   //
}

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

从子结构开始。

[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;
}

现在结构简单。

当我获得ACCESS_DENIED_ACEIntPtr(假设为deniedAceIntPtr)时,我可以通过添加SidStart的偏移量来获得ACCESS_DENIED_ACE中SID的IntPtr

IntPtr-tempSid=IntPtr.Add(deniedAceIntPtr,8);

相关内容

  • 没有找到相关文章

最新更新