/// <summary>
        /// Create FSCTL_SRV_ENUMERATE_SNAPSHOTS Response 
        /// </summary>
        /// <param name="connection">the connection identified the client</param>
        /// <param name="numberOfSnapShots">This value MUST be the number of snapshots for the volume. </param>
        /// <param name = "snapShotData">
        /// A concatenated set of snapshot names. Each snapshot name MUST be formatted as a null-terminated array of 
        /// 16-bit Unicode characters. The concatenated list MUST be terminated by two 16-bit Unicode NULL characters 
        /// </param>
        /// <returns>The SmbNtTransFsctlSrvEnumerateSnapshotsResponsePacket </returns>
        /// <exception cref="ArgumentNullException">connection must not be null</exception>
        public virtual SmbNtTransFsctlSrvEnumerateSnapshotsResponsePacket CreateFsctlSrvEnumerateSnapshotsResponse(
            SmbServerConnection connection,
            uint numberOfSnapShots,
            params string[] snapShotData)
        {
            if (snapShotData == null)
            {
                snapShotData = new string[0];
            }

            if (connection == null)
            {
                throw new ArgumentNullException("connection");
            }

            SmbNtTransFsctlSrvEnumerateSnapshotsResponsePacket packet = new SmbNtTransFsctlSrvEnumerateSnapshotsResponsePacket();

            // get the request packet
            SmbPacket request = connection.GetRequestPacket(connection.MessageId);

            // create smb packet header
            packet.SmbHeader = CifsMessageUtils.CreateSmbHeader(
                SmbCommand.SMB_COM_NT_TRANSACT,
                connection.ProcessId, connection.MessageId, request.SmbHeader.Uid, request.SmbHeader.Tid,
                (SmbFlags)connection.Capability.Flag, (SmbFlags2)connection.Capability.Flags2);

            // update smb parameters
            SMB_COM_NT_TRANSACT_SuccessResponse_SMB_Parameters smbParameters = packet.SmbParameters;

            // reserved 3 bytes.
            smbParameters.Reserved1 = new byte[3];
            smbParameters.Setup = new ushort[0];

            smbParameters.WordCount = (byte)(CifsMessageUtils.GetSize<SMB_COM_NT_TRANSACT_SuccessResponse_SMB_Parameters>(
                smbParameters) / SmbCapability.NUM_BYTES_OF_WORD);

            // update smb data
            SMB_COM_NT_TRANSACT_SuccessResponse_SMB_Data smbData = packet.SmbData;

            // update trans2 data
            NT_TRANSACT_ENUMERATE_SNAPSHOTS_Response_NT_Trans_Data ntTransData = packet.NtTransData;
            ntTransData.NumberOfSnapShots = numberOfSnapShots;
            ntTransData.NumberOfSnapShotsReturned = (uint)snapShotData.Length;
            // initiallize to zero
            ntTransData.SnapShotArraySize = 0x00;
            ntTransData.snapShotMultiSZ = new byte[ntTransData.SnapShotArraySize];

            // update snapshots
            packet.SnapShots = new Collection<string>(snapShotData);

            // store the parameters and data to packet.
            packet.NtTransData = ntTransData;
            packet.SmbParameters = smbParameters;
            packet.SmbData = smbData;

            packet.UpdateCountAndOffset();

            return packet;
        }