/// <summary>
        /// Deep copy constructor. 
        /// </summary>
        public SmbOpenAndxResponsePacket(SmbOpenAndxResponsePacket packet)
            : base(packet)
        {
            this.InitDefaultValue();

            this.smbParameters.WordCount = packet.SmbParameters.WordCount;
            this.smbParameters.AndXCommand = packet.SmbParameters.AndXCommand;
            this.smbParameters.AndXReserved = packet.SmbParameters.AndXReserved;
            this.smbParameters.AndXOffset = packet.SmbParameters.AndXOffset;
            this.smbParameters.FID = packet.SmbParameters.FID;
            this.smbParameters.FileAttrs = packet.SmbParameters.FileAttrs;
            this.smbParameters.LastWriteTime = packet.SmbParameters.LastWriteTime;
            this.smbParameters.DataSize = packet.SmbParameters.DataSize;
            this.smbParameters.GrantedAccess = packet.SmbParameters.GrantedAccess;
            this.smbParameters.FileType = packet.SmbParameters.FileType;
            this.smbParameters.DeviceState = packet.SmbParameters.DeviceState;
            this.smbParameters.Action = packet.SmbParameters.Action;
            this.smbParameters.ServerFid = packet.SmbParameters.ServerFid;
            this.smbParameters.Reserved = packet.SmbParameters.Reserved;
            this.smbParameters.MaximalAccessRights = packet.SmbParameters.MaximalAccessRights;
            this.smbParameters.GuestMaximalAccessRights = packet.SmbParameters.GuestMaximalAccessRights;
        }
        /// <summary>
        /// Create SMB_COM_OPEN_ANDX Server Response 
        /// </summary>
        /// <param name="connection">the connection identified the client</param>
        /// <param name = "fileId">
        /// This field MUST be the SMB file identifier returned by the SMB server for the file or device that was 
        /// opened or created 
        /// </param>
        /// <param name="fileType">the type of file to open</param>
        /// <param name="byteCount">
        /// This value should be set to zero.Windows-based servers may return a response where the ByteCount field is 
        /// not initialized to 0.
        /// </param>
        /// <returns>The SmbOpenAndXResponsePacket </returns>
        /// <exception cref="ArgumentNullException">connection must not be null</exception>
        public virtual SmbOpenAndxResponsePacket CreateSmbComOpenResponse(
            SmbServerConnection connection,
            ushort fileId,
            ResourceTypeValue fileType,
            ushort byteCount)
        {
            if (connection == null)
            {
                throw new ArgumentNullException("connection");
            }

            SmbOpenAndxResponsePacket packet = new SmbOpenAndxResponsePacket();

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

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

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

            smbParameters.AndXCommand = SmbCommand.SMB_COM_NO_ANDX_COMMAND;
            smbParameters.FID = fileId;
            smbParameters.FileAttrs = (SmbFileAttributes)0x00;
            smbParameters.LastWriteTime.Time = (uint)DateTime.Now.ToFileTime();
            smbParameters.DataSize = 0x0;
            smbParameters.GrantedAccess = (AccessRightsValue)0x00;
            smbParameters.FileType = fileType;
            smbParameters.DeviceState = SMB_NMPIPE_STATUS.None;
            smbParameters.Action = OpenResultsValues.OpenResult3;
            smbParameters.ServerFid = 0x00;
            smbParameters.MaximalAccessRights = connection.MaximalShareAccessRights;
            smbParameters.GuestMaximalAccessRights = connection.GuestMaximalShareAccessRights;

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

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

            // update smbData.ByteCount
            smbData.ByteCount = byteCount;

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

            return packet;
        }
        protected override SmbPacket CreateSmbResponsePacket(
            SmbPacket request,
            SmbHeader smbHeader,
            Channel channel)
        {
            SmbPacket smbPacket = null;

            // error packet
            SmbStatus packetStatus = (SmbStatus)smbHeader.Status;

            // error packet
            if (packetStatus != SmbStatus.STATUS_SUCCESS &&
                    packetStatus != SmbStatus.STATUS_MORE_PROCESSING_REQUIRED &&
                    packetStatus != SmbStatus.STATUS_BUFFER_OVERFLOW)
            {
                smbPacket = new SmbErrorResponsePacket();
                smbPacket.SmbHeader = smbHeader;

                return smbPacket;
            }

            // success packet
            switch (smbHeader.Command)
            {
                case SmbCommand.SMB_COM_NEGOTIATE:
                    if (smbClient.Capability.IsSupportsExtendedSecurity)
                    {
                        smbPacket = new SmbNegotiateResponsePacket();
                    }
                    else
                    {
                        smbPacket = new SmbNegotiateImplicitNtlmResponsePacket();
                    }
                    break;

                case SmbCommand.SMB_COM_SESSION_SETUP_ANDX:
                    if (smbClient.Capability.IsSupportsExtendedSecurity)
                    {
                        smbPacket = new SmbSessionSetupAndxResponsePacket();
                    }
                    else
                    {
                        smbPacket = new SmbSessionSetupImplicitNtlmAndxResponsePacket();
                    }
                    break;

                case SmbCommand.SMB_COM_TREE_CONNECT_ANDX:
                    smbPacket = new SmbTreeConnectAndxResponsePacket();
                    break;

                case SmbCommand.SMB_COM_TREE_DISCONNECT:
                    smbPacket = new SmbTreeDisconnectResponsePacket();
                    break;

                case SmbCommand.SMB_COM_LOGOFF_ANDX:
                    smbPacket = new SmbLogoffAndxResponsePacket();
                    break;

                case SmbCommand.SMB_COM_NT_CREATE_ANDX:
                    smbPacket = new SmbNtCreateAndxResponsePacket();
                    break;

                case SmbCommand.SMB_COM_CLOSE:
                    smbPacket = new SmbCloseResponsePacket();
                    break;

                case SmbCommand.SMB_COM_OPEN_ANDX:
                    smbPacket = new SmbOpenAndxResponsePacket();
                    break;

                case SmbCommand.SMB_COM_WRITE_ANDX:
                    smbPacket = new SmbWriteAndxResponsePacket();
                    break;

                case SmbCommand.SMB_COM_READ_ANDX:
                    smbPacket = new SmbReadAndxResponsePacket();
                    break;

                case SmbCommand.SMB_COM_TRANSACTION:
                    smbPacket = this.CreateTransactionResponsePacket(request, smbHeader, channel);

                    break;

                case SmbCommand.SMB_COM_TRANSACTION2:
                    smbPacket = this.CreateTransaction2ResponsePacket(request, smbHeader, channel);

                    break;

                case SmbCommand.SMB_COM_NT_TRANSACT:
                    smbPacket = this.CreateNtTransactionResponsePacket(request, smbHeader, channel);

                    break;

                default:
                    break;

            }
            if (smbPacket != null)
            {
                smbPacket.SmbHeader = smbHeader;
                return smbPacket;
            }

            return base.CreateSmbResponsePacket(request, smbHeader, channel);
        }