我试图为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_ACE
的IntPtr
(假设为deniedAceIntPtr
)时,我可以通过添加SidStart
的偏移量来获得ACCESS_DENIED_ACE中SID的IntPtr
IntPtr-tempSid=IntPtr.Add(deniedAceIntPtr,8);