private static IEnumerable <SecurityIdentifier> ParseAttributes(NdrBinaryReader Stream, int count, int pointer) { var attributes = new List <SecurityIdentifier>(); if (pointer == 0) { return(attributes); } int realCount = Stream.ReadInt(); if (realCount != count) { throw new InvalidDataException($"Expected count {count} doesn't match actual count {realCount}"); } for (int i = 0; i < count; i++) { Stream.Align(4); var sid = Stream.ReadRid(); attributes.Add(new SecurityIdentifier(sid, (SidAttributes)Stream.ReadInt())); } return(attributes); }
private static SecurityIdentifier[] ParseExtraSids(NdrBinaryReader Stream, int extraSidCount, int extraSidPointer) { if (extraSidPointer == 0) { return(new SecurityIdentifier[0]); } int realExtraSidCount = Stream.ReadInt(); if (realExtraSidCount != extraSidCount) { throw new InvalidDataException($"Expected Sid count {extraSidCount} doesn't match actual sid count {realExtraSidCount}"); } var extraSidAtts = new SecurityIdentifier[extraSidCount]; var pointers = new int[extraSidCount]; var attributes = new SidAttributes[extraSidCount]; for (int i = 0; i < extraSidCount; i++) { pointers[i] = Stream.ReadInt(); attributes[i] = (SidAttributes)Stream.ReadUnsignedInt(); } for (int i = 0; i < extraSidCount; i++) { SecurityIdentifier sid = null; if (pointers[i] != 0) { sid = new SecurityIdentifier(Stream.ReadSid(), attributes[i]); } extraSidAtts[i] = sid; } return(extraSidAtts); }