/// <summary> /// Build a Smb2CompressedPacket from a byte array. /// </summary> /// <param name="data">The byte array.</param> /// <param name="consumedLen">The consumed data length.</param> /// <param name="expectedLen">The expected data length.</param> internal override void FromBytes(byte[] data, out int consumedLen, out int expectedLen) { int minimumLength = Marshal.SizeOf(Header); if (data.Length < minimumLength) { throw new InvalidOleVariantTypeException("Not enough data for Compression_Transform_Header!"); } int offset = 0; Header = TypeMarshal.ToStruct <Compression_Transform_Header>(data, ref offset); if (offset + Header.Offset > data.Length) { throw new InvalidOleVariantTypeException("Not enough data for Smb2CompressedPacket!"); } UncompressedData = new byte[Header.Offset]; Array.Copy(data, offset, UncompressedData, 0, Header.Offset); long compressedDataLength = data.Length - offset - Header.Offset; CompressedData = new byte[compressedDataLength]; Array.Copy(data, offset + Header.Offset, CompressedData, 0, compressedDataLength); consumedLen = data.Length; expectedLen = 0; }
static Smb2ChainedCompressedPacket() { var header = new Compression_Transform_Header(); FirstPayloadHeaderOffset = TypeMarshal.GetBlockMemorySize(header.ProtocolId) + TypeMarshal.GetBlockMemorySize(header.OriginalCompressedSegmentSize); var payloadHeader = new SMB2_COMPRESSION_PAYLOAD_HEADER(); FieldSizeOriginalPayloadSize = TypeMarshal.GetBlockMemorySize(payloadHeader.OriginalPayloadSize); }