/// <summary> /// Deep copy constructor. /// </summary> public SmbReadAndxResponsePacket(SmbReadAndxResponsePacket 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.Available = packet.SmbParameters.Available; this.smbParameters.DataCompactionMode = packet.SmbParameters.DataCompactionMode; this.smbParameters.Reserved1 = packet.SmbParameters.Reserved1; this.smbParameters.DataLength = packet.SmbParameters.DataLength; this.smbParameters.DataOffset = packet.SmbParameters.DataOffset; if (packet.smbParameters.Reserved2 != null) { this.smbParameters.Reserved2 = new ushort[packet.smbParameters.Reserved2.Length]; Array.Copy(packet.smbParameters.Reserved2, this.smbParameters.Reserved2, packet.smbParameters.Reserved2.Length); } else { this.smbParameters.Reserved2 = new ushort[0]; } this.smbData.ByteCount = packet.SmbData.ByteCount; if (packet.smbData.Pad != null) { this.smbData.Pad = new byte[packet.smbData.Pad.Length]; Array.Copy(packet.smbData.Pad, this.smbData.Pad, packet.smbData.Pad.Length); } else { this.smbData.Pad = new byte[0]; } if (packet.smbData.Data != null) { this.smbData.Data = new byte[packet.smbData.Data.Length]; Array.Copy(packet.smbData.Data, this.smbData.Data, packet.smbData.Data.Length); } else { this.smbData.Data = new byte[0]; } }
public SmbReadAndxResponsePacket CreateReadAndxResponse( CifsServerPerConnection connection, SmbReadAndxRequestPacket request, ushort available, byte[] data, SmbPacket andxPacket) { data = data ?? new byte[0]; SmbReadAndxResponsePacket response = new SmbReadAndxResponsePacket(); response.SmbHeader = CifsMessageUtils.CreateSmbHeader(connection, request); int padOffset = response.HeaderSize + Marshal.SizeOf(response.SmbParameters) + Marshal.SizeOf(response.SmbData.ByteCount); SMB_COM_READ_ANDX_Response_SMB_Parameters smbParameters = response.SmbParameters; smbParameters.AndXCommand = andxPacket != null ? andxPacket.SmbHeader.Command : SmbCommand.SMB_COM_NO_ANDX_COMMAND; smbParameters.AndXReserved = 0x00; smbParameters.Available = available; smbParameters.DataCompactionMode = 0x0000; smbParameters.Reserved1 = 0x0000; smbParameters.DataLength = (ushort)data.Length; smbParameters.DataOffset = (ushort)((padOffset + 3) & ~3); smbParameters.Reserved2 = new ushort[5]; smbParameters.AndXOffset = (ushort)(((padOffset + 3) & ~3) + data.Length); smbParameters.WordCount = (byte)(TypeMarshal.GetBlockMemorySize(smbParameters) / 2); response.SmbParameters = smbParameters; SMB_COM_READ_ANDX_Response_SMB_Data smbData = response.SmbData; smbData.Pad = new byte[response.SmbParameters.DataOffset - padOffset]; smbData.Data = data; smbData.ByteCount = (ushort)(response.SmbParameters.DataOffset + data.Length); response.SmbData = smbData; response.AndxPacket = andxPacket; response.UpdateHeader(); return response; }