📄 rdp.java
字号:
/* Rdp.java
* Component: ProperJavaRDP
*
* Revision: $Revision: 1.6 $
* Author: $Author: telliott $
* Date: $Date: 2005/09/27 14:15:39 $
*
* Copyright (c) 2005 Propero Limited
*
* Purpose: Rdp layer of communication
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
*
* (See gpl.txt for details of the GNU General Public License.)
*
*/
package net.propero.rdp;
import java.io.*;
import java.net.*;
import net.propero.rdp.crypto.*;
import net.propero.rdp.rdp5.VChannels;
import java.awt.*;
import java.awt.image.*;
import org.apache.log4j.Logger;
import org.apache.log4j.NDC;
public class Rdp {
public static int RDP5_DISABLE_NOTHING = 0x00;
public static int RDP5_NO_WALLPAPER = 0x01;
public static int RDP5_NO_FULLWINDOWDRAG = 0x02;
public static int RDP5_NO_MENUANIMATIONS = 0x04;
public static int RDP5_NO_THEMING = 0x08;
public static int RDP5_NO_CURSOR_SHADOW = 0x20;
public static int RDP5_NO_CURSORSETTINGS = 0x40; /*
* disables cursor
* blinking
*/
protected static Logger logger = Logger.getLogger(Rdp.class);
/* constants for RDP Layer */
public static final int RDP_LOGON_NORMAL = 0x33;
public static final int RDP_LOGON_AUTO = 0x8;
public static final int RDP_LOGON_BLOB = 0x100;
// PDU Types
private static final int RDP_PDU_DEMAND_ACTIVE = 1;
private static final int RDP_PDU_CONFIRM_ACTIVE = 3;
private static final int RDP_PDU_DEACTIVATE = 6;
private static final int RDP_PDU_DATA = 7;
// Data PDU Types
private static final int RDP_DATA_PDU_UPDATE = 2;
private static final int RDP_DATA_PDU_CONTROL = 20;
private static final int RDP_DATA_PDU_POINTER = 27;
private static final int RDP_DATA_PDU_INPUT = 28;
private static final int RDP_DATA_PDU_SYNCHRONISE = 31;
private static final int RDP_DATA_PDU_BELL = 34;
private static final int RDP_DATA_PDU_LOGON = 38;
private static final int RDP_DATA_PDU_FONT2 = 39;
private static final int RDP_DATA_PDU_DISCONNECT = 47;
// Control PDU types
private static final int RDP_CTL_REQUEST_CONTROL = 1;
private static final int RDP_CTL_GRANT_CONTROL = 2;
private static final int RDP_CTL_DETACH = 3;
private static final int RDP_CTL_COOPERATE = 4;
// Update PDU Types
private static final int RDP_UPDATE_ORDERS = 0;
private static final int RDP_UPDATE_BITMAP = 1;
private static final int RDP_UPDATE_PALETTE = 2;
private static final int RDP_UPDATE_SYNCHRONIZE = 3;
// Pointer PDU Types
private static final int RDP_POINTER_SYSTEM = 1;
private static final int RDP_POINTER_MOVE = 3;
private static final int RDP_POINTER_COLOR = 6;
private static final int RDP_POINTER_CACHED = 7;
// System Pointer Types
private static final int RDP_NULL_POINTER = 0;
private static final int RDP_DEFAULT_POINTER = 0x7F00;
// Input Devices
private static final int RDP_INPUT_SYNCHRONIZE = 0;
private static final int RDP_INPUT_CODEPOINT = 1;
private static final int RDP_INPUT_VIRTKEY = 2;
private static final int RDP_INPUT_SCANCODE = 4;
private static final int RDP_INPUT_MOUSE = 0x8001;
/* RDP capabilities */
private static final int RDP_CAPSET_GENERAL = 1;
private static final int RDP_CAPLEN_GENERAL = 0x18;
private static final int OS_MAJOR_TYPE_UNIX = 4;
private static final int OS_MINOR_TYPE_XSERVER = 7;
private static final int RDP_CAPSET_BITMAP = 2;
private static final int RDP_CAPLEN_BITMAP = 0x1C;
private static final int RDP_CAPSET_ORDER = 3;
private static final int RDP_CAPLEN_ORDER = 0x58;
private static final int ORDER_CAP_NEGOTIATE = 2;
private static final int ORDER_CAP_NOSUPPORT = 4;
private static final int RDP_CAPSET_BMPCACHE = 4;
private static final int RDP_CAPLEN_BMPCACHE = 0x28;
private static final int RDP_CAPSET_CONTROL = 5;
private static final int RDP_CAPLEN_CONTROL = 0x0C;
private static final int RDP_CAPSET_ACTIVATE = 7;
private static final int RDP_CAPLEN_ACTIVATE = 0x0C;
private static final int RDP_CAPSET_POINTER = 8;
private static final int RDP_CAPLEN_POINTER = 0x08;
private static final int RDP_CAPSET_SHARE = 9;
private static final int RDP_CAPLEN_SHARE = 0x08;
private static final int RDP_CAPSET_COLCACHE = 10;
private static final int RDP_CAPLEN_COLCACHE = 0x08;
private static final int RDP_CAPSET_UNKNOWN = 13;
private static final int RDP_CAPLEN_UNKNOWN = 0x9C;
private static final int RDP_CAPSET_BMPCACHE2 = 19;
private static final int RDP_CAPLEN_BMPCACHE2 = 0x28;
private static final int BMPCACHE2_FLAG_PERSIST = (1 << 31);
/* RDP bitmap cache (version 2) constants */
public static final int BMPCACHE2_C0_CELLS = 0x78;
public static final int BMPCACHE2_C1_CELLS = 0x78;
public static final int BMPCACHE2_C2_CELLS = 0x150;
public static final int BMPCACHE2_NUM_PSTCELLS = 0x9f6;
private static final int RDP5_FLAG = 0x0030;
private static final byte[] RDP_SOURCE = { (byte) 0x4D, (byte) 0x53,
(byte) 0x54, (byte) 0x53, (byte) 0x43, (byte) 0x00 }; // string
// MSTSC
// encoded
// as 7 byte
// US-Ascii
protected Secure SecureLayer = null;
private RdesktopFrame frame = null;
private RdesktopCanvas surface = null;
protected Orders orders = null;
private Cache cache = null;
private int next_packet = 0;
private int rdp_shareid = 0;
private boolean connected = false;
private RdpPacket_Localised stream = null;
/*
* private final byte[] canned_caps = { (byte)0x01, (byte)0x00, (byte)0x00,
* (byte)0x00, (byte)0x09, (byte)0x04, (byte)0x00, (byte)0x00, (byte)0x04,
* (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
* (byte)0x00, (byte)0x0C, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
* (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
* (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
* (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
* (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
* (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
* (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
* (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
* (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
* (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
* (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
* (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x0C, (byte)0x00, (byte)0x08,
* (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x0E,
* (byte)0x00, (byte)0x08, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x00,
* (byte)0x00, (byte)0x10, (byte)0x00, (byte)0x34, (byte)0x00, (byte)0xFE,
* (byte)0x00, (byte)0x04, (byte)0x00, (byte)0xFE, (byte)0x00, (byte)0x04,
* (byte)0x00, (byte)0xFE, (byte)0x00, (byte)0x08, (byte)0x00, (byte)0xFE,
* (byte)0x00, (byte)0x08, (byte)0x00, (byte)0xFE, (byte)0x00, (byte)0x10,
* (byte)0x00, (byte)0xFE, (byte)0x00, (byte)0x20, (byte)0x00, (byte)0xFE,
* (byte)0x00, (byte)0x40, (byte)0x00, (byte)0xFE, (byte)0x00, (byte)0x80,
* (byte)0x00, (byte)0xFE, (byte)0x00, (byte)0x00, (byte)0x01, (byte)0x40,
* (byte)0x00, (byte)0x00, (byte)0x08, (byte)0x00, (byte)0x01, (byte)0x00,
* (byte)0x01, (byte)0x02, (byte)0x00, (byte)0x00, (byte)0x00 };
*/
private final byte[] canned_caps = { 0x01, 0x00, 0x00, 0x00, 0x09, 0x04,
0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0C, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x00,
0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x34, 0x00,
(byte) 0xfe, 0x00, 0x04, 0x00, (byte) 0xfe, 0x00, 0x04, 0x00,
(byte) 0xFE, 0x00, 0x08, 0x00, (byte) 0xFE, 0x00, 0x08, 0x00,
(byte) 0xFE, 0x00, 0x10, 0x00, (byte) 0xFE, 0x00, 0x20, 0x00,
(byte) 0xFE, 0x00, 0x40, 0x00, (byte) 0xFE, 0x00, (byte) 0x80,
0x00, (byte) 0xFE, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x08, 0x00,
0x01, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00 };
static byte caps_0x0d[] = { 0x01, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
static byte caps_0x0c[] = { 0x01, 0x00, 0x00, 0x00 };
static byte caps_0x0e[] = { 0x01, 0x00, 0x00, 0x00 };
static byte caps_0x10[] = { (byte) 0xFE, 0x00, 0x04, 0x00, (byte) 0xFE,
0x00, 0x04, 0x00, (byte) 0xFE, 0x00, 0x08, 0x00, (byte) 0xFE, 0x00,
0x08, 0x00, (byte) 0xFE, 0x00, 0x10, 0x00, (byte) 0xFE, 0x00, 0x20,
0x00, (byte) 0xFE, 0x00, 0x40, 0x00, (byte) 0xFE, 0x00,
(byte) 0x80, 0x00, (byte) 0xFE, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00,
0x08, 0x00, 0x01, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00 };
/**
* Process a general capability set
* @param data Packet containing capability set data at current read position
*/
static void processGeneralCaps(RdpPacket_Localised data) {
int pad2octetsB; /* rdp5 flags? */
data.incrementPosition(10); // in_uint8s(s, 10);
pad2octetsB = data.getLittleEndian16(); // in_uint16_le(s, pad2octetsB);
if (pad2octetsB != 0)
Options.use_rdp5 = false;
}
/**
* Process a bitmap capability set
* @param data Packet containing capability set data at current read position
*/
static void processBitmapCaps(RdpPacket_Localised data) {
int width, height, bpp;
bpp = data.getLittleEndian16(); // in_uint16_le(s, bpp);
data.incrementPosition(6); // in_uint8s(s, 6);
width = data.getLittleEndian16(); // in_uint16_le(s, width);
height = data.getLittleEndian16(); // in_uint16_le(s, height);
logger.debug("setting desktop size and bpp to: " + width + "x" + height
+ "x" + bpp);
/*
* The server may limit bpp and change the size of the desktop (for
* example when shadowing another session).
*/
if (Options.server_bpp != bpp) {
logger.warn("colour depth changed from " + Options.server_bpp
+ " to " + bpp);
Options.server_bpp = bpp;
}
if (Options.width != width || Options.height != height) {
logger.warn("screen size changed from " + Options.width + "x"
+ Options.height + " to " + width + "x" + height);
Options.width = width;
Options.height = height;
// ui_resize_window(); TODO: implement resize thingy
}
}
/**
* Process server capabilities
* @param data Packet containing capability set data at current read position
*/
void processServerCaps(RdpPacket_Localised data, int length) {
int n;
int next, start;
int ncapsets, capset_type, capset_length;
start = data.getPosition();
ncapsets = data.getLittleEndian16(); // in_uint16_le(s, ncapsets);
data.incrementPosition(2); // in_uint8s(s, 2); /* pad */
for (n = 0; n < ncapsets; n++) {
if (data.getPosition() > start + length)
return;
capset_type = data.getLittleEndian16(); // in_uint16_le(s,
// capset_type);
capset_length = data.getLittleEndian16(); // in_uint16_le(s,
// capset_length);
next = data.getPosition() + capset_length - 4;
switch (capset_type) {
case RDP_CAPSET_GENERAL:
processGeneralCaps(data);
break;
case RDP_CAPSET_BITMAP:
processBitmapCaps(data);
break;
}
data.setPosition(next);
}
}
/**
* Process a disconnect PDU
* @param data Packet containing disconnect PDU at current read position
* @return Code specifying the reason for disconnection
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -