/// <exception cref="System.IO.IOException"></exception> public virtual int Decode(byte[] buffer, int bufferIndex, int len) { int start = bufferIndex; bufferIndex++; // revision bufferIndex++; Type = ServerMessageBlock.ReadInt2(buffer, bufferIndex); bufferIndex += 2; ServerMessageBlock.ReadInt4(buffer, bufferIndex); // offset to owner sid bufferIndex += 4; ServerMessageBlock.ReadInt4(buffer, bufferIndex); // offset to group sid bufferIndex += 4; ServerMessageBlock.ReadInt4(buffer, bufferIndex); // offset to sacl bufferIndex += 4; int daclOffset = ServerMessageBlock.ReadInt4(buffer, bufferIndex); bufferIndex = start + daclOffset; bufferIndex++; // revision bufferIndex++; int size = ServerMessageBlock.ReadInt2(buffer, bufferIndex); bufferIndex += 2; int numAces = ServerMessageBlock.ReadInt4(buffer, bufferIndex); bufferIndex += 4; if (numAces > 4096) { throw new IOException("Invalid SecurityDescriptor"); } if (daclOffset != 0) { Aces = new Ace[numAces]; for (int i = 0; i < numAces; i++) { Aces[i] = new Ace(); bufferIndex += Aces[i].Decode(buffer, bufferIndex); } } else { Aces = null; } return(bufferIndex - start); }
/// <exception cref="System.IO.IOException"></exception> public virtual int Decode(byte[] buffer, int bufferIndex, int len) { int start = bufferIndex; bufferIndex++; // revision bufferIndex++; Type = ServerMessageBlock.ReadInt2(buffer, bufferIndex); bufferIndex += 2; ServerMessageBlock.ReadInt4(buffer, bufferIndex); // offset to owner sid bufferIndex += 4; ServerMessageBlock.ReadInt4(buffer, bufferIndex); // offset to group sid bufferIndex += 4; ServerMessageBlock.ReadInt4(buffer, bufferIndex); // offset to sacl bufferIndex += 4; int daclOffset = ServerMessageBlock.ReadInt4(buffer, bufferIndex); bufferIndex = start + daclOffset; bufferIndex++; // revision bufferIndex++; int size = ServerMessageBlock.ReadInt2(buffer, bufferIndex); bufferIndex += 2; int numAces = ServerMessageBlock.ReadInt4(buffer, bufferIndex); bufferIndex += 4; if (numAces > 4096) { throw new IOException("Invalid SecurityDescriptor"); } if (daclOffset != 0) { Aces = new Ace[numAces]; for (int i = 0; i < numAces; i++) { Aces[i] = new Ace(); bufferIndex += Aces[i].Decode(buffer, bufferIndex); } } else { Aces = null; } return bufferIndex - start; }
/// <exception cref="System.IO.IOException"></exception> private void ProcessAces(Ace[] aces, bool resolveSids) { string server = GetServerWithDfs(); int ai; if (resolveSids) { Sid[] sids = new Sid[aces.Length]; string[] names = null; for (ai = 0; ai < aces.Length; ai++) { sids[ai] = aces[ai].Sid; } for (int off = 0; off < sids.Length; off += 64) { int len = sids.Length - off; if (len > 64) { len = 64; } Sid.ResolveSids(server, Auth, sids, off, len); } } else { for (ai = 0; ai < aces.Length; ai++) { aces[ai].Sid.OriginServer = server; aces[ai].Sid.OriginAuth = Auth; } } }