/// <summary> /// Create NT_TRANSACT_IO_CTRL Server Response /// </summary> /// <param name="connection">the connection identified the client</param> /// <param name="data">the data to response to client</param> /// <returns>The SmbNtTransactIoctlResponsePacket </returns> /// <exception cref="ArgumentNullException">connection must not be null</exception> public virtual SmbNtTransactIoctlResponsePacket CreateNtTransIoCtlResponse( SmbServerConnection connection, byte[] data) { if (connection == null) { throw new ArgumentNullException("connection"); } SmbNtTransactIoctlResponsePacket packet = new SmbNtTransactIoctlResponsePacket(); // get the request packet SmbPacket request = connection.GetRequestPacket(connection.MessageId); // create smb packet header packet.SmbHeader = CifsMessageUtils.CreateSmbHeader( SmbCommand.SMB_COM_NT_TRANSACT, connection.ProcessId, connection.MessageId, request.SmbHeader.Uid, request.SmbHeader.Tid, (SmbFlags)connection.Capability.Flag, (SmbFlags2)connection.Capability.Flags2); // update smb parameters SMB_COM_NT_TRANSACT_SuccessResponse_SMB_Parameters smbParameters = new SMB_COM_NT_TRANSACT_SuccessResponse_SMB_Parameters(); // reserved 3 bytes. smbParameters.Reserved1 = new byte[3]; smbParameters.Setup = new ushort[0]; smbParameters.WordCount = (byte)(CifsMessageUtils.GetSize<SMB_COM_NT_TRANSACT_SuccessResponse_SMB_Parameters>( smbParameters) / SmbCapability.NUM_BYTES_OF_WORD); // update smb data SMB_COM_NT_TRANSACT_SuccessResponse_SMB_Data smbData = new SMB_COM_NT_TRANSACT_SuccessResponse_SMB_Data(); smbData.Data = data; smbData.ByteCount = (ushort)data.Length; // store the parameters and data to packet. packet.SmbParameters = smbParameters; packet.SmbData = smbData; packet.UpdateCountAndOffset(); return packet; }
/// <summary> /// to decode the smb parameters: from the general SmbParameters to the concrete Smb Parameters. /// </summary> protected override void DecodeParameters() { if (this.smbParametersBlock.WordCount > 0) { this.smbParameters = TypeMarshal.ToStruct<SMB_COM_NT_TRANSACT_SuccessResponse_SMB_Parameters>( TypeMarshal.ToBytes(this.smbParametersBlock)); } }