/// <summary> /// to decode the smb data: from the general SmbDada to the concrete Smb Data. /// </summary> protected override void DecodeData() { this.smbData = new SMB_COM_TRANSACTION_SECONDARY_Request_SMB_Data(); using (MemoryStream memoryStream = new MemoryStream(CifsMessageUtils.ToBytes<SmbData>(this.smbDataBlock))) { using (Channel channel = new Channel(null, memoryStream)) { this.smbData.ByteCount = channel.Read<ushort>(); this.smbData.Pad1 = channel.ReadBytes((int)(this.smbParameters.ParameterOffset - this.HeaderSize - this.smbParameters.WordCount * 2 - SmbComTransactionPacket.SmbParametersWordCountLength - SmbComTransactionPacket.SmbDataByteCountLength)); this.smbData.Trans_Parameters = channel.ReadBytes((int)this.smbParameters.ParameterCount); this.smbData.Pad2 = channel.ReadBytes((int)(this.smbParameters.DataOffset - this.smbParameters.ParameterOffset - this.smbParameters.ParameterCount)); this.smbData.Trans_Data = channel.ReadBytes((int)this.smbParameters.DataCount); } } }
/// <summary> /// to split a trans request to a trans request with trans secondary requests. /// </summary> /// <param name="transRequest">the trans request packet to be split.</param> /// <param name="parameterCount">the parameter count with which to split the request packet.</param> /// <param name="dataCount">the data count with which to split the request packet.</param> /// <returns>a requests array of the split trans request with trans secondary requests.</returns> /// <exception cref="System.ArgumentNullException">the transRequest must not be null.</exception> public SmbPacket[] CreateTransWith2ndRequests( SmbTransactionRequestPacket transRequest, int parameterCount, int dataCount) { if (transRequest == null) { throw new ArgumentNullException("transRequest"); } transRequest.ToBytes(); transRequest.isDivided = true; int paramLength = 0; if (transRequest.SmbData.Trans_Parameters != null) { paramLength = transRequest.SmbData.Trans_Parameters.Length; } double paramNumber = Math.Ceiling((double)paramLength / parameterCount); int dataLength = 0; if (transRequest.SmbData.Trans_Data != null) { dataLength = transRequest.SmbData.Trans_Data.Length; } int dataNumber = (int)Math.Ceiling((double)dataLength / dataCount); double packetCount = paramNumber > dataNumber ? paramNumber : dataNumber; List<SmbPacket> packetList = new List<SmbPacket>(); if (packetCount > 1) { byte[] transParameters = transRequest.SmbData.Trans_Parameters; byte[] transData = transRequest.SmbData.Trans_Data; SMB_COM_TRANSACTION_Request_SMB_Data transSmbData = transRequest.SmbData; if (paramLength > parameterCount) { transSmbData.Trans_Parameters = new byte[parameterCount]; Array.Copy(transParameters, transSmbData.Trans_Parameters, parameterCount); } if (dataLength > dataCount) { transSmbData.Trans_Data = new byte[dataCount]; Array.Copy(transData, transSmbData.Trans_Data, dataCount); } transRequest.SmbData = transSmbData; transRequest.UpdateCountAndOffset(); packetList.Add(transRequest); int currentIndex = 1; int remainedParamCount = transRequest.SmbParameters.TotalParameterCount - parameterCount; int remainedDataCount = transRequest.SmbParameters.TotalDataCount - dataCount; while (currentIndex < packetCount) { SmbTransactionSecondaryRequestPacket packet = new SmbTransactionSecondaryRequestPacket(); SmbHeader header = transRequest.SmbHeader; header.Command = SmbCommand.SMB_COM_TRANSACTION_SECONDARY; packet.SmbHeader = header; // Set Smb_Parameters SMB_COM_TRANSACTION_SECONDARY_Request_SMB_Parameters smbParameters = new SMB_COM_TRANSACTION_SECONDARY_Request_SMB_Parameters(); smbParameters.WordCount = (byte)(CifsMessageUtils.GetSize< SMB_COM_TRANSACTION_SECONDARY_Request_SMB_Parameters>(smbParameters) / NumBytesOfWord); smbParameters.TotalParameterCount = transRequest.SmbParameters.TotalParameterCount; smbParameters.TotalDataCount = transRequest.SmbParameters.TotalDataCount; // Set Smb_Data SMB_COM_TRANSACTION_SECONDARY_Request_SMB_Data smbData = new SMB_COM_TRANSACTION_SECONDARY_Request_SMB_Data(); if (remainedParamCount > parameterCount) { smbData.Trans_Parameters = new byte[parameterCount]; Array.Copy(transParameters, parameterCount * currentIndex, smbData.Trans_Parameters, 0, parameterCount); smbParameters.ParameterDisplacement = (ushort)(parameterCount * currentIndex); remainedParamCount -= parameterCount; } else if (remainedParamCount > 0) { smbData.Trans_Parameters = new byte[remainedParamCount]; Array.Copy(transParameters, parameterCount * currentIndex, smbData.Trans_Parameters, 0, remainedParamCount); smbParameters.ParameterDisplacement = (ushort)(parameterCount * currentIndex); remainedParamCount -= parameterCount; } else { smbData.Trans_Parameters = new byte[0]; } if (remainedDataCount > dataCount) { smbData.Trans_Data = new byte[dataCount]; Array.Copy(transData, dataCount * currentIndex, smbData.Trans_Data, 0, dataCount); smbParameters.DataDisplacement = (ushort)(dataCount * currentIndex); remainedDataCount -= dataCount; } else if (remainedDataCount > 0) { smbData.Trans_Data = new byte[remainedDataCount]; Array.Copy(transData, dataCount * currentIndex, smbData.Trans_Data, 0, remainedDataCount); smbParameters.DataDisplacement = (ushort)(dataCount * currentIndex); remainedDataCount -= dataCount; } else { smbData.Trans_Data = new byte[0]; } packet.SmbParameters = smbParameters; packet.SmbData = smbData; currentIndex++; packet.UpdateCountAndOffset(); packetList.Add(packet); } } else { packetList.Add(transRequest); } return packetList.ToArray(); }