/// <summary>
 /// initialize packet from base packet. 
 /// </summary>
 /// <param name = "packet">the base packet to initialize this packet. </param>
 public SmbNtTransFsctlSrvEnumerateSnapshotsResponsePacket(Cifs.SmbNtTransactIoctlResponsePacket packet)
     : base(packet)
 {
     this.ntTransData =
         CifsMessageUtils.ToStuct<NT_TRANSACT_ENUMERATE_SNAPSHOTS_Response_NT_Trans_Data>(
         packet.NtTransData.Data);
 }
        /// <summary>
        /// Encode the struct of NtTransData into the byte array in SmbData.NT_Trans_Data 
        /// </summary>
        protected override void EncodeNtTransData()
        {
            List<byte> data = new List<byte>();
            foreach (string snapshot in SnapShots)
            {
                byte[] bytes = Encoding.Unicode.GetBytes(snapshot + "\0");
                data.AddRange(bytes);
            }
            data.AddRange(new byte[2]);

            NT_TRANSACT_ENUMERATE_SNAPSHOTS_Response_NT_Trans_Data snapshotsNtTransData =
                new NT_TRANSACT_ENUMERATE_SNAPSHOTS_Response_NT_Trans_Data();
            snapshotsNtTransData.NumberOfSnapShots = this.ntTransData.NumberOfSnapShots;
            snapshotsNtTransData.NumberOfSnapShotsReturned = this.ntTransData.NumberOfSnapShotsReturned;
            snapshotsNtTransData.SnapShotArraySize = (uint)data.Count;
            snapshotsNtTransData.snapShotMultiSZ = data.ToArray();

            this.NtTransData = snapshotsNtTransData;

            this.smbData.Data =
                CifsMessageUtils.ToBytes<NT_TRANSACT_ENUMERATE_SNAPSHOTS_Response_NT_Trans_Data>(this.NtTransData);
        }
        /// <summary>
        /// to decode the NtTrans data: from the general NtTransDada to the concrete NtTrans Data. 
        /// </summary>
        protected override void DecodeNtTransData()
        {
            NT_TRANSACT_ENUMERATE_SNAPSHOTS_Response_NT_Trans_Data data
                = new NT_TRANSACT_ENUMERATE_SNAPSHOTS_Response_NT_Trans_Data();

            using (MemoryStream stream = new MemoryStream(this.smbData.Data))
            {
                using (Channel channel = new Channel(null, stream))
                {
                    data.NumberOfSnapShots = channel.Read<uint>();
                    data.NumberOfSnapShotsReturned = channel.Read<uint>();
                    data.SnapShotArraySize = channel.Read<uint>();
                    if (data.NumberOfSnapShotsReturned > 0)
                    {
                        data.snapShotMultiSZ = channel.ReadBytes((int)data.SnapShotArraySize);
                    }
                }
            }

            this.NtTransData = data;

            if (this.ntTransData.snapShotMultiSZ == null || this.ntTransData.SnapShotArraySize <= 2)
            {
                return;
            }

            string snapshot = Encoding.Unicode.GetString(this.ntTransData.snapShotMultiSZ);
            this.SnapShots = new Collection<string>(snapshot.Trim('\0').Split('\0'));
        }