/// <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); }