2.2.3.4 DVC Data Compressed PDU (DYNVC_DATA_COMPRESSED)

The DYNVC_DATA_COMPRESSED PDU is used to send both single messages and blocks of fragmented messages when the data block is compressed.

A single DYNVC_DATA_COMPRESSED PDU is used to send a message when the total length of the original message data, before compression, is less than or equal to 1,590 bytes.

Multiple DYNVC_DATA_COMPRESSED PDUs are used to send messages that have been fragmented and are sent subsequent to a DYNVC_DATA_FIRST_COMPRESSED (section 2.2.3.3) PDU. DYNVC_DATA_COMPRESSED PDUs are sent until the entire fragmented message has been sent. This PDU MUST NOT be used unless both DVC managers support version 3 of the Remote Desktop Protocol: Dynamic Virtual Channel Extension, and a reliable transport is being used (UDP-R or TCP).


0


1


2


3


4


5


6


7


8


9

1
0


1


2


3


4


5


6


7


8


9

2
0


1


2


3


4


5


6


7


8


9

3
0


1

cbId

Sp

Cmd

ChannelId (variable)

...

Data (variable)

...

cbId (2 bits): Indicates the length of the ChannelId field.

Value

Meaning

0x00

ChannelId field length is 1 byte.

0x01

ChannelId field length is 2 bytes.

0x02

ChannelId field length is 4 bytes.

0x03

Invalid value.

Sp (2 bits): Unused. SHOULD be initialized to 0x00.<9>

Cmd (4 bits): MUST be set to 0x07 (Data Compressed).

ChannelId (variable): A variable-length 8-bit, 16-bit, or 32-bit unsigned integer. Set to the value of the ChannelId associated with the DVC upon which the PDU is being sent.

Data (variable): An RDP_SEGMENTED_DATA ([MS-RDPEGFX] section 2.2.5.1) structure containing a single RDP8_BULK_ENCODED_DATA ([MS-RDPEGFX] section 2.2.5.3) segment. The segment contains the first and only block of data in an unfragmented message, or a block of data following the first block in a fragmented message, where the data has been compressed with the RDP 8.0 Bulk Compression algorithm ([MS-RDPEGFX] section 3.1.9.1) with the following modifications:

  • Maximum number of uncompressed bytes in a single segment: 8,192 instead of 65,535.

  • Maximum match distance / minimum history size: 8,192 bytes instead of 2,500,000 bytes.

  • The compression type code is PACKET_COMPR_TYPE_RDP8_LITE (0x06) instead of PACKET_COMPR_TYPE_RDP8 (0x04).

If the data block cannot be compressed, the length of the Data field will be exactly two bytes larger than the length of the uncompressed data block, in order to contain the RDP_SEGMENTED_DATA descriptor and RDP8_BULK_ENCODED_DATA header fields. Thus, the maximum length of the data block, before compression, is 1,598 bytes minus the space taken for Cmd, Sp, cbId, and ChannelId fields.