forked from osmocom/wireshark
* X11 dissector:
- in decoding of replies: 0 is not an unknown opcode, it means that the request was unseen or that the opcode of the request is unknown (e.g. due to unseen / undecoded QueryExtension replies) - add special processing for QueryExtension requests & replies in order to store new opcodes in a value_string of opcodes saved per conversation - try to resynchronize sequence number once at first reply if no initial connection request was seen - add decoding of SendEvent request - add decoding of many replies (AllocColor, GetInputFocus, GetGeometry, GetPointerControl, GetScreenSaver, GetSelectionOwner, GrabKeyboard, GrabPointer, InternAtom, ListProperties, LookupColor, QueryBestSize, QueryKeymap, QueryPointer, TranslateCoordinates) - fix decoding of EnterNotify / LeaveNotify events - add decoding of most events (FocusIn, FocusOut, Expose, GraphicsExpose, NoExpose, VisibilityNotify, CreateNotify, DestroyNotify, UnmapNotify, MapNotify, MapRequest, ReparentNotify, ConfigureNotify, GravityNotify, ResizeRequest, CirculateNotify, CirculateRequest, PropertyNotify, SelectionClear, SelectionRequest, SelectionNotify, ColormapNotify, ClientMessage) - miscellaneous changes & code cleaning svn path=/trunk/; revision=10442
This commit is contained in:
parent
516d177e55
commit
cc598d0484
1
AUTHORS
1
AUTHORS
|
@ -48,6 +48,7 @@ Laurent Deniel <laurent.deniel[AT]free.fr> {
|
|||
Ability to mark the frames and associated features
|
||||
"Protocol Properties..." menu item
|
||||
Ring buffer rework
|
||||
X11 decoding enhancements and fixes
|
||||
Miscellaneous enhancements and fixes
|
||||
}
|
||||
|
||||
|
|
675
packet-x11.c
675
packet-x11.c
|
@ -3,7 +3,7 @@
|
|||
* Copyright 2000, Christophe Tronche <ch.tronche@computer.org>
|
||||
* Copyright 2003, Michael Shuldman
|
||||
*
|
||||
* $Id: packet-x11.c,v 1.55 2004/02/25 23:12:49 guy Exp $
|
||||
* $Id: packet-x11.c,v 1.56 2004/03/22 22:53:56 deniel Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -76,9 +76,10 @@
|
|||
* the initial connection request, and the byte order of the connection.
|
||||
*
|
||||
* An opcode of -3 means we haven't yet seen any requests yet.
|
||||
* An opcode of -2 means we're not expecting a reply.
|
||||
* An opcode of -1 means means we're waiting for a reply to the initial
|
||||
* An opcode of -2 means we're not expecting a reply (unused).
|
||||
* An opcode of -1 means we're waiting for a reply to the initial
|
||||
* connection request.
|
||||
* An opcode of 0 means the request was not seen (or unknown).
|
||||
* Other values are the opcode of the request for which we're expecting
|
||||
* a reply.
|
||||
*
|
||||
|
@ -86,6 +87,9 @@
|
|||
#define NOTHING_SEEN -3
|
||||
#define NOTHING_EXPECTED -2
|
||||
#define INITIAL_CONN -1
|
||||
#define UNKNOWN_OPCODE 0
|
||||
|
||||
#define MAX_OPCODES (255 + 1) /* 255 + INITIAL_CONN */
|
||||
|
||||
#define BYTE_ORDER_BE 0
|
||||
#define BYTE_ORDER_LE 1
|
||||
|
@ -119,16 +123,20 @@ Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask };
|
|||
#define NoSymbol 0L /* special KeySym */
|
||||
|
||||
typedef struct {
|
||||
GHashTable *seqtable; /* hashtable of sequncenumber <-> opcode. */
|
||||
GHashTable *seqtable; /* hashtable of sequencenumber <-> opcode. */
|
||||
GHashTable *valtable;/* hashtable of sequencenumber <-> &opcode_vals */
|
||||
/* major opcodes including extensions (NULL terminated) */
|
||||
value_string opcode_vals[MAX_OPCODES+1];
|
||||
int sequencenumber; /* sequencenumber of current packet. */
|
||||
guint32 iconn_frame; /* frame # of initial connection request */
|
||||
guint32 iconn_reply; /* frame # of initial connection reply */
|
||||
int byte_order; /* byte order of connection */
|
||||
gboolean resync; /* resynchronization of sequence number performed */
|
||||
|
||||
int *keycodemap[256]; /* keycode to keysymvalue map. */
|
||||
int keysyms_per_keycode;
|
||||
int first_keycode;
|
||||
int *modifiermap[array_length(modifiers)];/* modifier to keycode. */
|
||||
int *modifiermap[array_length(modifiers)];/* modifier to keycode.*/
|
||||
int keycodes_per_modifier;
|
||||
|
||||
union {
|
||||
|
@ -367,18 +375,39 @@ static const value_string close_down_mode_vals[] = {
|
|||
{ 0, NULL }
|
||||
};
|
||||
|
||||
static const value_string colormap_state_vals[] = {
|
||||
{ 0, "Uninstalled" },
|
||||
{ 1, "Installed" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
static const value_string coordinate_mode_vals[] = {
|
||||
{ 0, "Origin" },
|
||||
{ 1, "Previous" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
static const value_string destination_vals[] = {
|
||||
{ 0, "PointerWindow" },
|
||||
{ 1, "InputFocus" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
static const value_string direction_vals[] = {
|
||||
{ 0, "RaiseLowest" },
|
||||
{ 1, "LowerHighest" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
static const value_string event_detail_vals[] = {
|
||||
{ 0, "Ancestor" },
|
||||
{ 1, "Virtual" },
|
||||
{ 2, "Inferior" },
|
||||
{ 3, "Nonlinear" },
|
||||
{ 4, "NonlinearVirtual" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
#define FAMILY_INTERNET 0
|
||||
#define FAMILY_DECNET 1
|
||||
#define FAMILY_CHAOS 2
|
||||
|
@ -404,6 +433,26 @@ static const value_string fill_style_vals[] = {
|
|||
{ 0, NULL }
|
||||
};
|
||||
|
||||
static const value_string focus_detail_vals[] = {
|
||||
{ 0, "Ancestor" },
|
||||
{ 1, "Virtual" },
|
||||
{ 2, "Inferior" },
|
||||
{ 3, "Nonlinear" },
|
||||
{ 4, "NonlinearVirtual" },
|
||||
{ 5, "Pointer" },
|
||||
{ 6, "PointerRoot" },
|
||||
{ 7, "None" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
static const value_string focus_mode_vals[] = {
|
||||
{ 0, "Normal" },
|
||||
{ 1, "Grab" },
|
||||
{ 2, "Ungrab" },
|
||||
{ 3, "WhileGrabbed" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
static const value_string focus_vals[] = {
|
||||
{ 0, "None" },
|
||||
{ 1, "PointerRoot" },
|
||||
|
@ -430,6 +479,22 @@ static const value_string function_vals[] = {
|
|||
{ 0, NULL }
|
||||
};
|
||||
|
||||
static const value_string grab_mode_vals[] = {
|
||||
{ 0, "Normal" },
|
||||
{ 1, "Grab" },
|
||||
{ 2, "Ungrab" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
static const value_string grab_status_vals[] = {
|
||||
{ 0, "Success" },
|
||||
{ 1, "AlreadyGrabbed" },
|
||||
{ 2, "InvalidTime" },
|
||||
{ 3, "NotViewable" },
|
||||
{ 4, "Frozen" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
static const value_string gravity_vals[] = {
|
||||
{ 1, "NorthWest" },
|
||||
{ 2, "North" },
|
||||
|
@ -491,6 +556,25 @@ static const value_string on_off_vals[] = {
|
|||
{ 0, NULL }
|
||||
};
|
||||
|
||||
static const value_string place_vals[] = {
|
||||
{ 0, "Top" },
|
||||
{ 1, "Bottom" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
static const value_string property_state_vals[] = {
|
||||
{ 0, "NewValue" },
|
||||
{ 1, "Deleted" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
static const value_string visibility_state_vals[] = {
|
||||
{ 0, "Unobscured" },
|
||||
{ 1, "PartiallyObscured" },
|
||||
{ 2, "FullyObscured" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
/* Requestcodes. From <X11/Xproto.h>. */
|
||||
#define X_CreateWindow 1
|
||||
#define X_ChangeWindowAttributes 2
|
||||
|
@ -612,6 +696,8 @@ static const value_string on_off_vals[] = {
|
|||
#define X_SetModifierMapping 118
|
||||
#define X_GetModifierMapping 119
|
||||
#define X_NoOperation 127
|
||||
#define X_FirstExtension 128
|
||||
#define X_LastExtension 255
|
||||
|
||||
static const value_string opcode_vals[] = {
|
||||
{ INITIAL_CONN, "Initial connection request" },
|
||||
|
@ -639,7 +725,7 @@ static const value_string opcode_vals[] = {
|
|||
{ X_SetSelectionOwner, "SetSelectionOwner" },
|
||||
{ X_GetSelectionOwner, "GetSelectionOwner" },
|
||||
{ X_ConvertSelection, "ConvertSelection" },
|
||||
/* { X_SendEvent, "SendEvent" }, */
|
||||
{ X_SendEvent, "SendEvent" },
|
||||
{ X_GrabPointer, "GrabPointer" },
|
||||
{ X_UngrabPointer, "UngrabPointer" },
|
||||
{ X_GrabButton, "GrabButton" },
|
||||
|
@ -772,6 +858,8 @@ static const value_string opcode_vals[] = {
|
|||
#define ColormapNotify 32
|
||||
#define ClientMessage 33
|
||||
#define MappingNotify 34
|
||||
#define FirstExtensionEvent 64
|
||||
#define LastExtensionEvent 127
|
||||
|
||||
static const value_string eventcode_vals[] = {
|
||||
{ KeyPress, "KeyPress" },
|
||||
|
@ -1058,6 +1146,7 @@ keysyms_per_keycode) {\
|
|||
#define SETofEVENT(name) { setOfEvent(tvb, offsetp, t, little_endian); }
|
||||
#define SETofDEVICEEVENT(name) { setOfDeviceEvent(tvb, offsetp, t, little_endian);}
|
||||
#define SETofKEYMASK(name) { setOfKeyButMask(tvb, offsetp, t, little_endian, 0); }
|
||||
#define SETofKEYBUTMASK(name) { setOfKeyButMask(tvb, offsetp, t, little_endian, 1); }
|
||||
#define SETofPOINTEREVENT(name) { setOfPointerEvent(tvb, offsetp, t, little_endian); }
|
||||
#define STRING8(name, length) { string8(tvb, offsetp, t, hf_x11_##name, length); }
|
||||
#define STRING16(name, length) { string16(tvb, offsetp, t, hf_x11_##name, hf_x11_##name##_bytes, length, little_endian); }
|
||||
|
@ -1094,7 +1183,7 @@ keysyms_per_keycode) {\
|
|||
*offsetp, sizeof(seqno), seqno, \
|
||||
"sequencenumber: %d (%s)", \
|
||||
(int)seqno, \
|
||||
val_to_str(opcode, opcode_vals, "<Unknown opcode %d>")); \
|
||||
val_to_str(opcode, state->opcode_vals, "<Unknown opcode %d>")); \
|
||||
*offsetp += sizeof(seqno); \
|
||||
} while (0)
|
||||
|
||||
|
@ -2802,7 +2891,7 @@ static void dissect_x11_initial_conn(tvbuff_t *tvb, packet_info *pinfo,
|
|||
*/
|
||||
state->sequencenumber = 0;
|
||||
g_hash_table_insert(state->seqtable, (int *)state->sequencenumber,
|
||||
(int *)INITIAL_CONN);
|
||||
(int *)INITIAL_CONN);
|
||||
}
|
||||
|
||||
static void dissect_x11_initial_reply(tvbuff_t *tvb, packet_info *pinfo,
|
||||
|
@ -2868,11 +2957,12 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo,
|
|||
int next_offset;
|
||||
proto_item *ti;
|
||||
proto_tree *t;
|
||||
int length, opcode;
|
||||
int length, opcode, i;
|
||||
guint8 v8, v8_2, v8_3;
|
||||
guint16 v16;
|
||||
guint32 v32;
|
||||
gint left;
|
||||
gchar *name;
|
||||
|
||||
length = VALUE16(tvb, 2) * 4;
|
||||
|
||||
|
@ -2893,16 +2983,47 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo,
|
|||
|
||||
if (check_col(pinfo->cinfo, COL_INFO))
|
||||
col_append_fstr(pinfo->cinfo, COL_INFO, "%s %s", sep,
|
||||
val_to_str(opcode, opcode_vals, "<Unknown opcode %d>"));
|
||||
val_to_str(opcode, state->opcode_vals,
|
||||
"<Unknown opcode %d>"));
|
||||
|
||||
proto_item_append_text(ti, ", Request, opcode: %d (%s)",
|
||||
opcode, val_to_str(opcode, opcode_vals,
|
||||
"<Unknown opcode %d>"));
|
||||
opcode, val_to_str(opcode, state->opcode_vals,
|
||||
"<Unknown opcode %d>"));
|
||||
|
||||
/*
|
||||
* Does this request expect a reply?
|
||||
*/
|
||||
switch(opcode) {
|
||||
|
||||
case X_QueryExtension:
|
||||
|
||||
/* necessary processing even if tree == NULL */
|
||||
|
||||
v16 = VALUE16(tvb, 4);
|
||||
name = g_malloc(v16 + 1);
|
||||
stringCopy(name, tvb_get_ptr(tvb, 8, v16), v16);
|
||||
|
||||
/* store string of extension, opcode will be set at reply */
|
||||
i = 0;
|
||||
while(i < MAX_OPCODES) {
|
||||
if (state->opcode_vals[i].strptr == NULL) {
|
||||
state->opcode_vals[i].strptr = name;
|
||||
g_hash_table_insert(state->valtable,
|
||||
(int *)state->sequencenumber,
|
||||
(int *)&state->opcode_vals[i]);
|
||||
break;
|
||||
} else if (strcmp(state->opcode_vals[i].strptr,
|
||||
name) == 0) {
|
||||
g_hash_table_insert(state->valtable,
|
||||
(int *)state->sequencenumber,
|
||||
(int *)&state->opcode_vals[i]);
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
/* QueryExtension expects a reply, fall through */
|
||||
|
||||
case X_AllocColor:
|
||||
case X_AllocColorCells:
|
||||
case X_AllocColorPlanes:
|
||||
|
@ -2934,7 +3055,6 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo,
|
|||
case X_LookupColor:
|
||||
case X_QueryBestSize:
|
||||
case X_QueryColors:
|
||||
case X_QueryExtension:
|
||||
case X_QueryFont:
|
||||
case X_QueryKeymap:
|
||||
case X_QueryPointer:
|
||||
|
@ -2946,13 +3066,22 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo,
|
|||
/*
|
||||
* Those requests expect a reply.
|
||||
*/
|
||||
|
||||
g_hash_table_insert(state->seqtable,
|
||||
(int *)state->sequencenumber, (int *)opcode);
|
||||
(int *)state->sequencenumber,
|
||||
(int *)opcode);
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
/*
|
||||
* With Extension, we don't know, so assume there could be one
|
||||
*/
|
||||
if (opcode >= X_FirstExtension && opcode <= X_LastExtension) {
|
||||
g_hash_table_insert(state->seqtable,
|
||||
(int *)state->sequencenumber,
|
||||
(int *)opcode);
|
||||
}
|
||||
|
||||
/*
|
||||
* No reply is expected from any other request.
|
||||
*/
|
||||
|
@ -3123,6 +3252,14 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo,
|
|||
TIMESTAMP(time);
|
||||
break;
|
||||
|
||||
case X_SendEvent:
|
||||
BOOL(propagate);
|
||||
REQUEST_LENGTH();
|
||||
WINDOW(destination);
|
||||
SETofEVENT(event_mask);
|
||||
UNDECODED(32);
|
||||
break;
|
||||
|
||||
case X_GrabPointer:
|
||||
BOOL(owner_events);
|
||||
REQUEST_LENGTH();
|
||||
|
@ -4222,11 +4359,26 @@ static void
|
|||
x11_stateinit(x11_conv_data_t **state, conversation_t *conversation)
|
||||
{
|
||||
static x11_conv_data_t stateinit;
|
||||
int i = 0;
|
||||
|
||||
*state = g_mem_chunk_alloc(x11_state_chunk);
|
||||
**state = stateinit;
|
||||
|
||||
/* initialise opcodes */
|
||||
while (1) {
|
||||
if (opcode_vals[i].strptr == NULL) break;
|
||||
(*state)->opcode_vals[i].value = opcode_vals[i].value;
|
||||
(*state)->opcode_vals[i].strptr = opcode_vals[i].strptr;
|
||||
i++;
|
||||
}
|
||||
while (i <= MAX_OPCODES) {
|
||||
(*state)->opcode_vals[i].value = 0;
|
||||
(*state)->opcode_vals[i].strptr = NULL;
|
||||
i++;
|
||||
}
|
||||
|
||||
(*state)->seqtable = g_hash_table_new(g_direct_hash, g_direct_equal);
|
||||
(*state)->valtable = g_hash_table_new(g_direct_hash, g_direct_equal);
|
||||
g_hash_table_insert((*state)->seqtable, (int *)0, (int *)NOTHING_SEEN);
|
||||
(*state)->byte_order = BYTE_ORDER_UNKNOWN; /* don't know yet*/
|
||||
conversation_add_proto_data(conversation, proto_x11, *state);
|
||||
|
@ -4379,6 +4531,8 @@ dissect_x11_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
|||
gboolean little_endian)
|
||||
{
|
||||
int offset = 0, *offsetp = &offset, length, left, opcode;
|
||||
int major_opcode, sequence_number;
|
||||
value_string *vals_p;
|
||||
proto_item *ti;
|
||||
proto_tree *t;
|
||||
|
||||
|
@ -4394,8 +4548,9 @@ dissect_x11_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
|||
* 1) the request sequence number wraps in the lower 16
|
||||
* bits;
|
||||
*
|
||||
* 2) we don't see the initial connection request and thus
|
||||
* don't have the right sequence numbers;
|
||||
* 2) we don't see the initial connection request and the
|
||||
* resynchronization of sequence number fails and thus
|
||||
* don't have the right sequence numbers
|
||||
*
|
||||
* 3) we don't have all the packets in the capture and
|
||||
* get out of sequence.
|
||||
|
@ -4404,26 +4559,73 @@ dissect_x11_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
|||
* the most recent not-already-replied-to request in the same
|
||||
* connection. That also might mismatch replies to requests if
|
||||
* packets are lost, but there's nothing you can do to fix that.
|
||||
*
|
||||
* XXX - if "opcode" is 0, we shouldn't say "Unknown opcode",
|
||||
* we should say that we don't have the request for the reply.
|
||||
*/
|
||||
|
||||
sequence_number = VALUE16(tvb, offset + 2);
|
||||
opcode = (int)g_hash_table_lookup(state->seqtable,
|
||||
(int *)VALUE16(tvb, offset + 2));
|
||||
(int *)sequence_number);
|
||||
|
||||
if (check_col(pinfo->cinfo, COL_INFO))
|
||||
col_append_fstr(pinfo->cinfo, COL_INFO, "%s %s",
|
||||
sep,
|
||||
/*
|
||||
* don't print opcode value since if it's
|
||||
* unknown, we didn't know to save the
|
||||
* request opcode.
|
||||
*/
|
||||
val_to_str(opcode, opcode_vals, "<Unknown opcode %d>"));
|
||||
if (state->iconn_frame == 0 && state->resync == FALSE) {
|
||||
|
||||
proto_item_append_text(ti, ", Reply, opcode: %d (%s)",
|
||||
opcode, val_to_str(opcode, opcode_vals,
|
||||
"<Unknown opcode %d>"));
|
||||
/*
|
||||
* We don't see the initial connection request and no
|
||||
* resynchronization has been performed yet (first reply),
|
||||
* set the current sequence number to the one of the
|
||||
* current reply (this is only performed once).
|
||||
*/
|
||||
state->sequencenumber = sequence_number;
|
||||
state->resync = TRUE;
|
||||
}
|
||||
|
||||
if (opcode == UNKNOWN_OPCODE) {
|
||||
if (check_col(pinfo->cinfo, COL_INFO))
|
||||
col_append_fstr(pinfo->cinfo, COL_INFO,
|
||||
"%s to unknown request", sep);
|
||||
proto_item_append_text(ti, ", Reply to unknown request");
|
||||
} else {
|
||||
if (check_col(pinfo->cinfo, COL_INFO))
|
||||
col_append_fstr(pinfo->cinfo, COL_INFO, "%s %s",
|
||||
sep,
|
||||
val_to_str(opcode, state->opcode_vals,
|
||||
"<Unknown opcode %d>"));
|
||||
|
||||
proto_item_append_text(ti, ", Reply, opcode: %d (%s)",
|
||||
opcode, val_to_str(opcode,
|
||||
state->opcode_vals,
|
||||
"<Unknown opcode %d>"));
|
||||
}
|
||||
|
||||
switch (opcode) {
|
||||
|
||||
/*
|
||||
* Replies that need special processing outside tree
|
||||
*/
|
||||
|
||||
case X_QueryExtension:
|
||||
|
||||
/*
|
||||
* if extension is present and request is known:
|
||||
* store opcode of extension in value_string of
|
||||
* opcodes
|
||||
*/
|
||||
if (!VALUE8(tvb, offset + 8)) {
|
||||
/* not present */
|
||||
break;
|
||||
}
|
||||
|
||||
vals_p = g_hash_table_lookup(state->valtable,
|
||||
(int *)sequence_number);
|
||||
if (vals_p != NULL) {
|
||||
major_opcode = VALUE8(tvb, offset + 9);
|
||||
vals_p->value = major_opcode;
|
||||
g_hash_table_remove(state->valtable,
|
||||
(int *)sequence_number);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (tree == NULL)
|
||||
return;
|
||||
|
@ -4431,12 +4633,39 @@ dissect_x11_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
|||
switch (opcode) {
|
||||
/*
|
||||
* Requests that expect a reply.
|
||||
*/
|
||||
*/
|
||||
|
||||
case X_GetWindowAttributes:
|
||||
REPLYCONTENTS_COMMON();
|
||||
break;
|
||||
|
||||
case X_GetGeometry:
|
||||
REPLY(reply);
|
||||
CARD8(depth);
|
||||
SEQUENCENUMBER_REPLY(sequencenumber);
|
||||
REPLYLENGTH(replylength);
|
||||
WINDOW(rootwindow);
|
||||
INT16(x);
|
||||
INT16(y);
|
||||
CARD16(width);
|
||||
CARD16(height);
|
||||
CARD16(border_width);
|
||||
UNUSED(10);
|
||||
break;
|
||||
|
||||
case X_QueryTree:
|
||||
REPLYCONTENTS_COMMON();
|
||||
break;
|
||||
|
||||
case X_InternAtom:
|
||||
REPLY(reply);
|
||||
UNUSED(1);
|
||||
SEQUENCENUMBER_REPLY(sequencenumber);
|
||||
REPLYLENGTH(replylength);
|
||||
ATOM(atom);
|
||||
UNUSED(20);
|
||||
break;
|
||||
|
||||
case X_GetAtomName:
|
||||
REPLYCONTENTS_COMMON();
|
||||
break;
|
||||
|
@ -4453,48 +4682,187 @@ dissect_x11_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
|||
break;
|
||||
|
||||
case X_ListProperties:
|
||||
REPLY(reply);
|
||||
UNUSED(1);
|
||||
SEQUENCENUMBER_REPLY(sequencenumber);
|
||||
REPLYLENGTH(replylength);
|
||||
length = CARD16(property_number);
|
||||
UNUSED(22);
|
||||
LISTofATOM(properties, length*4);
|
||||
break;
|
||||
|
||||
case X_GetSelectionOwner:
|
||||
REPLY(reply);
|
||||
UNUSED(1);
|
||||
SEQUENCENUMBER_REPLY(sequencenumber);
|
||||
REPLYLENGTH(replylength);
|
||||
WINDOW(owner);
|
||||
UNUSED(20);
|
||||
break;
|
||||
|
||||
case X_GrabPointer:
|
||||
case X_GrabKeyboard:
|
||||
REPLY(reply);
|
||||
ENUM8(grab_status);
|
||||
SEQUENCENUMBER_REPLY(sequencenumber);
|
||||
REPLYLENGTH(replylength);
|
||||
UNUSED(24);
|
||||
break;
|
||||
|
||||
case X_QueryPointer:
|
||||
REPLY(reply);
|
||||
BOOL(same_screen);
|
||||
SEQUENCENUMBER_REPLY(sequencenumber);
|
||||
REPLYLENGTH(replylength);
|
||||
WINDOW(rootwindow);
|
||||
WINDOW(childwindow);
|
||||
INT16(root_x);
|
||||
INT16(root_y);
|
||||
INT16(win_x);
|
||||
INT16(win_y);
|
||||
SETofKEYBUTMASK(mask);
|
||||
UNUSED(6);
|
||||
break;
|
||||
|
||||
case X_GetMotionEvents:
|
||||
case X_TranslateCoords:
|
||||
REPLYCONTENTS_COMMON();
|
||||
break;
|
||||
|
||||
case X_TranslateCoords:
|
||||
REPLY(reply);
|
||||
BOOL(same_screen);
|
||||
SEQUENCENUMBER_REPLY(sequencenumber);
|
||||
REPLYLENGTH(replylength);
|
||||
WINDOW(childwindow);
|
||||
INT16(dst_x);
|
||||
INT16(dst_y);
|
||||
UNUSED(16);
|
||||
break;
|
||||
|
||||
case X_GetInputFocus:
|
||||
REPLY(reply);
|
||||
ENUM8(revert_to);
|
||||
SEQUENCENUMBER_REPLY(sequencenumber);
|
||||
REPLYLENGTH(replylength);
|
||||
WINDOW(focus);
|
||||
UNUSED(20);
|
||||
break;
|
||||
|
||||
case X_QueryKeymap:
|
||||
REPLY(reply);
|
||||
UNUSED(1);
|
||||
SEQUENCENUMBER_REPLY(sequencenumber);
|
||||
REPLYLENGTH(replylength);
|
||||
LISTofCARD8(keys, 32);
|
||||
break;
|
||||
|
||||
case X_QueryFont:
|
||||
case X_QueryTextExtents:
|
||||
case X_ListFonts:
|
||||
case X_GetImage:
|
||||
case X_ListInstalledColormaps:
|
||||
REPLYCONTENTS_COMMON();
|
||||
break;
|
||||
|
||||
case X_AllocColor:
|
||||
REPLY(reply);
|
||||
UNUSED(1);
|
||||
SEQUENCENUMBER_REPLY(sequencenumber);
|
||||
REPLYLENGTH(replylength);
|
||||
CARD16(red);
|
||||
CARD16(green);
|
||||
CARD16(blue);
|
||||
UNUSED(2);
|
||||
CARD32(pixel);
|
||||
UNUSED(12);
|
||||
break;
|
||||
|
||||
case X_QueryColors:
|
||||
REPLYCONTENTS_COMMON();
|
||||
break;
|
||||
|
||||
case X_LookupColor:
|
||||
REPLY(reply);
|
||||
UNUSED(1);
|
||||
SEQUENCENUMBER_REPLY(sequencenumber);
|
||||
REPLYLENGTH(replylength);
|
||||
CARD16(exact_red);
|
||||
CARD16(exact_green);
|
||||
CARD16(exact_blue);
|
||||
CARD16(visual_red);
|
||||
CARD16(visual_green);
|
||||
CARD16(visual_blue);
|
||||
UNUSED(12);
|
||||
break;
|
||||
|
||||
case X_QueryBestSize:
|
||||
REPLY(reply);
|
||||
UNUSED(1);
|
||||
SEQUENCENUMBER_REPLY(sequencenumber);
|
||||
REPLYLENGTH(replylength);
|
||||
CARD16(width);
|
||||
CARD16(height);
|
||||
UNUSED(20);
|
||||
break;
|
||||
|
||||
case X_QueryExtension:
|
||||
REPLY(reply);
|
||||
UNUSED(1);
|
||||
SEQUENCENUMBER_REPLY(sequencenumber);
|
||||
REPLYLENGTH(replylength);
|
||||
BOOL(present);
|
||||
CARD8(major_opcode);
|
||||
CARD8(first_event);
|
||||
CARD8(first_error);
|
||||
UNUSED(20);
|
||||
break;
|
||||
|
||||
case X_ListExtensions:
|
||||
REPLYCONTENTS_COMMON();
|
||||
break;
|
||||
|
||||
case X_GetKeyboardMapping:
|
||||
state->first_keycode
|
||||
= state->request.GetKeyboardMapping.first_keycode,
|
||||
state->first_keycode =
|
||||
state->request.GetKeyboardMapping.first_keycode;
|
||||
REPLY(reply);
|
||||
state->keysyms_per_keycode
|
||||
= FIELD8(keysyms_per_keycode);
|
||||
state->keysyms_per_keycode =
|
||||
FIELD8(keysyms_per_keycode);
|
||||
SEQUENCENUMBER_REPLY(sequencenumber);
|
||||
length = REPLYLENGTH(replylength);
|
||||
UNUSED(24);
|
||||
LISTofKEYSYM(keysyms, state->keycodemap,
|
||||
state->request.GetKeyboardMapping.first_keycode,
|
||||
length / state->keysyms_per_keycode,
|
||||
state->keysyms_per_keycode);
|
||||
state->request.GetKeyboardMapping.first_keycode,
|
||||
length / state->keysyms_per_keycode,
|
||||
state->keysyms_per_keycode);
|
||||
break;
|
||||
|
||||
case X_GetKeyboardControl:
|
||||
REPLYCONTENTS_COMMON();
|
||||
break;
|
||||
|
||||
case X_GetPointerControl:
|
||||
REPLY(reply);
|
||||
UNUSED(1);
|
||||
SEQUENCENUMBER_REPLY(sequencenumber);
|
||||
REPLYLENGTH(replylength);
|
||||
CARD16(acceleration_numerator);
|
||||
CARD16(acceleration_denominator);
|
||||
CARD16(threshold);
|
||||
UNUSED(18);
|
||||
break;
|
||||
|
||||
case X_GetScreenSaver:
|
||||
REPLY(reply);
|
||||
UNUSED(1);
|
||||
SEQUENCENUMBER_REPLY(sequencenumber);
|
||||
REPLYLENGTH(replylength);
|
||||
CARD16(timeout);
|
||||
CARD16(interval);
|
||||
ENUM8(prefer_blanking);
|
||||
ENUM8(allow_exposures);
|
||||
UNUSED(18);
|
||||
break;
|
||||
|
||||
case X_ListHosts:
|
||||
case X_SetPointerMapping:
|
||||
case X_GetPointerMapping:
|
||||
|
@ -4504,13 +4872,13 @@ dissect_x11_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
|||
|
||||
case X_GetModifierMapping:
|
||||
REPLY(reply);
|
||||
state->keycodes_per_modifier
|
||||
= FIELD8(keycodes_per_modifier);
|
||||
state->keycodes_per_modifier =
|
||||
FIELD8(keycodes_per_modifier);
|
||||
SEQUENCENUMBER_REPLY(sequencenumber);
|
||||
REPLYLENGTH(replylength);
|
||||
UNUSED(24);
|
||||
LISTofKEYCODE(state->modifiermap, keycodes,
|
||||
state->keycodes_per_modifier);
|
||||
state->keycodes_per_modifier);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -4592,37 +4960,245 @@ dissect_x11_event(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
|
|||
|
||||
case EnterNotify:
|
||||
case LeaveNotify:
|
||||
CARD8(detail);
|
||||
ENUM8(event_detail);
|
||||
CARD16(event_sequencenumber);
|
||||
EVENTCONTENTS_COMMON();
|
||||
ENUM8(grab_mode);
|
||||
CARD8(same_screen);
|
||||
break;
|
||||
|
||||
case FocusIn:
|
||||
case FocusOut:
|
||||
ENUM8(focus_detail);
|
||||
CARD16(event_sequencenumber);
|
||||
WINDOW(eventwindow);
|
||||
ENUM8(focus_mode);
|
||||
UNUSED(23);
|
||||
break;
|
||||
|
||||
case KeymapNotify:
|
||||
break;
|
||||
|
||||
case Expose:
|
||||
UNUSED(1);
|
||||
CARD16(event_sequencenumber);
|
||||
WINDOW(eventwindow);
|
||||
INT16(x);
|
||||
INT16(y);
|
||||
CARD16(width);
|
||||
CARD16(height);
|
||||
CARD16(count);
|
||||
UNUSED(14);
|
||||
break;
|
||||
|
||||
case GraphicsExpose:
|
||||
UNUSED(1);
|
||||
CARD16(event_sequencenumber);
|
||||
DRAWABLE(drawable);
|
||||
CARD16(x);
|
||||
CARD16(y);
|
||||
CARD16(width);
|
||||
CARD16(height);
|
||||
CARD16(minor_opcode);
|
||||
CARD16(count);
|
||||
CARD8(major_opcode);
|
||||
UNUSED(11);
|
||||
break;
|
||||
|
||||
case NoExpose:
|
||||
UNUSED(1);
|
||||
CARD16(event_sequencenumber);
|
||||
DRAWABLE(drawable);
|
||||
CARD16(minor_opcode);
|
||||
CARD8(major_opcode);
|
||||
UNUSED(21);
|
||||
break;
|
||||
|
||||
case VisibilityNotify:
|
||||
UNUSED(1);
|
||||
CARD16(event_sequencenumber);
|
||||
WINDOW(eventwindow);
|
||||
ENUM8(visibility_state);
|
||||
UNUSED(23);
|
||||
break;
|
||||
|
||||
case CreateNotify:
|
||||
UNUSED(1);
|
||||
CARD16(event_sequencenumber);
|
||||
WINDOW(parent);
|
||||
WINDOW(eventwindow);
|
||||
INT16(x);
|
||||
INT16(y);
|
||||
CARD16(width);
|
||||
CARD16(height);
|
||||
CARD16(border_width);
|
||||
BOOL(override_redirect);
|
||||
UNUSED(9);
|
||||
break;
|
||||
|
||||
case DestroyNotify:
|
||||
UNUSED(1);
|
||||
CARD16(event_sequencenumber);
|
||||
WINDOW(eventwindow);
|
||||
WINDOW(window);
|
||||
UNUSED(20);
|
||||
break;
|
||||
|
||||
case UnmapNotify:
|
||||
UNUSED(1);
|
||||
CARD16(event_sequencenumber);
|
||||
WINDOW(eventwindow);
|
||||
WINDOW(window);
|
||||
BOOL(from_configure);
|
||||
UNUSED(19);
|
||||
break;
|
||||
|
||||
case MapNotify:
|
||||
UNUSED(1);
|
||||
CARD16(event_sequencenumber);
|
||||
WINDOW(eventwindow);
|
||||
WINDOW(window);
|
||||
BOOL(override_redirect);
|
||||
UNUSED(19);
|
||||
break;
|
||||
|
||||
case MapRequest:
|
||||
UNUSED(1);
|
||||
CARD16(event_sequencenumber);
|
||||
WINDOW(parent);
|
||||
WINDOW(eventwindow);
|
||||
UNUSED(20);
|
||||
break;
|
||||
|
||||
case ReparentNotify:
|
||||
UNUSED(1);
|
||||
CARD16(event_sequencenumber);
|
||||
WINDOW(eventwindow);
|
||||
WINDOW(window);
|
||||
WINDOW(parent);
|
||||
INT16(x);
|
||||
INT16(y);
|
||||
BOOL(override_redirect);
|
||||
UNUSED(11);
|
||||
break;
|
||||
|
||||
case ConfigureNotify:
|
||||
UNUSED(1);
|
||||
CARD16(event_sequencenumber);
|
||||
WINDOW(eventwindow);
|
||||
WINDOW(window);
|
||||
WINDOW(above_sibling);
|
||||
INT16(x);
|
||||
INT16(y);
|
||||
CARD16(width);
|
||||
CARD16(height);
|
||||
CARD16(border_width);
|
||||
BOOL(override_redirect);
|
||||
UNUSED(5);
|
||||
break;
|
||||
|
||||
case ConfigureRequest:
|
||||
break;
|
||||
|
||||
case GravityNotify:
|
||||
UNUSED(1);
|
||||
CARD16(event_sequencenumber);
|
||||
WINDOW(eventwindow);
|
||||
WINDOW(window);
|
||||
INT16(x);
|
||||
INT16(y);
|
||||
UNUSED(16);
|
||||
break;
|
||||
|
||||
case ResizeRequest:
|
||||
UNUSED(1);
|
||||
CARD16(event_sequencenumber);
|
||||
WINDOW(eventwindow);
|
||||
CARD16(width);
|
||||
CARD16(height);
|
||||
UNUSED(20);
|
||||
break;
|
||||
|
||||
case CirculateNotify:
|
||||
UNUSED(1);
|
||||
CARD16(event_sequencenumber);
|
||||
WINDOW(eventwindow);
|
||||
WINDOW(window);
|
||||
UNUSED(4);
|
||||
ENUM8(place);
|
||||
UNUSED(15);
|
||||
break;
|
||||
|
||||
case CirculateRequest:
|
||||
UNUSED(1);
|
||||
CARD16(event_sequencenumber);
|
||||
WINDOW(parent);
|
||||
WINDOW(eventwindow);
|
||||
UNUSED(4);
|
||||
ENUM8(place);
|
||||
UNUSED(15);
|
||||
break;
|
||||
|
||||
case PropertyNotify:
|
||||
UNUSED(1);
|
||||
CARD16(event_sequencenumber);
|
||||
WINDOW(eventwindow);
|
||||
ATOM(atom);
|
||||
TIMESTAMP(time);
|
||||
ENUM8(property_state);
|
||||
UNUSED(15);
|
||||
break;
|
||||
|
||||
case SelectionClear:
|
||||
UNUSED(1);
|
||||
CARD16(event_sequencenumber);
|
||||
TIMESTAMP(time);
|
||||
WINDOW(owner);
|
||||
ATOM(selection);
|
||||
UNUSED(16);
|
||||
break;
|
||||
|
||||
case SelectionRequest:
|
||||
UNUSED(1);
|
||||
CARD16(event_sequencenumber);
|
||||
TIMESTAMP(time);
|
||||
WINDOW(owner);
|
||||
WINDOW(requestor);
|
||||
ATOM(selection);
|
||||
ATOM(target);
|
||||
ATOM(property);
|
||||
UNUSED(4);
|
||||
break;
|
||||
|
||||
case SelectionNotify:
|
||||
UNUSED(1);
|
||||
CARD16(event_sequencenumber);
|
||||
TIMESTAMP(time);
|
||||
WINDOW(requestor);
|
||||
ATOM(selection);
|
||||
ATOM(target);
|
||||
ATOM(property);
|
||||
UNUSED(8);
|
||||
break;
|
||||
|
||||
case ColormapNotify:
|
||||
UNUSED(1);
|
||||
CARD16(event_sequencenumber);
|
||||
WINDOW(eventwindow);
|
||||
COLORMAP(cmap);
|
||||
BOOL(new);
|
||||
ENUM8(colormap_state);
|
||||
UNUSED(18);
|
||||
break;
|
||||
|
||||
case ClientMessage:
|
||||
CARD8(format);
|
||||
CARD16(event_sequencenumber);
|
||||
WINDOW(eventwindow);
|
||||
ATOM(type);
|
||||
LISTofBYTE(data, 20);
|
||||
break;
|
||||
|
||||
case MappingNotify:
|
||||
default:
|
||||
break;
|
||||
|
@ -4714,13 +5290,6 @@ void proto_register_x11(void)
|
|||
|
||||
/* Setup list of header fields */
|
||||
static hf_register_info hf[] = {
|
||||
/*
|
||||
{ &hf_x11_FIELDABBREV,
|
||||
{ "FIELDNAME", "x11.FIELDABBREV",
|
||||
FIELDTYPE, FIELDBASE, FIELDCONVERT, BITMASK,
|
||||
"FIELDDESCR", HFILL }
|
||||
},
|
||||
*/
|
||||
#include "x11-register-info.h"
|
||||
};
|
||||
|
||||
|
|
33
x11-fields
33
x11-fields
|
@ -3,7 +3,7 @@
|
|||
#
|
||||
# Copyright 2000, Christophe Tronche <ch.tronche@computer.org>
|
||||
#
|
||||
# $Id: x11-fields,v 1.11 2004/01/04 10:57:18 guy Exp $
|
||||
# $Id: x11-fields,v 1.12 2004/03/22 22:53:56 deniel Exp $
|
||||
#
|
||||
# Ethereal - Network traffic analyzer
|
||||
# By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -24,6 +24,7 @@
|
|||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
#
|
||||
|
||||
above-sibling UINT32 HEX
|
||||
acceleration-denominator INT16 DEC
|
||||
acceleration-numerator INT16 DEC
|
||||
access-mode UINT8 DEC VALS
|
||||
|
@ -88,7 +89,7 @@ clip-y-origin INT16 DEC
|
|||
close-down-mode UINT8 DEC VALS
|
||||
cmap UINT32 HEX
|
||||
colormap UINT32 HEX
|
||||
|
||||
colormap-state UINT8 DEC VALS
|
||||
color-items NONE NONE
|
||||
|
||||
coloritem NONE NONE
|
||||
|
@ -151,6 +152,9 @@ eventbutton UINT8 DEC eventbutton
|
|||
eventcode UINT8 DEC VALS eventcode
|
||||
eventwindow UINT32 HEX eventwindow
|
||||
|
||||
first-event UINT8 DEC
|
||||
first-error UINT8 DEC
|
||||
|
||||
gc-dashes UINT8 DEC
|
||||
|
||||
gc-value-mask UINT32 HEX
|
||||
|
@ -185,6 +189,7 @@ data-length UINT32 DEC
|
|||
delete BOOLEAN NONE Delete this property after reading
|
||||
delta INT16 DEC
|
||||
depth UINT8 DEC
|
||||
destination UINT8 DEC VALS
|
||||
direction UINT8 DEC VALS
|
||||
drawable UINT32 HEX
|
||||
dst-drawable UINT32 HEX
|
||||
|
@ -192,6 +197,7 @@ dst-gc UINT32 HEX
|
|||
dst-window UINT32 HEX
|
||||
dst-x INT16 DEC
|
||||
dst-y INT16 DEC
|
||||
event-detail UINT8 DEC VALS
|
||||
|
||||
event-mask UINT32 HEX
|
||||
KeyPress BOOLEAN 32 0x00000001
|
||||
|
@ -221,6 +227,9 @@ event-mask UINT32 HEX
|
|||
OwnerGrabButton BOOLEAN 32 0x01000000
|
||||
erroneous-bits BOOLEAN 32 0xfe000000
|
||||
|
||||
exact-blue UINT16 DEC
|
||||
exact-green UINT16 DEC
|
||||
exact-red UINT16 DEC
|
||||
exposures BOOLEAN NONE
|
||||
family UINT8 DEC VALS
|
||||
fid UINT32 HEX Font id
|
||||
|
@ -228,16 +237,21 @@ fill-rule UINT8 DEC VALS
|
|||
fill-style UINT8 DEC VALS
|
||||
first-keycode UINT8 DEC
|
||||
focus UINT8 DEC VALS
|
||||
focus-detail UINT8 DEC VALS
|
||||
focus-mode UINT8 DEC VALS
|
||||
font UINT32 HEX
|
||||
fore-blue UINT16 DEC
|
||||
fore-green UINT16 DEC
|
||||
fore-red UINT16 DEC
|
||||
foreground UINT32 HEX
|
||||
format UINT8 DEC
|
||||
from-configure BOOLEAN NONE
|
||||
function UINT8 DEC VALS
|
||||
gc UINT32 HEX
|
||||
get-property-type UINT32 HEX VALS(zero_is_any_property_type)
|
||||
grab_window UINT32 HEX
|
||||
grab-mode UINT8 DEC VALS
|
||||
grab-status UINT8 DEC VALS
|
||||
grab-window UINT32 HEX
|
||||
graphics-exposures BOOLEAN NONE
|
||||
height UINT16 DEC
|
||||
image-byte-order UINT8 HEX VALS
|
||||
|
@ -271,6 +285,8 @@ keycodes NONE NONE
|
|||
|
||||
keycodes-per-modifier UINT8 DEC
|
||||
|
||||
keys UINT8 DEC
|
||||
|
||||
keysyms NONE NONE
|
||||
item NONE NONE
|
||||
keysym UINT32 HEX
|
||||
|
@ -318,6 +334,7 @@ modifiers-mask UINT16 HEX
|
|||
|
||||
motion-buffer-size UINT16 DEC motion buffer size
|
||||
|
||||
new BOOLEAN NONE
|
||||
number-of-formats-in-pixmap-formats UINT8 DEC number of formats in pixmap formats
|
||||
number-of-screens-in-roots UINT8 DEC number of screens in roots
|
||||
|
||||
|
@ -343,6 +360,7 @@ pixel UINT32 HEX
|
|||
pixels NONE NONE
|
||||
pixels_item UINT32 HEX
|
||||
pixmap UINT32 HEX
|
||||
place UINT8 DEC VALS
|
||||
plane-mask UINT32 HEX VALS
|
||||
planes UINT16 DEC
|
||||
point NONE NONE
|
||||
|
@ -368,12 +386,15 @@ pointer-event-mask UINT16 HEX
|
|||
|
||||
pointer-mode UINT8 DEC VALS(pointer_keyboard_mode)
|
||||
prefer-blanking UINT8 DEC VALS(yes_no_default)
|
||||
present BOOLEAN NONE
|
||||
propagate BOOLEAN NONE
|
||||
|
||||
properties NONE NONE
|
||||
item UINT32 HEX
|
||||
|
||||
property UINT32 HEX
|
||||
property-number UINT16 DEC
|
||||
property-state UINT8 DEC VALS
|
||||
protocol-major-version UINT16 DEC
|
||||
protocol-minor-version UINT16 DEC
|
||||
reason STRING HEX reason
|
||||
|
@ -459,13 +480,19 @@ undecoded NONE NONE Yet undecoded by dissector
|
|||
unused NONE NONE
|
||||
valuelength UINT32 DEC valuelength
|
||||
vendor STRING HEX vendor
|
||||
visibility-state UINT8 DEC VALS
|
||||
visual UINT32 HEX
|
||||
visual-blue UINT16 DEC
|
||||
visual-green UINT16 DEC
|
||||
visual-red UINT16 DEC
|
||||
visualid UINT32 HEX
|
||||
warp-pointer-dst-window UINT32 HEX VALS(zero_is_none)
|
||||
warp-pointer-src-window UINT32 HEX VALS(zero_is_none)
|
||||
wid UINT32 HEX Window id
|
||||
width UINT16 DEC
|
||||
win-gravity UINT8 DEC VALS(gravity)
|
||||
win-x INT16 DEC
|
||||
win-y INT16 DEC
|
||||
window UINT32 HEX
|
||||
window-class UINT16 DEC VALS Window class
|
||||
|
||||
|
|
Loading…
Reference in New Issue