我试图为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
函数中使用它,并解释您的解决方案的工作原理。
答案 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);