/// <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.FileDataSize  = packet.SmbParameters.FileDataSize;
            this.smbParameters.AccessRights  = packet.SmbParameters.AccessRights;
            this.smbParameters.ResourceType  = packet.SmbParameters.ResourceType;
            this.smbParameters.NMPipeStatus  = packet.SmbParameters.NMPipeStatus;
            this.smbParameters.OpenResults   = packet.SmbParameters.OpenResults;

            if (packet.smbParameters.Reserved != null)
            {
                this.smbParameters.Reserved = new ushort[packet.smbParameters.Reserved.Length];
                Array.Copy(packet.smbParameters.Reserved,
                           this.smbParameters.Reserved, packet.smbParameters.Reserved.Length);
            }
            else
            {
                this.smbParameters.Reserved = new ushort[0];
            }
            this.smbData.ByteCount = packet.SmbData.ByteCount;
        }
        /// <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.FileDataSize = packet.SmbParameters.FileDataSize;
            this.smbParameters.AccessRights = packet.SmbParameters.AccessRights;
            this.smbParameters.ResourceType = packet.SmbParameters.ResourceType;
            this.smbParameters.NMPipeStatus = packet.SmbParameters.NMPipeStatus;
            this.smbParameters.OpenResults = packet.SmbParameters.OpenResults;

            if (packet.smbParameters.Reserved != null)
            {
                this.smbParameters.Reserved = new ushort[packet.smbParameters.Reserved.Length];
                Array.Copy(packet.smbParameters.Reserved,
                    this.smbParameters.Reserved, packet.smbParameters.Reserved.Length);
            }
            else
            {
                this.smbParameters.Reserved = new ushort[0];
            }
            this.smbData.ByteCount = packet.SmbData.ByteCount;
        }
        public SmbOpenAndxResponsePacket CreateOpenAndxResponse(
            CifsServerPerConnection connection,
            SmbOpenAndxRequestPacket request,
            UTime lastWriteTime,
            uint fileDataSize,
            AccessRightsValue accessRights,
            ResourceTypeValue resourceType,
            SMB_NMPIPE_STATUS nmPipeStatus,
            OpenResultsValues openResults,
            SmbPacket andxPacket)
        {
            SmbOpenAndxResponsePacket response = new SmbOpenAndxResponsePacket();
            response.SmbHeader = CifsMessageUtils.CreateSmbHeader(connection, request);

            SMB_COM_OPEN_ANDX_Response_SMB_Parameters smbParameters = response.SmbParameters;
            smbParameters.AndXCommand =
                andxPacket != null ? andxPacket.SmbHeader.Command : SmbCommand.SMB_COM_NO_ANDX_COMMAND;
            smbParameters.AndXReserved = 0x00;
            smbParameters.FID = (ushort)(connection.GenerateFID());
            smbParameters.FileAttrs = request.SmbParameters.FileAttrs;
            smbParameters.LastWriteTime = lastWriteTime;
            smbParameters.FileDataSize = fileDataSize;
            smbParameters.AccessRights = accessRights;
            smbParameters.ResourceType = resourceType;
            smbParameters.NMPipeStatus = nmPipeStatus;
            smbParameters.OpenResults = openResults;
            smbParameters.Reserved = new ushort[3];
            smbParameters.AndXOffset = (ushort)(response.HeaderSize + Marshal.SizeOf(response.SmbParameters)
                    + Marshal.SizeOf(response.SmbData));
            smbParameters.WordCount = (byte)(TypeMarshal.GetBlockMemorySize(smbParameters) / 2);
            response.SmbParameters = smbParameters;

            response.AndxPacket = andxPacket;
            response.UpdateHeader();

            return response;
        }