Coverage Report

Created: 2026-07-12 07:10

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wireshark/epan/dissectors/packet-rdp_rail.c
Line
Count
Source
1
/* packet-rdp_rail.c
2
 * Routines for the RAIL RDP channel
3
 * Copyright 2023, David Fort <contact@hardening-consulting.com>
4
 *
5
 * Wireshark - Network traffic analyzer
6
 * By Gerald Combs <gerald@wireshark.org>
7
 * Copyright 1998 Gerald Combs
8
 *
9
 * SPDX-License-Identifier: GPL-2.0-or-later
10
 */
11
12
/*
13
 * See: "[MS-RDPERP] "
14
 */
15
16
#include "config.h"
17
18
#include <epan/packet.h>
19
#include <epan/prefs.h>
20
#include <epan/conversation.h>
21
#include <epan/expert.h>
22
23
#include "packet-rdpudp.h"
24
25
void proto_register_rdp_rail(void);
26
void proto_reg_handoff_rdp_rail(void);
27
28
static int proto_rdp_rail;
29
30
static int hf_rail_orderType;
31
static int hf_rail_pduLength;
32
33
static int hf_rail_caps_handshake_buildNumber;
34
35
static int hf_rail_windowId;
36
static int hf_rail_windowmove_left;
37
static int hf_rail_windowmove_top;
38
static int hf_rail_windowmove_right;
39
static int hf_rail_windowmove_bottom;
40
41
static int hf_rail_notify_iconId;
42
static int hf_rail_notify_message;
43
44
static int hf_rail_localmovesize_isMoveSizeStart;
45
static int hf_rail_localmovesize_moveSizeType;
46
static int hf_rail_localmovesize_posX;
47
static int hf_rail_localmovesize_posY;
48
49
static int hf_rail_minmaxinfo_maxwidth;
50
static int hf_rail_minmaxinfo_maxheight;
51
static int hf_rail_minmaxinfo_maxPosX;
52
static int hf_rail_minmaxinfo_maxPosY;
53
static int hf_rail_minmaxinfo_minTrackWidth;
54
static int hf_rail_minmaxinfo_minTrackHeight;
55
static int hf_rail_minmaxinfo_maxTrackWidth;
56
static int hf_rail_minmaxinfo_maxTrackHeight;
57
58
static int hf_rail_cloak_cloaked;
59
60
static int hf_rail_handshake_flags;
61
static int hf_rail_handshake_flags_hidef;
62
static int hf_rail_handshake_flags_ex_spi;
63
static int hf_rail_handshake_flags_snap;
64
static int hf_rail_handshake_flags_textscale;
65
static int hf_rail_handshake_flags_caretblink;
66
static int hf_rail_handshake_flags_ex_spi2;
67
68
static int hf_rail_cstatus_flags;
69
static int hf_rail_cstatus_flags_allowlocalmove;
70
static int hf_rail_cstatus_autoreconnect;
71
static int hf_rail_cstatus_zorder_sync;
72
static int hf_rail_cstatus_resize_margin;
73
static int hf_rail_cstatus_hidpi_icons;
74
static int hf_rail_cstatus_appbar_remoting;
75
static int hf_rail_cstatus_powerdisplay;
76
static int hf_rail_cstatus_bidir_cloak;
77
static int hf_rail_cstatus_suppress_icon_border;
78
79
static int hf_rail_activate_enabled;
80
81
static int hf_rail_sysparam_server_params;
82
static int hf_rail_sysparam_client_params;
83
84
static int ett_rdp_rail;
85
static int ett_rdp_rail_handshake_flags;
86
static int ett_rdp_rail_clientstatus_flags;
87
88
enum {
89
  TS_RAIL_ORDER_EXEC = 0x01,
90
  TS_RAIL_ORDER_ACTIVATE = 0x02,
91
  TS_RAIL_ORDER_SYSPARAM = 0x03,
92
  TS_RAIL_ORDER_SYSCOMMAND = 0x04,
93
  TS_RAIL_ORDER_HANDSHAKE = 0x05,
94
  TS_RAIL_ORDER_NOTIFY_EVENT = 0x06,
95
  TS_RAIL_ORDER_EXEC_RESULT_7 = 0x7,
96
  TS_RAIL_ORDER_WINDOWMOVE = 0x08,
97
  TS_RAIL_ORDER_LOCALMOVESIZE = 0x09,
98
  TS_RAIL_ORDER_MINMAXINFO = 0x0a,
99
  TS_RAIL_ORDER_CLIENTSTATUS = 0x0b,
100
  TS_RAIL_ORDER_SYSMENU = 0x0c,
101
  TS_RAIL_ORDER_LANGBARINFO = 0x0d,
102
  TS_RAIL_ORDER_EXEC_RESULT = 0x80,
103
  TS_RAIL_ORDER_GET_APPID_REQ = 0x0e,
104
  TS_RAIL_ORDER_GET_APPID_RESP = 0x0f,
105
  TS_RAIL_ORDER_TASKBARINFO = 0x10,
106
  TS_RAIL_ORDER_LANGUAGEIMEINFO = 0x11,
107
  TS_RAIL_ORDER_COMPARTMENTINFO = 0x12,
108
  TS_RAIL_ORDER_HANDSHAKE_EX = 0X13,
109
  TS_RAIL_ORDER_ZORDER_SYNC = 0x14,
110
  TS_RAIL_ORDER_CLOAK = 0x15,
111
  TS_RAIL_ORDER_POWER_DISPLAY_REQUEST = 0x16,
112
  TS_RAIL_ORDER_SNAP_ARRANGE = 0x17,
113
  TS_RAIL_ORDER_GET_APPID_RESP_EX = 0x18,
114
  TS_RAIL_ORDER_TEXTSCALEINFO = 0x19,
115
  TS_RAIL_ORDER_CARETBLINKINFO = 0x1a,
116
117
  TS_RAIL_ORDER_WINDOW_CREATE_BODY = 0x1b,
118
  TS_RAIL_ORDER_WINDOW_CHANGE_BODY = 0x1c,
119
  TS_RAIL_ORDER_WINDOW_GEOMETRY_BODY = 0x1d,
120
  TS_RAIL_ORDER_WINDOW_DELETE_BODY = 0x1e,
121
  TS_RAIL_ORDER_WINDOW_ICON_BODY = 0x1f,
122
  TS_RAIL_ORDER_WINDOW_CACHED_ICON = 0x20,
123
  TS_RAIL_ORDER_WINDOW_APPBAR_INFO_BODY = 0x21,
124
  TS_RAIL_ORDER_WINDOW_NOTIFY_ICON_BODY = 0x22,
125
  TS_RAIL_ORDER_WINDOW_NOTIFY_ICON_BODY_CHANGE = 0x23,
126
  TS_RAIL_ORDER_NOTIFY_ICON_DELETE = 0x25,
127
  TS_RAIL_ORDER_ZORDER_BODY = 0x26,
128
  TS_RAIL_ORDER_SYNC_STATE_BODY = 0x27,
129
  TS_RAIL_ORDER_28 = 0x28,
130
  TS_RAIL_ORDER_29 = 0x29,
131
  TS_RAIL_ORDER_2B = 0x2b,
132
  TS_RAIL_ORDER_2C = 0x2c,
133
  TS_RAIL_ORDER_2D = 0x2d,
134
};
135
136
enum {
137
  SPI_SETSCREENSAVEACTIVE = 0x00000011,
138
  SPI_SETSCREENSAVESECURE = 0x00000077,
139
140
  SPI_SETDRAGFULLWINDOWS = 0x00000025,
141
  SPI_SETKEYBOARDCUES = 0x0000100B,
142
  SPI_SETKEYBOARDPREF = 0x00000045,
143
  SPI_SETWORKAREA = 0x0000002F,
144
  RAIL_SPI_DISPLAYCHANGE = 0x0000F001,
145
  SPI_SETMOUSEBUTTONSWAP = 0x00000021,
146
  RAIL_SPI_TASKBARPOS = 0x0000F000,
147
  SPI_SETHIGHCONTRAST = 0x00000043,
148
  SPI_SETCARETWIDTH = 0x00002007,
149
  SPI_SETSTICKYKEYS = 0x0000003B,
150
  SPI_SETTOGGLEKEYS = 0x00000035,
151
  SPI_SETFILTERKEYS = 0x00000033,
152
  RAIL_SPI_DISPLAY_ANIMATIONS_ENABLED = 0x0000F002,
153
  RAIL_SPI_DISPLAY_ADVANCED_EFFECTS_ENABLED = 0x0000F003,
154
  RAIL_SPI_DISPLAY_AUTO_HIDE_SCROLLBARS = 0x0000F004,
155
  RAIL_SPI_DISPLAY_MESSAGE_DURATION = 0x0000F005,
156
  RAIL_SPI_CLOSED_CAPTION_FONT_COLOR = 0x0000F006,
157
  RAIL_SPI_CLOSED_CAPTION_FONT_OPACITY = 0x0000F007,
158
  RAIL_SPI_CLOSED_CAPTION_FONT_SIZE = 0x0000F008,
159
  RAIL_SPI_CLOSED_CAPTION_FONT_STYLE = 0x0000F009,
160
  RAIL_SPI_CLOSED_CAPTION_FONT_EDGE_EFFECT = 0x0000F00A,
161
  RAIL_SPI_CLOSED_CAPTION_BACKGROUND_COLOR = 0x0000F00B,
162
  RAIL_SPI_CLOSED_CAPTION_BACKGROUND_OPACITY = 0x0000F00C,
163
  RAIL_SPI_CLOSED_CAPTION_REGION_COLOR = 0x0000F00D,
164
  RAIL_SPI_CLOSED_CAPTION_REGION_OPACITY = 0x0000F00E,
165
};
166
167
static const value_string rdp_rail_order_vals[] = {
168
  { TS_RAIL_ORDER_EXEC, "Execute"},
169
  { TS_RAIL_ORDER_ACTIVATE, "Activate"},
170
  { TS_RAIL_ORDER_SYSPARAM, "Client system parameters"},
171
  { TS_RAIL_ORDER_SYSCOMMAND, "System command"},
172
  { TS_RAIL_ORDER_HANDSHAKE, "Handshake"},
173
  { TS_RAIL_ORDER_NOTIFY_EVENT, "Notify event"},
174
  { TS_RAIL_ORDER_EXEC_RESULT_7, "ExecResult 0x7"},
175
  { TS_RAIL_ORDER_WINDOWMOVE, "Window move"},
176
  { TS_RAIL_ORDER_LOCALMOVESIZE, "Local move size"},
177
  { TS_RAIL_ORDER_MINMAXINFO, "MinMax info"},
178
  { TS_RAIL_ORDER_CLIENTSTATUS, "Client status"},
179
  { TS_RAIL_ORDER_SYSMENU, "System menu"},
180
  { TS_RAIL_ORDER_LANGBARINFO, "Language bar info"},
181
  { TS_RAIL_ORDER_EXEC_RESULT, "Exec result"},
182
  { TS_RAIL_ORDER_GET_APPID_REQ, "Get appId request"},
183
  { TS_RAIL_ORDER_GET_APPID_RESP, "Get appId response"},
184
  { TS_RAIL_ORDER_TASKBARINFO, "Taskbar info"},
185
  { TS_RAIL_ORDER_LANGUAGEIMEINFO, "Language IME info"},
186
  { TS_RAIL_ORDER_COMPARTMENTINFO, "Compartment info"},
187
  { TS_RAIL_ORDER_HANDSHAKE_EX, "HandshakeEx"},
188
  { TS_RAIL_ORDER_ZORDER_SYNC, "Z-order sync"},
189
  { TS_RAIL_ORDER_CLOAK, "Cloak"},
190
  { TS_RAIL_ORDER_POWER_DISPLAY_REQUEST, "Power display request"},
191
  { TS_RAIL_ORDER_SNAP_ARRANGE, "Snap arrange"},
192
  { TS_RAIL_ORDER_GET_APPID_RESP_EX, "Get appId response"},
193
  { TS_RAIL_ORDER_TEXTSCALEINFO, "Text scale info"},
194
  { TS_RAIL_ORDER_CARETBLINKINFO, "Caret blink info"},
195
  { TS_RAIL_ORDER_WINDOW_CREATE_BODY, "window create body" },
196
  { TS_RAIL_ORDER_WINDOW_CHANGE_BODY, "window change body" },
197
  { TS_RAIL_ORDER_WINDOW_GEOMETRY_BODY, "window body geometry" },
198
  { TS_RAIL_ORDER_WINDOW_DELETE_BODY, "window delete body" },
199
  { TS_RAIL_ORDER_WINDOW_ICON_BODY, "window icon body" },
200
  { TS_RAIL_ORDER_WINDOW_CACHED_ICON, "window icon cached" },
201
  { TS_RAIL_ORDER_WINDOW_APPBAR_INFO_BODY, "appbar info body" },
202
  { TS_RAIL_ORDER_WINDOW_NOTIFY_ICON_BODY, "notify icon body" },
203
  { TS_RAIL_ORDER_WINDOW_NOTIFY_ICON_BODY_CHANGE, "notify icon body change" },
204
  { TS_RAIL_ORDER_NOTIFY_ICON_DELETE, "notify icon delete" },
205
  { TS_RAIL_ORDER_ZORDER_BODY, "zorder" },
206
  { TS_RAIL_ORDER_SYNC_STATE_BODY, "sync state" },
207
  { TS_RAIL_ORDER_28, "order28" },
208
  { TS_RAIL_ORDER_29, "order29" },
209
  { TS_RAIL_ORDER_2B, "order2B" },
210
  { TS_RAIL_ORDER_2C, "order2C" },
211
  { TS_RAIL_ORDER_2D, "order2D" },
212
213
  { 0x0, NULL},
214
};
215
216
static const value_string moveSizeStart_vals[] = {
217
  { 0x0001, "RAIL_WMSZ_LEFT" },
218
  { 0x0002, "RAIL_WMSZ_RIGHT" },
219
  { 0x0003, "RAIL_WMSZ_TOP" },
220
  { 0x0004, "RAIL_WMSZ_TOPLEFT" },
221
  { 0x0005, "RAIL_WMSZ_TOPRIGHT" },
222
  { 0x0006, "RAIL_WMSZ_BOTTOM" },
223
  { 0x0007, "RAIL_WMSZ_BOTTOMLEFT" },
224
  { 0x0008, "RAIL_WMSZ_BOTTOMRIGHT" },
225
  { 0x0009, "RAIL_WMSZ_MOVE" },
226
  { 0x000A, "RAIL_WMSZ_KEYMOVE" },
227
  { 0x000B, "RAIL_WMSZ_KEYSIZE" },
228
  { 0x0, NULL},
229
};
230
231
static const value_string rdp_rail_notify_vals[] = {
232
  { 0x00000201, "WM_LBUTTONDOWN" },
233
  { 0x00000202, "WM_LBUTTONUP" },
234
  { 0x00000204, "WM_RBUTTONDOWN" },
235
  { 0x00000205, "WM_RBUTTONUP" },
236
  { 0x0000007B, "WM_CONTEXTMENU" },
237
  { 0x00000203, "WM_LBUTTONDBLCLK" },
238
  { 0x00000206, "WM_RBUTTONDBLCLK" },
239
  { 0x00000400, "NIN_SELECT" },
240
  { 0x00000401, "NIN_KEYSELECT" },
241
  { 0x00000402, "NIN_BALLOONSHOW" },
242
  { 0x00000403, "NIN_BALLOONHIDE" },
243
  { 0x00000404, "NIN_BALLOONTIMEOUT" },
244
  { 0x00000405, "NIN_BALLOONUSERCLICK" },
245
  { 0x0, NULL},
246
};
247
248
static const value_string rdp_rail_server_system_params_vals[] = {
249
  { SPI_SETSCREENSAVEACTIVE, "SPI_SETSCREENSAVEACTIVE" },
250
  { SPI_SETSCREENSAVESECURE, "SPI_SETSCREENSAVESECURE" },
251
  { 0x0, NULL},
252
};
253
254
static const value_string rdp_rail_client_system_params_vals[] = {
255
  { SPI_SETDRAGFULLWINDOWS, "SPI_SETDRAGFULLWINDOWS" },
256
  { SPI_SETKEYBOARDCUES, "SPI_SETKEYBOARDCUES" },
257
  { SPI_SETKEYBOARDPREF, "SPI_SETKEYBOARDPREF" },
258
  { SPI_SETWORKAREA, "SPI_SETWORKAREA" },
259
  { RAIL_SPI_DISPLAYCHANGE, "RAIL_SPI_DISPLAYCHANGE" },
260
  { SPI_SETMOUSEBUTTONSWAP, "SPI_SETMOUSEBUTTONSWAP" },
261
  { RAIL_SPI_TASKBARPOS, "RAIL_SPI_TASKBARPOS" },
262
  { SPI_SETHIGHCONTRAST, "SPI_SETHIGHCONTRAST" },
263
  { SPI_SETCARETWIDTH, "SPI_SETCARETWIDTH" },
264
  { SPI_SETSTICKYKEYS, "SPI_SETSTICKYKEYS" },
265
  { SPI_SETTOGGLEKEYS, "SPI_SETTOGGLEKEYS" },
266
  { SPI_SETFILTERKEYS, "SPI_SETFILTERKEYS" },
267
  { RAIL_SPI_DISPLAY_ANIMATIONS_ENABLED, "RAIL_SPI_DISPLAY_ANIMATIONS_ENABLED" },
268
  { RAIL_SPI_DISPLAY_ADVANCED_EFFECTS_ENABLED, "RAIL_SPI_DISPLAY_ADVANCED_EFFECTS_ENABLED" },
269
  { RAIL_SPI_DISPLAY_AUTO_HIDE_SCROLLBARS, "RAIL_SPI_DISPLAY_AUTO_HIDE_SCROLLBARS" },
270
  { RAIL_SPI_DISPLAY_MESSAGE_DURATION, "RAIL_SPI_DISPLAY_MESSAGE_DURATION" },
271
  { RAIL_SPI_CLOSED_CAPTION_FONT_COLOR, "RAIL_SPI_CLOSED_CAPTION_FONT_COLOR" },
272
  { RAIL_SPI_CLOSED_CAPTION_FONT_OPACITY, "RAIL_SPI_CLOSED_CAPTION_FONT_OPACITY" },
273
  { RAIL_SPI_CLOSED_CAPTION_FONT_SIZE, "RAIL_SPI_CLOSED_CAPTION_FONT_SIZE" },
274
  { RAIL_SPI_CLOSED_CAPTION_FONT_STYLE, "RAIL_SPI_CLOSED_CAPTION_FONT_STYLE" },
275
  { RAIL_SPI_CLOSED_CAPTION_FONT_EDGE_EFFECT, "RAIL_SPI_CLOSED_CAPTION_FONT_EDGE_EFFECT" },
276
  { RAIL_SPI_CLOSED_CAPTION_BACKGROUND_COLOR, "RAIL_SPI_CLOSED_CAPTION_BACKGROUND_COLOR" },
277
  { RAIL_SPI_CLOSED_CAPTION_BACKGROUND_OPACITY, "RAIL_SPI_CLOSED_CAPTION_BACKGROUND_OPACITY" },
278
  { RAIL_SPI_CLOSED_CAPTION_REGION_COLOR, "RAIL_SPI_CLOSED_CAPTION_REGION_COLOR" },
279
  { RAIL_SPI_CLOSED_CAPTION_REGION_OPACITY, "RAIL_SPI_CLOSED_CAPTION_REGION_OPACITY" },
280
  { 0x0, NULL},
281
};
282
283
284
static int
285
dissect_rdp_rail(tvbuff_t *tvb _U_, packet_info *pinfo, proto_tree *parent_tree _U_, void *data _U_)
286
0
{
287
0
  proto_item *item;
288
0
  int nextOffset, offset = 0;
289
0
  uint32_t cmdId = 0;
290
0
  uint32_t pduLength;
291
0
  proto_tree *tree;
292
0
  uint32_t windowId;
293
0
  bool packetToServer = rdp_isServerAddressTarget(pinfo);
294
295
0
  parent_tree = proto_tree_get_root(parent_tree);
296
0
  col_set_str(pinfo->cinfo, COL_PROTOCOL, "RAIL");
297
0
  col_clear(pinfo->cinfo, COL_INFO);
298
299
0
  pduLength = tvb_get_uint16(tvb, offset + 2, ENC_LITTLE_ENDIAN);
300
0
  item = proto_tree_add_item(parent_tree, proto_rdp_rail, tvb, offset, pduLength, ENC_NA);
301
0
  tree = proto_item_add_subtree(item, ett_rdp_rail);
302
303
0
  proto_tree_add_item_ret_uint(tree, hf_rail_orderType, tvb, offset, 2, ENC_LITTLE_ENDIAN, &cmdId);
304
0
  offset += 2;
305
306
0
  proto_tree_add_item(tree, hf_rail_pduLength, tvb, offset, 2, ENC_LITTLE_ENDIAN);
307
0
  offset += 2;
308
309
0
  nextOffset = offset + (pduLength - 4);
310
311
  /* packets that start with a windowId */
312
0
  switch (cmdId) {
313
0
  case TS_RAIL_ORDER_ACTIVATE:
314
0
  case TS_RAIL_ORDER_SYSMENU:
315
0
  case TS_RAIL_ORDER_SYSCOMMAND:
316
0
  case TS_RAIL_ORDER_NOTIFY_EVENT:
317
0
  case TS_RAIL_ORDER_GET_APPID_REQ:
318
0
  case TS_RAIL_ORDER_MINMAXINFO:
319
0
  case TS_RAIL_ORDER_WINDOWMOVE:
320
0
  case TS_RAIL_ORDER_LOCALMOVESIZE:
321
0
  case TS_RAIL_ORDER_CLOAK:
322
0
  case TS_RAIL_ORDER_SNAP_ARRANGE:
323
0
  case TS_RAIL_ORDER_GET_APPID_RESP:
324
0
  case TS_RAIL_ORDER_GET_APPID_RESP_EX:
325
0
  case TS_RAIL_ORDER_ZORDER_SYNC:
326
0
  case TS_RAIL_ORDER_WINDOW_CREATE_BODY:
327
0
  case TS_RAIL_ORDER_WINDOW_CHANGE_BODY:
328
0
  case TS_RAIL_ORDER_WINDOW_GEOMETRY_BODY:
329
0
  case TS_RAIL_ORDER_WINDOW_ICON_BODY:
330
0
    proto_tree_add_item_ret_uint(tree, hf_rail_windowId, tvb, offset, 4, ENC_LITTLE_ENDIAN, &windowId);
331
0
    col_append_sep_fstr(pinfo->cinfo, COL_INFO, ",", "%s|windowId=0x%x", val_to_str_const(cmdId, rdp_rail_order_vals, "Unknown RAIL command"),
332
0
        windowId);
333
0
    offset += 4;
334
0
    break;
335
0
  case TS_RAIL_ORDER_SYSPARAM:
336
0
    break;
337
0
  default:
338
0
    col_append_sep_str(pinfo->cinfo, COL_INFO, ",", val_to_str_const(cmdId, rdp_rail_order_vals, "Unknown RAIL command"));
339
0
    break;
340
0
  }
341
342
343
  /* do the rest of the parsing */
344
0
  switch (cmdId) {
345
0
  case TS_RAIL_ORDER_EXEC:
346
0
    break;
347
0
  case TS_RAIL_ORDER_ACTIVATE:
348
0
    proto_tree_add_item(tree, hf_rail_activate_enabled, tvb, offset, 1, ENC_LITTLE_ENDIAN);
349
0
    break;
350
0
  case TS_RAIL_ORDER_SYSPARAM:
351
0
    if (!packetToServer) {
352
0
      uint32_t serverParam;
353
0
      proto_tree_add_item_ret_uint(tree, hf_rail_sysparam_server_params, tvb, offset, 4, ENC_LITTLE_ENDIAN, &serverParam);
354
355
0
      col_append_sep_fstr(pinfo->cinfo, COL_INFO, ",", "Server system parameters %s", val_to_str_const(serverParam, rdp_rail_server_system_params_vals, "<unknown server param>"));
356
0
      switch(serverParam) {
357
0
      case SPI_SETSCREENSAVEACTIVE:
358
0
      case SPI_SETSCREENSAVESECURE:
359
        /* TODO */
360
0
        break;
361
0
      }
362
0
    } else {
363
0
      uint32_t clientParam;
364
365
0
      proto_tree_add_item_ret_uint(tree, hf_rail_sysparam_client_params, tvb, offset, 4, ENC_LITTLE_ENDIAN, &clientParam);
366
0
      col_append_sep_fstr(pinfo->cinfo, COL_INFO, ",", "client system parameters %s", val_to_str_const(clientParam, rdp_rail_client_system_params_vals, "<unknown client param>"));
367
368
0
      switch(clientParam) {
369
0
      case SPI_SETDRAGFULLWINDOWS:
370
0
      case SPI_SETKEYBOARDCUES:
371
0
      case SPI_SETKEYBOARDPREF:
372
0
      case SPI_SETWORKAREA:
373
0
      case RAIL_SPI_DISPLAYCHANGE:
374
0
      case SPI_SETMOUSEBUTTONSWAP:
375
0
      case RAIL_SPI_TASKBARPOS:
376
0
      case SPI_SETHIGHCONTRAST:
377
0
      case SPI_SETCARETWIDTH:
378
0
      case SPI_SETSTICKYKEYS:
379
0
      case SPI_SETTOGGLEKEYS:
380
0
      case SPI_SETFILTERKEYS:
381
0
      case RAIL_SPI_DISPLAY_ANIMATIONS_ENABLED:
382
0
      case RAIL_SPI_DISPLAY_ADVANCED_EFFECTS_ENABLED:
383
0
      case RAIL_SPI_DISPLAY_AUTO_HIDE_SCROLLBARS:
384
0
      case RAIL_SPI_DISPLAY_MESSAGE_DURATION:
385
0
      case RAIL_SPI_CLOSED_CAPTION_FONT_COLOR:
386
0
      case RAIL_SPI_CLOSED_CAPTION_FONT_OPACITY:
387
0
      case RAIL_SPI_CLOSED_CAPTION_FONT_SIZE:
388
0
      case RAIL_SPI_CLOSED_CAPTION_FONT_STYLE:
389
0
      case RAIL_SPI_CLOSED_CAPTION_FONT_EDGE_EFFECT:
390
0
      case RAIL_SPI_CLOSED_CAPTION_BACKGROUND_COLOR:
391
0
      case RAIL_SPI_CLOSED_CAPTION_BACKGROUND_OPACITY:
392
0
      case RAIL_SPI_CLOSED_CAPTION_REGION_COLOR:
393
0
      case RAIL_SPI_CLOSED_CAPTION_REGION_OPACITY:
394
        /* TODO */
395
0
        break;
396
0
      }
397
0
    }
398
0
    break;
399
0
  case TS_RAIL_ORDER_SYSCOMMAND:
400
0
    break;
401
0
  case TS_RAIL_ORDER_HANDSHAKE:
402
0
    proto_tree_add_item(tree, hf_rail_caps_handshake_buildNumber, tvb, offset, 4, ENC_LITTLE_ENDIAN);
403
0
    break;
404
0
  case TS_RAIL_ORDER_NOTIFY_EVENT:
405
0
    proto_tree_add_item(tree, hf_rail_notify_iconId, tvb, offset, 4, ENC_LITTLE_ENDIAN);
406
0
    offset += 4;
407
408
0
    proto_tree_add_item(tree, hf_rail_notify_message, tvb, offset, 4, ENC_LITTLE_ENDIAN);
409
0
    break;
410
0
  case TS_RAIL_ORDER_WINDOWMOVE:
411
0
    proto_tree_add_item(tree, hf_rail_windowmove_left, tvb, offset, 2, ENC_LITTLE_ENDIAN);
412
0
    offset += 2;
413
0
    proto_tree_add_item(tree, hf_rail_windowmove_top, tvb, offset, 2, ENC_LITTLE_ENDIAN);
414
0
    offset += 2;
415
0
    proto_tree_add_item(tree, hf_rail_windowmove_right, tvb, offset, 2, ENC_LITTLE_ENDIAN);
416
0
    offset += 2;
417
0
    proto_tree_add_item(tree, hf_rail_windowmove_bottom, tvb, offset, 2, ENC_LITTLE_ENDIAN);
418
0
    break;
419
0
  case TS_RAIL_ORDER_LOCALMOVESIZE:
420
0
    proto_tree_add_item(tree, hf_rail_localmovesize_isMoveSizeStart, tvb, offset, 2, ENC_LITTLE_ENDIAN);
421
0
    offset += 2;
422
0
    proto_tree_add_item(tree, hf_rail_localmovesize_moveSizeType, tvb, offset, 2, ENC_LITTLE_ENDIAN);
423
0
    offset += 2;
424
0
    proto_tree_add_item(tree, hf_rail_localmovesize_posX, tvb, offset, 2, ENC_LITTLE_ENDIAN);
425
0
    offset += 2;
426
0
    proto_tree_add_item(tree, hf_rail_localmovesize_posY, tvb, offset, 2, ENC_LITTLE_ENDIAN);
427
0
    break;
428
0
  case TS_RAIL_ORDER_MINMAXINFO:
429
0
    proto_tree_add_item(tree, hf_rail_minmaxinfo_maxwidth, tvb, offset, 2, ENC_LITTLE_ENDIAN);
430
0
    offset += 2;
431
0
    proto_tree_add_item(tree, hf_rail_minmaxinfo_maxheight, tvb, offset, 2, ENC_LITTLE_ENDIAN);
432
0
    offset += 2;
433
0
    proto_tree_add_item(tree, hf_rail_minmaxinfo_maxPosX, tvb, offset, 2, ENC_LITTLE_ENDIAN);
434
0
    offset += 2;
435
0
    proto_tree_add_item(tree, hf_rail_minmaxinfo_maxPosY, tvb, offset, 2, ENC_LITTLE_ENDIAN);
436
0
    offset += 2;
437
0
    proto_tree_add_item(tree, hf_rail_minmaxinfo_minTrackWidth, tvb, offset, 2, ENC_LITTLE_ENDIAN);
438
0
    offset += 2;
439
0
    proto_tree_add_item(tree, hf_rail_minmaxinfo_minTrackHeight, tvb, offset, 2, ENC_LITTLE_ENDIAN);
440
0
    offset += 2;
441
0
    proto_tree_add_item(tree, hf_rail_minmaxinfo_maxTrackWidth, tvb, offset, 2, ENC_LITTLE_ENDIAN);
442
0
    offset += 2;
443
0
    proto_tree_add_item(tree, hf_rail_minmaxinfo_maxTrackHeight, tvb, offset, 2, ENC_LITTLE_ENDIAN);
444
0
    break;
445
0
  case TS_RAIL_ORDER_CLIENTSTATUS: {
446
0
    int *flags[] = {
447
0
      &hf_rail_cstatus_flags_allowlocalmove,
448
0
      &hf_rail_cstatus_autoreconnect,
449
0
      &hf_rail_cstatus_zorder_sync,
450
0
      &hf_rail_cstatus_resize_margin,
451
0
      &hf_rail_cstatus_hidpi_icons,
452
0
      &hf_rail_cstatus_appbar_remoting,
453
0
      &hf_rail_cstatus_powerdisplay,
454
0
      &hf_rail_cstatus_bidir_cloak,
455
0
      &hf_rail_cstatus_suppress_icon_border,
456
0
      NULL,
457
0
    };
458
459
0
    proto_tree_add_bitmask(tree, tvb, offset, hf_rail_cstatus_flags, ett_rdp_rail_clientstatus_flags, flags, ENC_LITTLE_ENDIAN);
460
0
    break;
461
0
  }
462
0
  case TS_RAIL_ORDER_SYSMENU:
463
0
  case TS_RAIL_ORDER_LANGBARINFO:
464
0
  case TS_RAIL_ORDER_EXEC_RESULT:
465
0
  case TS_RAIL_ORDER_GET_APPID_REQ:
466
0
  case TS_RAIL_ORDER_GET_APPID_RESP:
467
0
  case TS_RAIL_ORDER_TASKBARINFO:
468
0
  case TS_RAIL_ORDER_LANGUAGEIMEINFO:
469
0
  case TS_RAIL_ORDER_COMPARTMENTINFO:
470
0
    break;
471
0
  case TS_RAIL_ORDER_HANDSHAKE_EX: {
472
0
    int *flags[] = {
473
0
      &hf_rail_handshake_flags_hidef,
474
0
      &hf_rail_handshake_flags_ex_spi,
475
0
      &hf_rail_handshake_flags_snap,
476
0
      &hf_rail_handshake_flags_textscale,
477
0
      &hf_rail_handshake_flags_caretblink,
478
0
      &hf_rail_handshake_flags_ex_spi2,
479
0
      NULL,
480
0
    };
481
482
0
    proto_tree_add_item(tree, hf_rail_caps_handshake_buildNumber, tvb, offset, 4, ENC_LITTLE_ENDIAN);
483
0
    offset += 4;
484
485
0
    proto_tree_add_bitmask(tree, tvb, offset, hf_rail_handshake_flags, ett_rdp_rail_handshake_flags, flags, ENC_LITTLE_ENDIAN);
486
0
    break;
487
0
  }
488
0
  case TS_RAIL_ORDER_ZORDER_SYNC:
489
0
    break;
490
0
  case TS_RAIL_ORDER_CLOAK:
491
0
    proto_tree_add_item(tree, hf_rail_cloak_cloaked, tvb, offset, 1, ENC_LITTLE_ENDIAN);
492
0
    break;
493
0
  case TS_RAIL_ORDER_POWER_DISPLAY_REQUEST:
494
0
  case TS_RAIL_ORDER_SNAP_ARRANGE:
495
0
  case TS_RAIL_ORDER_GET_APPID_RESP_EX:
496
0
  case TS_RAIL_ORDER_TEXTSCALEINFO:
497
0
  case TS_RAIL_ORDER_CARETBLINKINFO:
498
0
    break;
499
0
  case TS_RAIL_ORDER_ZORDER_BODY:
500
0
    offset += 4 * 3;
501
0
    proto_tree_add_item_ret_uint(tree, hf_rail_windowId, tvb, offset, 4, ENC_LITTLE_ENDIAN, &windowId);
502
0
    col_append_fstr(pinfo->cinfo, COL_INFO, "|windowId=0x%x", windowId);
503
0
    break;
504
0
  default:
505
0
    break;
506
0
  }
507
508
0
  offset = nextOffset;
509
0
  return offset;
510
0
}
511
512
513
15
void proto_register_rdp_rail(void) {
514
15
  static hf_register_info hf[] = {
515
15
    { &hf_rail_orderType,
516
15
      { "OrderType", "rdp_rail.ordertype",
517
15
        FT_UINT16, BASE_HEX, VALS(rdp_rail_order_vals), 0x0,
518
15
      NULL, HFILL }
519
15
    },
520
15
    { &hf_rail_pduLength,
521
15
      { "OrderLength", "rdp_rail.orderlength",
522
15
      FT_UINT32, BASE_DEC, NULL, 0x0,
523
15
      NULL, HFILL }
524
15
    },
525
15
    { &hf_rail_caps_handshake_buildNumber,
526
15
      { "Build number", "rdp_rail.handshake.buildNumber",
527
15
      FT_UINT32, BASE_HEX, NULL, 0x0,
528
15
      NULL, HFILL }
529
15
    },
530
15
    { &hf_rail_windowId,
531
15
      { "WindowId", "rdp_rail.windowid",
532
15
      FT_UINT32, BASE_HEX, NULL, 0x0,
533
15
      NULL, HFILL }
534
15
    },
535
15
    { &hf_rail_windowmove_left,
536
15
      { "Left", "rdp_rail.windowmove.left",
537
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
538
15
      NULL, HFILL }
539
15
    },
540
15
    { &hf_rail_windowmove_top,
541
15
      { "Top", "rdp_rail.windowmove.top",
542
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
543
15
      NULL, HFILL }
544
15
    },
545
15
    { &hf_rail_windowmove_right,
546
15
      { "Right", "rdp_rail.windowmove.right",
547
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
548
15
      NULL, HFILL }
549
15
    },
550
15
    { &hf_rail_windowmove_bottom,
551
15
      { "Bottom", "rdp_rail.windowmove.bottom",
552
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
553
15
      NULL, HFILL }
554
15
    },
555
15
    { &hf_rail_localmovesize_isMoveSizeStart,
556
15
      { "IsMoveSizeStart", "rdp_rail.localmovesize.ismovesizestart",
557
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
558
15
      NULL, HFILL }
559
15
    },
560
15
    { &hf_rail_localmovesize_moveSizeType,
561
15
      { "Move size type", "rdp_rail.localmovesize.movesizetype",
562
15
      FT_UINT16, BASE_DEC, VALS(moveSizeStart_vals), 0x0,
563
15
      NULL, HFILL }
564
15
    },
565
15
    { &hf_rail_localmovesize_posX,
566
15
      { "PosX", "rdp_rail.localmovesize.posx",
567
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
568
15
      NULL, HFILL }
569
15
    },
570
15
    { &hf_rail_localmovesize_posY,
571
15
      { "PosY", "rdp_rail.localmovesize.posy",
572
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
573
15
      NULL, HFILL }
574
15
    },
575
15
    { &hf_rail_minmaxinfo_maxwidth,
576
15
      { "Max width", "rdp_rail.minmaxinfo.maxwidth",
577
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
578
15
      NULL, HFILL }
579
15
    },
580
15
    { &hf_rail_minmaxinfo_maxheight,
581
15
      { "Max height", "rdp_rail.minmaxinfo.maxheight",
582
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
583
15
      NULL, HFILL }
584
15
    },
585
15
    { &hf_rail_minmaxinfo_maxPosX,
586
15
      { "Max posX", "rdp_rail.minmaxinfo.maxposx",
587
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
588
15
      NULL, HFILL }
589
15
    },
590
15
    { &hf_rail_minmaxinfo_maxPosY,
591
15
      { "Max posY", "rdp_rail.minmaxinfo.maxposy",
592
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
593
15
      NULL, HFILL }
594
15
    },
595
15
    { &hf_rail_minmaxinfo_minTrackWidth,
596
15
      { "Min track width", "rdp_rail.minmaxinfo.mintrackwidth",
597
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
598
15
      NULL, HFILL }
599
15
    },
600
15
    { &hf_rail_minmaxinfo_minTrackHeight,
601
15
      { "Min track height", "rdp_rail.minmaxinfo.mintrackheight",
602
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
603
15
      NULL, HFILL }
604
15
    },
605
15
    { &hf_rail_minmaxinfo_maxTrackWidth,
606
15
      { "Max track width", "rdp_rail.minmaxinfo.maxtrackwidth",
607
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
608
15
      NULL, HFILL }
609
15
    },
610
15
    { &hf_rail_minmaxinfo_maxTrackHeight,
611
15
      { "Max track height", "rdp_rail.minmaxinfo.maxtrackheight",
612
15
      FT_UINT16, BASE_DEC, NULL, 0x0,
613
15
      NULL, HFILL }
614
15
    },
615
15
    { &hf_rail_cloak_cloaked,
616
15
      { "Cloaked", "rdp_rail.cloak.cloaked",
617
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
618
15
      NULL, HFILL }
619
15
    },
620
621
15
    { &hf_rail_handshake_flags,
622
15
      { "Flags", "rdp_rail.handshakeflags",
623
15
      FT_UINT32, BASE_HEX, NULL, 0,
624
15
      NULL, HFILL }},
625
15
    { &hf_rail_handshake_flags_hidef,
626
15
      { "HIDEF", "rdp_rail.handshakeflags.hidef",
627
15
      FT_UINT32, BASE_HEX, NULL, 0x00000001,
628
15
      NULL, HFILL }},
629
15
    { &hf_rail_handshake_flags_ex_spi,
630
15
      { "EXTENDED_SPI_SUPPORTED", "rdp_rail.handshakeflags.exspi",
631
15
      FT_UINT32, BASE_HEX, NULL, 0x00000002,
632
15
      NULL, HFILL }},
633
15
    { &hf_rail_handshake_flags_snap,
634
15
      { "SNAP_ARRANGE_SUPPORTED", "rdp_rail.handshakeflags.snap",
635
15
      FT_UINT32, BASE_HEX, NULL, 0x00000004,
636
15
      NULL, HFILL }},
637
15
    { &hf_rail_handshake_flags_textscale,
638
15
      { "TEXT_SCALE_SUPPORTED", "rdp_rail.handshakeflags.textscale",
639
15
      FT_UINT32, BASE_HEX, NULL, 0x00000008,
640
15
      NULL, HFILL }},
641
15
    { &hf_rail_handshake_flags_caretblink,
642
15
      { "CARET_BLINK_SUPPORTED", "rdp_rail.handshakeflags.caretblink",
643
15
      FT_UINT32, BASE_HEX, NULL, 0x00000010,
644
15
      NULL, HFILL }},
645
15
    { &hf_rail_handshake_flags_ex_spi2,
646
15
      { "EXTENDED_SPI_2_SUPPORTED", "rdp_rail.handshakeflags.exspi2",
647
15
      FT_UINT32, BASE_HEX, NULL, 0x00000020,
648
15
      NULL, HFILL }},
649
650
15
    { &hf_rail_cstatus_flags,
651
15
      { "Flags", "rdp_rail.clientstatus.flags",
652
15
      FT_UINT32, BASE_HEX, NULL, 0x0,
653
15
      NULL, HFILL }},
654
15
    { &hf_rail_cstatus_flags_allowlocalmove,
655
15
      { "ALLOWLOCALMOVESIZE", "rdp_rail.clientstatus.allowlocalmove",
656
15
      FT_UINT32, BASE_HEX, NULL, 0x00000001,
657
15
      NULL, HFILL }},
658
15
    { &hf_rail_cstatus_autoreconnect,
659
15
      { "AUTORECONNECT", "rdp_rail.clientstatus.autoreconnect",
660
15
      FT_UINT32, BASE_HEX, NULL, 0x00000002,
661
15
      NULL, HFILL }},
662
15
    { &hf_rail_cstatus_zorder_sync,
663
15
      { "ZORDER_SYNC", "rdp_rail.clientstatus.zordersync",
664
15
      FT_UINT32, BASE_HEX, NULL, 0x00000004,
665
15
      NULL, HFILL }},
666
15
    { &hf_rail_cstatus_resize_margin,
667
15
      { "WINDOW_RESIZE_MARGIN_SUPPORTED", "rdp_rail.clientstatus.resizemargin",
668
15
      FT_UINT32, BASE_HEX, NULL, 0x00000010,
669
15
      NULL, HFILL }},
670
15
    { &hf_rail_cstatus_hidpi_icons,
671
15
      { "HIGH_DPI_ICONS_SUPPORTED", "rdp_rail.clientstatus.highdpiicons",
672
15
      FT_UINT32, BASE_HEX, NULL, 0x00000020,
673
15
      NULL, HFILL }},
674
15
    { &hf_rail_cstatus_appbar_remoting,
675
15
      { "APPBAR_REMOTING_SUPPORTED", "rdp_rail.clientstatus.appbarremoting",
676
15
      FT_UINT32, BASE_HEX, NULL, 0x00000040,
677
15
      NULL, HFILL }},
678
15
    { &hf_rail_cstatus_powerdisplay,
679
15
      { "POWER_DISPLAY_REQUEST_SUPPORTED", "rdp_rail.clientstatus.powerdisplay",
680
15
      FT_UINT32, BASE_HEX, NULL, 0x00000080,
681
15
      NULL, HFILL }},
682
15
    { &hf_rail_cstatus_bidir_cloak,
683
15
      { "BIDIRECTIONAL_CLOAK_SUPPORTED", "rdp_rail.clientstatus.bidircloak",
684
15
      FT_UINT32, BASE_HEX, NULL, 0x00000200,
685
15
      NULL, HFILL }},
686
15
    { &hf_rail_cstatus_suppress_icon_border,
687
15
      { "SUPPRESS_ICON_ORDERS", "rdp_rail.clientstatus.suppressiconborder",
688
15
      FT_UINT32, BASE_HEX, NULL, 0x00000400,
689
15
      NULL, HFILL }},
690
15
    { &hf_rail_activate_enabled,
691
15
      { "Enabled", "rdp_rail.activate.enabled",
692
15
      FT_UINT8, BASE_DEC, NULL, 0x0,
693
15
      NULL, HFILL }},
694
695
15
    { &hf_rail_notify_iconId,
696
15
      { "IconId", "rdp_rail.notify.iconid",
697
15
      FT_UINT32, BASE_HEX, NULL, 0x0,
698
15
      NULL, HFILL }},
699
15
    { &hf_rail_notify_message,
700
15
      { "Message", "rdp_rail.notify.message",
701
15
      FT_UINT32, BASE_HEX, VALS(rdp_rail_notify_vals), 0x0,
702
15
      NULL, HFILL }},
703
704
15
    { &hf_rail_sysparam_server_params,
705
15
      { "SystemParameter", "rdp_rail.sysparam.serverparameter",
706
15
      FT_UINT32, BASE_HEX, VALS(rdp_rail_server_system_params_vals), 0x0,
707
15
      NULL, HFILL }},
708
709
15
    { &hf_rail_sysparam_client_params,
710
15
      { "SystemParameter", "rdp_rail.sysparam.clientparameter",
711
15
      FT_UINT32, BASE_HEX, VALS(rdp_rail_client_system_params_vals), 0x0,
712
15
      NULL, HFILL }},
713
714
715
15
  };
716
717
15
  static int *ett[] = {
718
15
    &ett_rdp_rail,
719
15
    &ett_rdp_rail_handshake_flags,
720
15
    &ett_rdp_rail_clientstatus_flags,
721
15
  };
722
723
15
  proto_rdp_rail = proto_register_protocol("RDP Program virtual channel Protocol", "RAIL", "rdp_rail");
724
725
  /* Register fields and subtrees */
726
15
  proto_register_field_array(proto_rdp_rail, hf, array_length(hf));
727
15
  proto_register_subtree_array(ett, array_length(ett));
728
729
15
  register_dissector("rdp_rail", dissect_rdp_rail, proto_rdp_rail);
730
15
}
731
732
15
void proto_reg_handoff_rdp_rail(void) {
733
15
}