internal static Ace Create(MemoryMarshaler m) { IntPtr initialPtr = m.Ptr; // Save current ptr Debug.Assert(Marshal.SizeOf(typeof(ACE_HEADER)) == 4); ACE_HEADER head = (ACE_HEADER)m.ParseStruct(typeof(ACE_HEADER), false); Ace ace; switch (head.AceType) { case AceType.ACCESS_ALLOWED_ACE_TYPE: ace = new AceAccessAllowed(m); break; case AceType.ACCESS_DENIED_ACE_TYPE: ace = new AceAccessDenied(m); break; // Object ACE not yet supported /* * case AceType.ACCESS_ALLOWED_OBJECT_ACE_TYPE: * ace = new AceAccessAllowedObject(m); * break; * * case AceType.ACCESS_DENIED_OBJECT_ACE_TYPE: * ace = new AceAccessDeniedObject(m); * break; */ default: throw new NotSupportedException("Unsupported ACE type: " + head.AceType); } // Restore initial ptr and move forward the size of the ACE m.Ptr = initialPtr; m.Advance(head.AceSize); return(ace); }
protected void BaseInit(ACE_HEADER header, AccessType accessType, Sid sid) { _header = header; _accessType = accessType; _sid = sid; }