C#从ACCESS_ALLOWED_ACE获取pSID时偏移量8的来源疑问
ACCESS_ALLOWED_ACE结构获取pSID时8字节偏移的来源
你的推断完全正确,这个8字节偏移完全来自结构固定头部的长度累加,没有额外的特殊逻辑:
- 结构最开头是
ACE_HEADER字段,属于定长结构,总长度为4字节,存储ACE类型、继承标记、ACE整体大小等元信息 - 紧随
ACE_HEADER之后的是ACCESS_MASK字段,本质是DWORD类型,固定长度4字节,存储该ACE对应的访问权限位
两个字段长度相加刚好为8字节,且结构按DWORD(4字节)规则对齐,两个字段之间没有额外的内存填充空隙,因此两个固定字段之后的位置,就是结构定义中作为SID起始锚点的SidStart位置,直接在ACE的基址指针上加8就能拿到pSID指针。
你看到的实现代码逻辑是正确的:
IntPtr tempSid = IntPtr.Add(deniedAceIntPtr, 8);
需要注意的是,结构定义里的SidStart只是一个占位用的单DWORD成员,并不是实际的SID数据,它的作用就是标记SID的内存起始位置,不能直接读取这个成员的值当SID指针用。
这个8字节偏移在32位、64位环境下通用,你通过该偏移拿到指针后调用ConvertSidToStringSidW能正常获取SID字符串,也验证了偏移的正确性。
内容的提问来源于stack exchange,提问作者YellowFrog
相关产品推荐
相关产品推荐

