/// <summary>
        /// Create NT_TRANSACT_IO_CTRL Server Response 
        /// </summary>
        /// <param name="connection">the connection identified the client</param>
        /// <param name="data">the data to response to client</param>
        /// <returns>The SmbNtTransactIoctlResponsePacket </returns>
        /// <exception cref="ArgumentNullException">connection must not be null</exception>
        public virtual SmbNtTransactIoctlResponsePacket CreateNtTransIoCtlResponse(
            SmbServerConnection connection, byte[] data)
        {
            if (connection == null)
            {
                throw new ArgumentNullException("connection");
            }

            SmbNtTransactIoctlResponsePacket packet = new SmbNtTransactIoctlResponsePacket();

            // 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
                = new SMB_COM_NT_TRANSACT_SuccessResponse_SMB_Parameters();

            // 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 =
                new SMB_COM_NT_TRANSACT_SuccessResponse_SMB_Data();

            smbData.Data = data;
            smbData.ByteCount = (ushort)data.Length;

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

            packet.UpdateCountAndOffset();

            return packet;
        }
 /// <summary>
 /// to decode the smb parameters: from the general SmbParameters to the concrete Smb Parameters.
 /// </summary>
 protected override void DecodeParameters()
 {
     if (this.smbParametersBlock.WordCount > 0)
     {
         this.smbParameters = TypeMarshal.ToStruct<SMB_COM_NT_TRANSACT_SuccessResponse_SMB_Parameters>(
              TypeMarshal.ToBytes(this.smbParametersBlock));
     }
 }