| // Licensed to the Apache Software Foundation (ASF) under one | |
| // or more contributor license agreements. See the NOTICE file | |
| // distributed with this work for additional information | |
| // regarding copyright ownership. The ASF licenses this file | |
| // to you under the Apache License, Version 2.0 (the | |
| // "License"); you may not use this file except in compliance | |
| // with the License. You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, | |
| // software distributed under the License is distributed on an | |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| // KIND, either express or implied. See the License for the | |
| // specific language governing permissions and limitations | |
| // under the License. | |
| package rdpclient.rdp; | |
| import streamer.BaseElement; | |
| import streamer.ByteBuffer; | |
| import streamer.Element; | |
| import streamer.Link; | |
| import streamer.Order; | |
| import streamer.Pipeline; | |
| import streamer.PipelineImpl; | |
| import streamer.debug.FakeSink; | |
| import streamer.debug.MockSource; | |
| import common.ScreenDescription; | |
| /** | |
| * @see <a href="http://msdn.microsoft.com/en-us/library/cc240669.aspx">msdn cc240669</a> | |
| * @see <a href="http://msdn.microsoft.com/en-us/library/cc240484.aspx">msdn cc240484</a> | |
| */ | |
| public class ServerDemandActivePDU extends BaseElement { | |
| /** | |
| * Demand Active PDU. | |
| */ | |
| public static final int PDUTYPE_DEMANDACTIVEPDU = 0x1; | |
| protected RdpState state; | |
| protected ScreenDescription screen; | |
| public ServerDemandActivePDU(String id, ScreenDescription screen, RdpState state) { | |
| super(id); | |
| this.state = state; | |
| this.screen = screen; | |
| } | |
| @Override | |
| public void handleData(ByteBuffer buf, Link link) { | |
| if (verbose) | |
| System.out.println("[" + this + "] INFO: Data received: " + buf + "."); | |
| // Total length of packet | |
| int length = buf.readSignedShortLE(); // Ignore | |
| if (buf.length != length) | |
| throw new RuntimeException("Incorrect length of packet. Length: " + length + ", data: " + buf + "."); | |
| int type = buf.readSignedShortLE() & 0xf; | |
| if (type != PDUTYPE_DEMANDACTIVEPDU) | |
| throw new RuntimeException("Unknown PDU type. Expected type: Demand Active PDU (0x1), actual tyoe: " + type + ", data: " + buf + "."); | |
| // TS_SHARECONTROLHEADER::pduSource = 0x03ea (1002) | |
| int pduSource = buf.readSignedShortLE(); | |
| if (pduSource != 1002) | |
| throw new RuntimeException("Unexpected source of demand active PDU. Expected source: 1002, actual source: " + pduSource + "."); | |
| // (4 bytes): A 32-bit, unsigned integer. The share identifier for the | |
| // packet (see [T128] section 8.4.2 for more information regarding share | |
| // IDs). | |
| long shareId = buf.readUnsignedIntLE(); | |
| state.serverShareId = shareId; | |
| // Ignore rest of server data because it is not used by this client. | |
| // (2 bytes): A 16-bit, unsigned integer. The size in bytes of the | |
| // sourceDescriptor field. | |
| int lengthSourceDescriptor = buf.readUnsignedShortLE(); | |
| // (2 bytes): A 16-bit, unsigned integer. The combined size in bytes of the | |
| // numberCapabilities, pad2Octets, and capabilitySets fields. | |
| int lengthCombinedCapabilities = buf.readUnsignedShortLE(); | |
| // (variable): A variable-length array of bytes containing a source | |
| // descriptor, | |
| buf.skipBytes(lengthSourceDescriptor); | |
| // (variable): An array of Capability Set (section 2.2.1.13.1.1.1) | |
| // structures. The number of capability sets is specified by the | |
| // numberCapabilities field. | |
| handleCapabiltySets(buf.readBytes(lengthCombinedCapabilities)); | |
| // (4 bytes): A 32-bit, unsigned integer. The session identifier. This field | |
| // is ignored by the client. | |
| buf.skipBytes(4); | |
| /* DEBUG */buf.assertThatBufferIsFullyRead(); | |
| buf.unref(); | |
| sendHandshakePackets(); | |
| } | |
| /** | |
| * General Capability Set | |
| */ | |
| public static final int CAPSTYPE_GENERAL = 0x0001; | |
| /** | |
| * Bitmap Capability Set | |
| */ | |
| public static final int CAPSTYPE_BITMAP = 0x0002; | |
| /** | |
| * Order Capability Set | |
| */ | |
| public static final int CAPSTYPE_ORDER = 0x0003; | |
| /** | |
| * Revision 1 Bitmap Cache Capability Set | |
| */ | |
| public static final int CAPSTYPE_BITMAPCACHE = 0x0004; | |
| /** | |
| * Control Capability Set | |
| */ | |
| public static final int CAPSTYPE_CONTROL = 0x0005; | |
| /** | |
| * Window Activation Capability Set | |
| */ | |
| public static final int CAPSTYPE_ACTIVATION = 0x0007; | |
| /** | |
| * Pointer Capability Set | |
| */ | |
| public static final int CAPSTYPE_POINTER = 0x0008; | |
| /** | |
| * Share Capability Set | |
| */ | |
| public static final int CAPSTYPE_SHARE = 0x0009; | |
| /** | |
| * Color Table Cache Capability Set | |
| */ | |
| public static final int CAPSTYPE_COLORCACHE = 0x000A; | |
| /** | |
| * Sound Capability Set | |
| */ | |
| public static final int CAPSTYPE_SOUND = 0x000C; | |
| /** | |
| * Input Capability Set | |
| */ | |
| public static final int CAPSTYPE_INPUT = 0x000D; | |
| /** | |
| * Font Capability Set | |
| */ | |
| public static final int CAPSTYPE_FONT = 0x000E; | |
| /** | |
| * Brush Capability Set | |
| */ | |
| public static final int CAPSTYPE_BRUSH = 0x000F; | |
| /** | |
| * Glyph Cache Capability Set | |
| */ | |
| public static final int CAPSTYPE_GLYPHCACHE = 0x0010; | |
| /** | |
| * Offscreen Bitmap Cache Capability Set | |
| */ | |
| public static final int CAPSTYPE_OFFSCREENCACHE = 0x0011; | |
| /** | |
| * Bitmap Cache Host Support Capability Set | |
| */ | |
| public static final int CAPSTYPE_BITMAPCACHE_HOSTSUPPORT = 0x0012; | |
| /** | |
| * Revision 2 Bitmap Cache Capability Set | |
| */ | |
| public static final int CAPSTYPE_BITMAPCACHE_REV2 = 0x0013; | |
| /** | |
| * Virtual Channel Capability Set | |
| */ | |
| public static final int CAPSTYPE_VIRTUALCHANNEL = 0x0014; | |
| /** | |
| * DrawNineGrid Cache Capability Set | |
| */ | |
| public static final int CAPSTYPE_DRAWNINEGRIDCACHE = 0x0015; | |
| /** | |
| * Draw GDI+ Cache Capability Set | |
| */ | |
| public static final int CAPSTYPE_DRAWGDIPLUS = 0x0016; | |
| /** | |
| * Remote Programs Capability Set | |
| */ | |
| public static final int CAPSTYPE_RAIL = 0x0017; | |
| /** | |
| * Window List Capability Set | |
| */ | |
| public static final int CAPSTYPE_WINDOW = 0x0018; | |
| /** | |
| * Desktop Composition Extension Capability Set | |
| */ | |
| public static final int CAPSETTYPE_COMPDESK = 0x0019; | |
| /** | |
| * Multifragment Update Capability Set | |
| */ | |
| public static final int CAPSETTYPE_MULTIFRAGMENTUPDATE = 0x001A; | |
| /** | |
| * Large Pointer Capability Set | |
| */ | |
| public static final int CAPSETTYPE_LARGE_POINTER = 0x001B; | |
| /** | |
| * Surface Commands Capability Set | |
| */ | |
| public static final int CAPSETTYPE_SURFACE_COMMANDS = 0x001C; | |
| /** | |
| * Bitmap Codecs Capability Set | |
| */ | |
| public static final int CAPSETTYPE_BITMAP_CODECS = 0x001D; | |
| /** | |
| * Frame Acknowledge Capability Set | |
| */ | |
| public static final int CAPSSETTYPE_FRAME_ACKNOWLEDGE = 0x001E; | |
| /** | |
| * @see <a href="http://msdn.microsoft.com/en-us/library/cc240486.aspx">msdn cc240486</a> | |
| */ | |
| protected void handleCapabiltySets(ByteBuffer buf) { | |
| // (2 bytes): A 16-bit, unsigned integer. The number of capability sets | |
| // included in the Demand Active PDU. | |
| int numberCapabilities = buf.readSignedShortLE(); | |
| // (2 bytes): Padding. | |
| buf.skipBytes(2); | |
| for (int i = 0; i < numberCapabilities; i++) { | |
| // (2 bytes): A 16-bit, unsigned integer. The type identifier of the | |
| // capability set. | |
| int capabilitySetType = buf.readUnsignedShortLE(); | |
| // (2 bytes): A 16-bit, unsigned integer. The length in bytes of the | |
| // capability data, including the size of the capabilitySetType and | |
| // lengthCapability fields. | |
| int lengthCapability = buf.readUnsignedShortLE(); | |
| // (variable): Capability set data which conforms to the structure of the | |
| // type given by the capabilitySetType field. | |
| ByteBuffer capabilityData = buf.readBytes(lengthCapability - 4); | |
| switch (capabilitySetType) { | |
| case CAPSTYPE_GENERAL: | |
| break; | |
| case CAPSTYPE_BITMAP: | |
| handleBitmapCapabilities(capabilityData); | |
| break; | |
| case CAPSTYPE_ORDER: | |
| break; | |
| case CAPSTYPE_BITMAPCACHE: | |
| break; | |
| case CAPSTYPE_CONTROL: | |
| break; | |
| case CAPSTYPE_ACTIVATION: | |
| break; | |
| case CAPSTYPE_POINTER: | |
| break; | |
| case CAPSTYPE_SHARE: | |
| break; | |
| case CAPSTYPE_COLORCACHE: | |
| break; | |
| case CAPSTYPE_SOUND: | |
| break; | |
| case CAPSTYPE_INPUT: | |
| break; | |
| case CAPSTYPE_FONT: | |
| break; | |
| case CAPSTYPE_BRUSH: | |
| break; | |
| case CAPSTYPE_GLYPHCACHE: | |
| break; | |
| case CAPSTYPE_OFFSCREENCACHE: | |
| break; | |
| case CAPSTYPE_BITMAPCACHE_HOSTSUPPORT: | |
| break; | |
| case CAPSTYPE_BITMAPCACHE_REV2: | |
| break; | |
| case CAPSTYPE_VIRTUALCHANNEL: | |
| break; | |
| case CAPSTYPE_DRAWNINEGRIDCACHE: | |
| break; | |
| case CAPSTYPE_DRAWGDIPLUS: | |
| break; | |
| case CAPSTYPE_RAIL: | |
| break; | |
| case CAPSTYPE_WINDOW: | |
| break; | |
| case CAPSETTYPE_COMPDESK: | |
| break; | |
| case CAPSETTYPE_MULTIFRAGMENTUPDATE: | |
| break; | |
| case CAPSETTYPE_LARGE_POINTER: | |
| break; | |
| case CAPSETTYPE_SURFACE_COMMANDS: | |
| break; | |
| case CAPSETTYPE_BITMAP_CODECS: | |
| break; | |
| case CAPSSETTYPE_FRAME_ACKNOWLEDGE: | |
| break; | |
| default: | |
| // Ignore | |
| break; | |
| } | |
| capabilityData.unref(); | |
| } | |
| // TODO | |
| buf.unref(); | |
| } | |
| /** | |
| * @see <a href="http://msdn.microsoft.com/en-us/library/cc240554.aspx">msdn cc240554</a> | |
| */ | |
| protected void handleBitmapCapabilities(ByteBuffer buf) { | |
| // (2 bytes): A 16-bit, unsigned integer. The server MUST set this field to | |
| // the color depth of the session, while the client SHOULD set this field to | |
| // the color depth requested in the Client Core Data (section 2.2.1.3.2). | |
| int preferredBitsPerPixel = buf.readUnsignedShortLE(); | |
| screen.setPixelFormatRGBTrueColor(preferredBitsPerPixel); | |
| // receive1BitPerPixel (2 bytes): A 16-bit, unsigned integer. Indicates | |
| // whether the client can receive 1 bpp. This field is ignored and SHOULD be | |
| // set to TRUE (0x0001). | |
| buf.skipBytes(2); | |
| // receive4BitsPerPixel(2 bytes): A 16-bit, unsigned integer. Indicates | |
| // whether the client can receive 4 bpp. This field is ignored and SHOULD be | |
| // set to TRUE (0x0001). | |
| buf.skipBytes(2); | |
| // receive8BitsPerPixel (2 bytes): A 16-bit, unsigned integer. Indicates | |
| // whether the client can receive 8 bpp. This field is ignored and SHOULD be | |
| // set to TRUE (0x0001). | |
| buf.skipBytes(2); | |
| // (2 bytes): A 16-bit, unsigned integer. The width of the desktop in the | |
| // session. | |
| int desktopWidth = buf.readUnsignedShortLE(); | |
| // (2 bytes): A 16-bit, unsigned integer. The height of the desktop in the | |
| // session. | |
| int desktopHeight = buf.readUnsignedShortLE(); | |
| screen.setFramebufferSize(desktopWidth, desktopHeight); | |
| // pad2octets (2 bytes): A 16-bit, unsigned integer. Padding. Values in this | |
| // field MUST be ignored. | |
| // desktopResizeFlag (2 bytes): A 16-bit, unsigned integer. Indicates | |
| // whether resizing the desktop by using a Deactivation-Reactivation | |
| // Sequence is supported. | |
| // bitmapCompressionFlag (2 bytes): A 16-bit, unsigned integer. Indicates | |
| // whether bitmap compression is supported. This field MUST be set to TRUE | |
| // (0x0001) because support for compressed bitmaps is required for a | |
| // connection to proceed. | |
| // highColorFlags (1 byte): An 8-bit, unsigned integer. Client support for | |
| // 16 bpp color modes. This field is ignored and SHOULD be set to zero. | |
| // drawingFlags (1 byte): An 8-bit, unsigned integer. Flags describing | |
| // support for 32 bpp bitmaps. | |
| // multipleRectangleSupport (2 bytes): A 16-bit, unsigned integer. Indicates | |
| // whether the use of multiple bitmap rectangles is supported in the Bitmap | |
| // Update (section 2.2.9.1.1.3.1.2). This field MUST be set to TRUE (0x0001) | |
| // because multiple rectangle support is required for a connection to | |
| // proceed. | |
| // pad2octetsB (2 bytes): A 16-bit, unsigned integer. Padding. Values in | |
| // this field MUST be ignored. | |
| } | |
| /** | |
| * Send all client requests in one hop, to simplify logic. | |
| */ | |
| protected void sendHandshakePackets() { | |
| // Send reactivation sequence in bulk | |
| pushDataToPad("confirm_active", new ByteBuffer((Order)null)); | |
| } | |
| /** | |
| * Example. | |
| * | |
| */ | |
| public static void main(String args[]) { | |
| System.setProperty("streamer.Element.debug", "true"); | |
| /* @formatter:off */ | |
| byte[] packet = new byte[] { | |
| 0x67, 0x01, // TS_SHARECONTROLHEADER::totalLength = 0x0167 = 359 bytes | |
| 0x11, 0x00, // TS_SHARECONTROLHEADER::pduType = 0x0011 0x0011 = 0x0010 | 0x0001 = TS_PROTOCOL_VERSION | PDUTYPE_DEMANDACTIVEPDU | |
| (byte) 0xea, 0x03, // TS_SHARECONTROLHEADER::pduSource = 0x03ea (1002) | |
| (byte) 0xea, 0x03, 0x01, 0x00, // TS_DEMAND_ACTIVE_PDU::shareId | |
| 0x04, 0x00, // TS_DEMAND_ACTIVE_PDU::lengthSourceDescriptor = 4 bytes | |
| 0x51, 0x01, // TS_DEMAND_ACTIVE_PDU::lengthCombinedCapabilities = 0x151 = 337 bytes | |
| 0x52, 0x44, 0x50, 0x00, // TS_DEMAND_ACTIVE_PDU::sourceDescriptor = "RDP" | |
| 0x0d, 0x00, // TS_DEMAND_ACTIVE_PDU::numberCapabilities = 13 | |
| 0x00, 0x00, // TS_DEMAND_ACTIVE_PDU::pad2octets | |
| // Share Capability Set (8 bytes) | |
| // 0x09, 0x00, 0x08, 0x00, (byte) 0xea, 0x03, (byte) 0xdc, (byte) 0xe2, | |
| // | |
| 0x09, 0x00, // TS_SHARE_CAPABILITYSET::capabilitySetType = CAPSTYPE_SHARE (9) | |
| 0x08, 0x00, // TS_SHARE_CAPABILITYSET::lengthCapability = 8 bytes | |
| (byte) 0xea, 0x03, // TS_SHARE_CAPABILITYSET::nodeID = 0x03ea (1002) | |
| (byte) 0xdc, (byte) 0xe2, // TS_SHARE_CAPABILITYSET::pad2octets | |
| // General Capability Set (24 bytes) | |
| // 0x01, 0x00, 0x18, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x04, | |
| // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, | |
| // | |
| 0x01, 0x00, // TS_GENERAL_CAPABILITYSET::capabilitySetType = CAPSTYPE_GENERAL (1) | |
| 0x18, 0x00, // TS_GENERAL_CAPABILITYSET::lengthCapability = 24 bytes | |
| 0x01, 0x00, // TS_GENERAL_CAPABILITYSET::osMajorType = TS_OSMAJORTYPE_WINDOWS (1) | |
| 0x03, 0x00, // TS_GENERAL_CAPABILITYSET::osMinorType = TS_OSMINORTYPE_WINDOWS_NT (3) | |
| 0x00, 0x02, // TS_GENERAL_CAPABILITYSET::protocolVersion = TS_CAPS_PROTOCOLVERSION (0x0200) | |
| 0x00, 0x00, // TS_GENERAL_CAPABILITYSET::pad2octetsA | |
| 0x00, 0x00, // TS_GENERAL_CAPABILITYSET::generalCompressionTypes = 0 | |
| 0x1d, 0x04, // TS_GENERAL_CAPABILITYSET::extraFlags = 0x041d = 0x0400 | 0x0010 | 0x0008 | 0x0004 | 0x0001 = NO_BITMAP_COMPRESSION_HDR | ENC_SALTED_CHECKSUM | AUTORECONNECT_SUPPORTED | LONG_CREDENTIALS_SUPPORTED | FASTPATH_OUTPUT_SUPPORTED | |
| 0x00, 0x00, // TS_GENERAL_CAPABILITYSET::updateCapabilityFlag = 0 | |
| 0x00, 0x00, // TS_GENERAL_CAPABILITYSET::remoteUnshareFlag = 0 | |
| 0x00, 0x00, // TS_GENERAL_CAPABILITYSET::generalCompressionLevel = 0 | |
| 0x01, // TS_GENERAL_CAPABILITYSET::refreshRectSupport = TRUE | |
| 0x01, // TS_GENERAL_CAPABILITYSET::suppressOutputSupport = TRUE | |
| // Virtual Channel Capability Set (8 bytes) | |
| // 0x14, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, | |
| // | |
| 0x14, 0x00, // TS_VIRTUALCHANNEL_CAPABILITYSET::capabilitySetType = CAPSTYPE_VIRTUALCHANNEL (20) | |
| 0x08, 0x00, // TS_VIRTUALCHANNEL_CAPABILITYSET::lengthCapability = 8 bytes | |
| 0x02, 0x00, 0x00, 0x00, // TS_VIRTUALCHANNEL_CAPABILITYSET::vccaps1 = 0x00000002 = VCCAPS_COMPR_CS_8K | |
| // DrawGdiPlus Capability Set (40 bytes) | |
| // 0x16, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, (byte) 0xf6, 0x13, (byte) 0xf3, 0x01, 0x00, 0x00, 0x00, | |
| // 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, (byte) 0x9c, (byte) 0xf6, 0x13, (byte) 0xf3, 0x61, (byte) 0xa6, (byte) 0x82, (byte) 0x80, | |
| // 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, (byte) 0x91, (byte) 0xbf, | |
| // | |
| 0x16, 0x00, // TS_DRAW_GDIPLUS_CAPABILITYSET::capabilitySetType = CAPSTYPE_DRAWGDIPLUS (22) | |
| 0x28, 0x00, // TS_DRAW_GDIPLUS_CAPABILITYSET::lengthCapability = 40 bytes | |
| 0x00, 0x00, 0x00, 0x00, // TS_DRAW_GDIPLUS_CAPABILITYSET::drawGdiplusSupportLevel = TS_DRAW_GDIPLUS_DEFAULT (0) | |
| 0x70, (byte) 0xf6, 0x13, (byte) 0xf3, // TS_DRAW_GDIPLUS_CAPABILITYSET::GdipVersion (not initialized by server) | |
| 0x01, 0x00, 0x00, 0x00, // TS_DRAW_GDIPLUS_CAPABILITYSET::drawGdiplusCacheLevel = TS_DRAW_GDIPLUS_CACHE_LEVEL_ONE (1) | |
| 0x01, 0x00, // TS_GDIPLUS_CACHE_ENTRIES::GdipGraphicsCacheEntries (not initialized by server) | |
| 0x00, 0x00, // TS_GDIPLUS_CACHE_ENTRIES::GdipObjectBrushCacheEntries (not initialized by server) | |
| 0x18, 0x00, // TS_GDIPLUS_CACHE_ENTRIES::GdipObjectPenCacheEntries (not initialized by server) | |
| 0x00, 0x00, // TS_GDIPLUS_CACHE_ENTRIES::GdipObjectImageCacheEntries (not initialized by server) | |
| (byte) 0x9c, (byte) 0xf6, // TS_GDIPLUS_CACHE_ENTRIES::GdipObjectImageAttributesCacheEntries (not initialized by server) | |
| 0x13, (byte) 0xf3, // TS_GDIPLUS_CACHE_CHUNK_SIZE::GdipGraphicsCacheChunkSize (not initialized by server) | |
| 0x61, (byte) 0xa6, // TS_GDIPLUS_CACHE_CHUNK_SIZE::GdipObjectBrushCacheChunkSize (not initialized by server) | |
| (byte) 0x82, (byte) 0x80, // TS_GDIPLUS_CACHE_CHUNK_SIZE::GdipObjectPenCacheChunkSize (not initialized by server) | |
| 0x00, 0x00, // TS_GDIPLUS_CACHE_CHUNK_SIZE::GdipObjectImageAttributesCacheChunkSize (not initialized by server) | |
| 0x00, 0x00, // TS_GDIPLUS_IMAGE_CACHE_PROPERTIES::GdipObjectImageCacheChunkSize (not initialized by server) | |
| 0x00, 0x50, // TS_GDIPLUS_IMAGE_CACHE_PROPERTIES::GdipObjectImageCacheTotalSize (not initialized by server) | |
| (byte) 0x91, (byte) 0xbf, // TS_GDIPLUS_IMAGE_CACHE_PROPERTIES::GdipObjectImageCacheMaxSize (not initialized by server) | |
| // Font Capability Set (4 bytes) | |
| // 0x0e, 0x00, 0x04, 0x00, | |
| // | |
| // Due to a bug, the TS_FONT_CAPABILITYSET capability set size is incorrectly set to 4 bytes (it must be 8 bytes). As a result of this bug, the fontSupportFlags and pad2octets fields are missing. | |
| 0x0e, 0x00, // TS_FONT_CAPABILITYSET::capabilitySetType = CAPSTYPE_FONT (14) | |
| 0x04, 0x00, // TS_FONT_CAPABILITYSET::lengthCapability = 4 bytes | |
| // Bitmap Capability Set (28 bytes) | |
| // 0x02, 0x00, 0x1c, 0x00, 0x18, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x05, 0x00, 0x04, | |
| // 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, | |
| // | |
| 0x02, 0x00, // TS_BITMAP_CAPABILITYSET::capabilitySetType = CAPSTYPE_BITMAP (2) | |
| 0x1c, 0x00, // TS_BITMAP_CAPABILITYSET::lengthCapability = 28 bytes | |
| 0x18, 0x00, // TS_BITMAP_CAPABILITYSET::preferredBitsPerPixel = 24 bpp | |
| 0x01, 0x00, // TS_BITMAP_CAPABILITYSET::receive1BitPerPixel = TRUE | |
| 0x01, 0x00, // TS_BITMAP_CAPABILITYSET::receive4BitsPerPixel = TRUE | |
| 0x01, 0x00, // TS_BITMAP_CAPABILITYSET::receive8BitsPerPixel = TRUE | |
| 0x00, 0x05, // TS_BITMAP_CAPABILITYSET::desktopWidth = 1280 pixels | |
| 0x00, 0x04, // TS_BITMAP_CAPABILITYSET::desktopHeight = 1024 pixels | |
| 0x00, 0x00, // TS_BITMAP_CAPABILITYSET::pad2octets | |
| 0x01, 0x00, // TS_BITMAP_CAPABILITYSET::desktopResizeFlag = TRUE | |
| 0x01, 0x00, // TS_BITMAP_CAPABILITYSET::bitmapCompressionFlag = TRUE | |
| 0x00, // TS_BITMAP_CAPABILITYSET::highColorFlags = 0 | |
| 0x00, // TS_BITMAP_CAPABILITYSET::pad1octet | |
| 0x01, 0x00, // TS_BITMAP_CAPABILITYSET::multipleRectangleSupport = TRUE | |
| 0x00, 0x00, // TS_BITMAP_CAPABILITYSET::pad2octetsB | |
| // Order Capability Set (88 bytes) | |
| // 0x03, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| // 0x00, 0x00, 0x00, 0x00, 0x40, 0x42, 0x0f, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, | |
| // 0x00, 0x00, 0x22, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, | |
| // 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, | |
| // 0x00, 0x00, 0x00, 0x00, (byte) 0xa1, 0x06, 0x00, 0x00, 0x40, 0x42, 0x0f, 0x00, 0x40, 0x42, 0x0f, 0x00, | |
| // 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| // | |
| 0x03, 0x00, // TS_ORDER_CAPABILITYSET::capabilitySetType = CAPSTYPE_ORDER (3) | |
| 0x58, 0x00, // TS_ORDER_CAPABILITYSET::lengthCapability = 88 bytes | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // TS_ORDER_CAPABILITYSET::terminalDescriptor = "" | |
| 0x40, 0x42, 0x0f, 0x00, // TS_ORDER_CAPABILITYSET::pad4octetsA | |
| 0x01, 0x00, // TS_ORDER_CAPABILITYSET::desktopSaveXGranularity = 1 | |
| 0x14, 0x00, // TS_ORDER_CAPABILITYSET::desktopSaveYGranularity = 20 | |
| 0x00, 0x00, // TS_ORDER_CAPABILITYSET::pad2octetsA | |
| 0x01, 0x00, // TS_ORDER_CAPABILITYSET::maximumOrderLevel = ORD_LEVEL_1_ORDERS (1) | |
| 0x00, 0x00, // TS_ORDER_CAPABILITYSET::numberFonts = 0 | |
| 0x22, 0x00, // TS_ORDER_CAPABILITYSET::orderFlags = 0x0022 = 0x0020 | 0x0002 = COLORINDEXSUPPORT | NEGOTIATEORDERSUPPORT | |
| 0x01, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_DSTBLT_INDEX] = TRUE | |
| 0x01, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_PATBLT_INDEX] = TRUE | |
| 0x01, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_SCRBLT_INDEX] = TRUE | |
| 0x01, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_MEMBLT_INDEX] = TRUE | |
| 0x01, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_MEM3BLT_INDEX] = TRUE | |
| 0x00, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_ATEXTOUT_INDEX] = FALSE | |
| 0x00, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_AEXTTEXTOUT_INDEX] = FALSE | |
| 0x01, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_DRAWNINEGRID_INDEX] = TRUE | |
| 0x01, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_LINETO_INDEX] = TRUE | |
| 0x01, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_MULTI_DRAWNINEGRID_INDEX] = TRUE | |
| 0x01, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_OPAQUERECT_INDEX] = TRUE | |
| 0x01, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_SAVEBITMAP_INDEX] = TRUE | |
| 0x00, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_WTEXTOUT_INDEX] = FALSE | |
| 0x00, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_MEMBLT_R2_INDEX] = FALSE | |
| 0x00, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_MEM3BLT_R2_INDEX] = FALSE | |
| 0x01, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_MULTIDSTBLT_INDEX] = TRUE | |
| 0x01, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_MULTIPATBLT_INDEX] = TRUE | |
| 0x01, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_MULTISCRBLT_INDEX] = TRUE | |
| 0x01, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_MULTIOPAQUERECT_INDEX] = TRUE | |
| 0x01, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_FAST_INDEX_INDEX] = TRUE | |
| 0x01, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_POLYGON_SC_INDEX] = TRUE | |
| 0x01, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_POLYGON_CB_INDEX] = TRUE | |
| 0x01, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_POLYLINE_INDEX] = TRUE | |
| 0x00, // TS_ORDER_CAPABILITYSET::orderSupport[23] = 0 | |
| 0x01, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_FAST_GLYPH_INDEX] = TRUE | |
| 0x01, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_ELLIPSE_SC_INDEX] = TRUE | |
| 0x01, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_ELLIPSE_CB_INDEX] = TRUE | |
| 0x01, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_INDEX_INDEX] = TRUE | |
| 0x00, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_WEXTTEXTOUT_INDEX] = FALSE | |
| 0x00, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_WLONGTEXTOUT_INDEX] = FALSE | |
| 0x00, // TS_ORDER_CAPABILITYSET::orderSupport[TS_NEG_WLONGEXTTEXTOUT_INDEX] = FALSE | |
| 0x00, // TS_ORDER_CAPABILITYSET::orderSupport[24] = 0 | |
| (byte) 0xa1, 0x06, // TS_ORDER_CAPABILITYSET::textFlags = 0x06a1 | |
| 0x00, 0x00, // TS_ORDER_CAPABILITYSET::pad2octetsB | |
| 0x40, 0x42, 0x0f, 0x00, // TS_ORDER_CAPABILITYSET::pad4octetsB | |
| 0x40, 0x42, 0x0f, 0x00, // TS_ORDER_CAPABILITYSET::desktopSaveSize = 0xf4240 = 1000000 | |
| 0x01, 0x00, // TS_ORDER_CAPABILITYSET::pad2octetsC | |
| 0x00, 0x00, // TS_ORDER_CAPABILITYSET::pad2octetsD | |
| 0x00, 0x00, // TS_ORDER_CAPABILITYSET::textANSICodePage | |
| 0x00, 0x00, // TS_ORDER_CAPABILITYSET::pad2octetsE | |
| // Color Table Cache Capability Set (8 bytes) | |
| // 0x0a, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, | |
| // | |
| 0x0a, 0x00, // TS_COLORTABLECACHE_CAPABILITYSET::capabilitySetType = CAPSTYPE_COLORCACHE (10) | |
| 0x08, 0x00, // TS_COLORTABLECACHE_CAPABILITYSET::lengthCapability = 8 bytes | |
| 0x06, 0x00, // TS_COLORTABLECACHE_CAPABILITYSET::colorTableCacheSize = 6 | |
| 0x00, 0x00, // TS_COLORTABLECACHE_CAPABILITYSET::pad2octets | |
| // Bitmap Cache Host Support Capability Set (8 bytes) | |
| // 0x12, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, | |
| // | |
| 0x12, 0x00, // TS_BITMAPCACHE_CAPABILITYSET_HOSTSUPPORT::capabilitySetType = CAPSTYPE_BITMAPCACHE_HOSTSUPPORT (18) | |
| 0x08, 0x00, // TS_BITMAPCACHE_CAPABILITYSET_HOSTSUPPORT::lengthCapability = 8 bytes | |
| 0x01, // TS_BITMAPCACHE_CAPABILITYSET_HOSTSUPPORT::CacheVersion = 1 (corresponds to rev. 2 capabilities) | |
| 0x00, // TS_BITMAPCACHE_CAPABILITYSET_HOSTSUPPORT::Pad1 | |
| 0x00, 0x00, // TS_BITMAPCACHE_CAPABILITYSET_HOSTSUPPORT::Pad2 | |
| // Pointer Capability Set (10 bytes) | |
| // 0x08, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x19, 0x00, 0x19, 0x00, | |
| // | |
| 0x08, 0x00, // TS_POINTER_CAPABILITYSET::capabilitySetType = CAPSTYPE_POINTER (8) | |
| 0x0a, 0x00, // TS_POINTER_CAPABILITYSET::lengthCapability = 10 bytes | |
| 0x01, 0x00, // TS_POINTER_CAPABILITYSET::colorPointerFlag = TRUE | |
| 0x19, 0x00, // TS_POINTER_CAPABILITYSET::colorPointerCacheSize = 25 | |
| 0x19, 0x00, // TS_POINTER_CAPABILITYSET::pointerCacheSize = 25 | |
| // Input Capability Set (88 bytes) | |
| // 0x0d, 0x00, 0x58, 0x00, 0x35, 0x00, 0x00, 0x00, (byte) 0xa1, 0x06, 0x00, 0x00, 0x40, 0x42, 0x0f, 0x00, | |
| // 0x0c, (byte) 0xf6, 0x13, (byte) 0xf3, (byte) 0x93, 0x5a, 0x37, (byte) 0xf3, 0x00, (byte) 0x90, 0x30, (byte) 0xe1, 0x34, 0x1c, 0x38, (byte) 0xf3, | |
| // 0x40, (byte) 0xf6, 0x13, (byte) 0xf3, 0x04, 0x00, 0x00, 0x00, 0x4c, 0x54, (byte) 0xdc, (byte) 0xe2, 0x08, 0x50, (byte) 0xdc, (byte) 0xe2, | |
| // 0x01, 0x00, 0x00, 0x00, 0x08, 0x50, (byte) 0xdc, (byte) 0xe2, 0x00, 0x00, 0x00, 0x00, 0x38, (byte) 0xf6, 0x13, (byte) 0xf3, | |
| // 0x2e, 0x05, 0x38, (byte) 0xf3, 0x08, 0x50, (byte) 0xdc, (byte) 0xe2, 0x2c, (byte) 0xf6, 0x13, (byte) 0xf3, 0x00, 0x00, 0x00, 0x00, | |
| // 0x08, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x19, 0x00, | |
| // | |
| 0x0d, 0x00, // TS_INPUT_CAPABILITYSET::capabilitySetType = CAPSTYPE_INPUT (13) | |
| 0x58, 0x00, // TS_INPUT_CAPABILITYSET::lengthCapability = 88 bytes | |
| 0x35, 0x00, // TS_INPUT_CAPABILITYSET::inputFlags = 0x0035 = 0x0020 | 0x0010 | 0x0004 | 0x0001 = INPUT_FLAG_FASTPATH_INPUT2 | INPUT_FLAG_VKPACKET | INPUT_FLAG_MOUSEX | INPUT_FLAG_SCANCODES | |
| 0x00, 0x00, // TS_INPUT_CAPABILITYSET::pad2octetsA | |
| (byte) 0xa1, 0x06, 0x00, 0x00, // TS_INPUT_CAPABILITYSET::keyboardLayout (not initialized by server) | |
| 0x40, 0x42, 0x0f, 0x00, // TS_INPUT_CAPABILITYSET::keyboardType (not initialized by server) | |
| 0x0c, (byte) 0xf6, 0x13, (byte) 0xf3, // TS_INPUT_CAPABILITYSET::keyboardSubType (not initialized by server) | |
| (byte) 0x93, 0x5a, 0x37, (byte) 0xf3, // TS_INPUT_CAPABILITYSET::keyboardFunctionKey (not initialized by server) | |
| // TS_INPUT_CAPABILITYSET::imeFileName (not initialized by server) | |
| 0x00, (byte) 0x90, 0x30, (byte) 0xe1, 0x34, 0x1c, 0x38, (byte) 0xf3, 0x40, (byte) 0xf6, 0x13, (byte) 0xf3, 0x04, 0x00, 0x00, 0x00, | |
| 0x4c, 0x54, (byte) 0xdc, (byte) 0xe2, 0x08, 0x50, (byte) 0xdc, (byte) 0xe2, 0x01, 0x00, 0x00, 0x00, 0x08, 0x50, (byte) 0xdc, (byte) 0xe2, | |
| 0x00, 0x00, 0x00, 0x00, 0x38, (byte) 0xf6, 0x13, (byte) 0xf3, 0x2e, 0x05, 0x38, (byte) 0xf3, 0x08, 0x50, (byte) 0xdc, (byte) 0xe2, | |
| 0x2c, (byte) 0xf6, 0x13, (byte) 0xf3, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x19, 0x00, | |
| // RAIL Capability Set (8 bytes) | |
| // 0x17, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| // | |
| 0x17, 0x00, // TS_RAIL_CAPABILITYSET::capabilitySetType = CAPSTYPE_RAIL (23) | |
| 0x08, 0x00, // TS_RAIL_CAPABILITYSET::lengthCapability = 8 bytes | |
| 0x00, 0x00, 0x00, 0x00, // TS_RAIL_CAPABILITYSET::railSupportLevel = TS_RAIL_LEVEL_DEFAULT (0) | |
| // Windowing Capability Set (11 bytes) | |
| // 0x18, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| // | |
| 0x18, 0x00, // TS_WINDOW_CAPABILITYSET::capabilitySetType = CAPSTYPE_WINDOW (24) | |
| 0x0b, 0x00, // TS_WINDOW_CAPABILITYSET::lengthCapability = 11 bytes | |
| 0x00, 0x00, 0x00, 0x00, // TS_WINDOW_CAPABILITYSET::wndSupportLevel = TS_WINDOW_LEVEL_DEFAULT (0) | |
| 0x00, // TS_WINDOW_CAPABILITYSET::nIconCaches = 0 | |
| 0x00, 0x00, // TS_WINDOW_CAPABILITYSET::nIconCacheEntries = 0 | |
| // Remainder of Demand Active PDU: | |
| 0x00, 0x00, 0x00, 0x00, // TS_DEMAND_ACTIVE_PDU::sessionId = 0 | |
| }; | |
| /* @formatter:on */ | |
| RdpState rdpState = new RdpState(); | |
| ScreenDescription screenDescription = new ScreenDescription(); | |
| MockSource source = new MockSource("source", ByteBuffer.convertByteArraysToByteBuffers(packet)); | |
| Element demandActive = new ServerDemandActivePDU("demand_active", screenDescription, rdpState); | |
| Element sink = new FakeSink("sink"); | |
| Pipeline pipeline = new PipelineImpl("test"); | |
| pipeline.add(source, demandActive, sink); | |
| pipeline.link("source", "demand_active", "sink"); | |
| pipeline.runMainLoop("source", STDOUT, false, false); | |
| } | |
| } |