/// <summary>
        /// Read data from server, start at the positon indicated by offset
        /// </summary>
        /// <param name="timeout">The pending time to get server's response</param>
        /// <param name="offset">From where it will read</param>
        /// <param name="length">The length of the data client wants to read</param>
        /// <param name="data">The read data</param>
        /// <returns>
        /// a uint value that specifies the status of response packet.
        /// </returns>
        /// <exception cref="System.InvalidOperationException">Thrown if there is any error occurred</exception>
        public override uint Read(TimeSpan timeout, ulong offset, uint length, out byte[] data)
        {
            this.internalTimeout = timeout;

            SmbReadAndxRequestPacket request = smbClient.CreateReadRequest(this.fid, (ushort)length, (uint)offset);

            if (this.isSignRequired)
            {
                request.Sign(this.NextSequenceNumber, this.sessionKey);
            }

            uint status = 0;
            SmbReadAndxResponsePacket response =
                this.SendAndExpectSmbPacket(request, internalTimeout, out status) as SmbReadAndxResponsePacket;

            data = ArrayUtility.SubArray <byte>(response.SmbData.Data, 0);

            return(SmbMessageUtils.CheckStatus(status));
        }
 /// <summary>
 /// Deep copy constructor. 
 /// </summary>
 public SmbReadAndxResponsePacket(SmbReadAndxResponsePacket packet)
     : base(packet)
 {
 }
 /// <summary>
 /// Deep copy constructor.
 /// </summary>
 public SmbReadAndxResponsePacket(SmbReadAndxResponsePacket packet)
     : base(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));
        }
 /// <summary>
 /// Verify whether the two response are equal or not
 /// </summary>
 /// <param name="readAndxResponsePacket1"> The SmbReadAndxResponsePacket For First</param>
 /// <param name="readAndxResponsePacket2"> The SmbReadAndxResponsePacket Response For Second</param>
 private bool VerifyReadAndxResponse(SmbReadAndxResponsePacket readAndxResponsePacket1,
                                     SmbReadAndxResponsePacket readAndxResponsePacket2)
 {
     return (readAndxResponsePacket1.AndxPacket.IsSignRequired ==
         readAndxResponsePacket2.AndxPacket.IsSignRequired)
         && (readAndxResponsePacket1.AndxPacket.PacketBytes == readAndxResponsePacket2.AndxPacket.PacketBytes)
         && (readAndxResponsePacket1.AndxPacket.PacketType == readAndxResponsePacket2.AndxPacket.PacketType)
         && (readAndxResponsePacket1.IsSignRequired == readAndxResponsePacket2.IsSignRequired)
         && (readAndxResponsePacket1.PacketBytes.IsFixedSize == readAndxResponsePacket2.PacketBytes.IsFixedSize)
         && (readAndxResponsePacket1.PacketBytes.IsReadOnly == readAndxResponsePacket2.PacketBytes.IsReadOnly)
         && (readAndxResponsePacket1.PacketBytes.IsSynchronized ==
         readAndxResponsePacket2.PacketBytes.IsSynchronized)
         && (readAndxResponsePacket1.PacketBytes.Length == readAndxResponsePacket2.PacketBytes.Length)
         && (readAndxResponsePacket1.PacketBytes.LongLength == readAndxResponsePacket2.PacketBytes.LongLength)
         && (readAndxResponsePacket1.PacketBytes.Rank == readAndxResponsePacket2.PacketBytes.Rank)
         && (readAndxResponsePacket1.PacketBytes.SyncRoot == readAndxResponsePacket2.PacketBytes.SyncRoot)
         && (readAndxResponsePacket1.PacketType == readAndxResponsePacket2.PacketType)
         && (readAndxResponsePacket1.SmbData.ByteCount == readAndxResponsePacket2.SmbData.ByteCount)
         && (readAndxResponsePacket1.SmbData.Data == readAndxResponsePacket2.SmbData.Data)
         && (readAndxResponsePacket1.SmbData.Pad == readAndxResponsePacket2.SmbData.Pad)
         && (readAndxResponsePacket1.SmbParameters.AndXCommand ==
         readAndxResponsePacket2.SmbParameters.AndXCommand)
         && (readAndxResponsePacket1.SmbParameters.AndXOffset ==
         readAndxResponsePacket2.SmbParameters.AndXOffset)
         && (readAndxResponsePacket1.SmbParameters.DataOffset ==
         readAndxResponsePacket2.SmbParameters.DataOffset)
         && (readAndxResponsePacket1.SmbParameters.AndXReserved ==
         readAndxResponsePacket2.SmbParameters.AndXReserved)
         && (readAndxResponsePacket1.SmbParameters.Available == readAndxResponsePacket2.SmbParameters.Available)
         && (readAndxResponsePacket1.SmbParameters.DataCompactionMode ==
         readAndxResponsePacket2.SmbParameters.DataCompactionMode)
         && (readAndxResponsePacket1.SmbParameters.DataLength ==
         readAndxResponsePacket2.SmbParameters.DataLength)
         && (readAndxResponsePacket1.SmbParameters.DataOffset ==
         readAndxResponsePacket2.SmbParameters.DataOffset)
         && (readAndxResponsePacket1.SmbParameters.Reserved1 == readAndxResponsePacket2.SmbParameters.Reserved1)
         && (readAndxResponsePacket1.SmbParameters.Reserved2 == readAndxResponsePacket2.SmbParameters.Reserved2);
 }