/// <summary> /// Decode segment data to an array of server Pdus /// </summary> /// <param name="data"></param> /// <returns></returns> public static RdpegfxPdu[] Decode(byte[] data) { RDP_SEGMENTED_DATA segData = new RDP_SEGMENTED_DATA(); bool fResult = PduMarshaler.Unmarshal(data, segData); if (fResult) { if (segData.descriptor == DescriptorTypes.SINGLE) { byte[] rawData = Compressor.Decompress(segData.bulkData.data, segData.bulkData.header);; return(DecodePdus(rawData)); } else { List <byte> dataList = new List <byte>(); byte[] rawData = null; RDP_DATA_SEGMENT[] dataSegs = segData.segmentArray; for (int i = 0; i < dataSegs.Length; i++) { RDP8_BULK_ENCODED_DATA bulkData = dataSegs[i].bulkData; rawData = Compressor.Decompress(bulkData.data, bulkData.header); dataList.AddRange(rawData); } if (segData.uncompressedSize == dataList.Count) { return(DecodePdus(dataList.ToArray())); } } } return(null); }
private const uint SEGMENT_PART_SIZE = 65535; // Maximum number of uncompressed bytes in a single segment is 65535 #endregion private variable /// <summary> /// Contructor. /// </summary> /// <param name="descType"> Indicates if a single or multipart segment PDU.</param> /// <param name="compFlag">Indicates the data is compressed and the compress type.</param> public RdpSegmentedPdu(byte compFlag) { // segHeader.descType = descType; compressFlag = compFlag; // default number of uncompressed bytes in a single segment is 65535. segmentPartSize = SEGMENT_PART_SIZE; segHeadList = new List <RDP_SEGMENTED_DATA>(); segPduList = new List <byte[]>(); segHeader = new RDP_SEGMENTED_DATA(); }