Handle socket POLLERR/POLLHUP conditions properly.
[wine/hacks.git] / windows / spy.c
blob00d217fb5d7a8588253638bf681ad5d0ad171ca6
1 /*
2 * Message spying routines
4 * Copyright 1994, Bob Amstadt
5 * 1995, Alex Korobka
6 */
8 #include <stdlib.h>
9 #include <string.h>
10 #include <stdio.h>
11 #include "windef.h"
12 #include "wingdi.h"
13 #include "wine/winuser16.h"
14 #include "wine/winbase16.h"
15 #include "win.h"
16 #include "module.h"
17 #include "options.h"
18 #include "debugtools.h"
19 #include "spy.h"
20 #include "commctrl.h"
22 DEFAULT_DEBUG_CHANNEL(message)
24 #define SPY_MAX_MSGNUM WM_USER
25 #define SPY_INDENT_UNIT 4 /* 4 spaces */
27 static const char * const MessageTypeNames[SPY_MAX_MSGNUM + 1] =
29 "wm_null", /* 0x00 */
30 "WM_CREATE",
31 "WM_DESTROY",
32 "WM_MOVE",
33 "wm_sizewait",
34 "WM_SIZE",
35 "WM_ACTIVATE",
36 "WM_SETFOCUS",
37 "WM_KILLFOCUS",
38 "WM_SETVISIBLE",
39 "WM_ENABLE",
40 "WM_SETREDRAW",
41 "WM_SETTEXT",
42 "WM_GETTEXT",
43 "WM_GETTEXTLENGTH",
44 "WM_PAINT",
45 "WM_CLOSE", /* 0x10 */
46 "WM_QUERYENDSESSION",
47 "WM_QUIT",
48 "WM_QUERYOPEN",
49 "WM_ERASEBKGND",
50 "WM_SYSCOLORCHANGE",
51 "WM_ENDSESSION",
52 "wm_systemerror",
53 "WM_SHOWWINDOW",
54 "WM_CTLCOLOR",
55 "WM_WININICHANGE",
56 "WM_DEVMODECHANGE",
57 "WM_ACTIVATEAPP",
58 "WM_FONTCHANGE",
59 "WM_TIMECHANGE",
60 "WM_CANCELMODE",
61 "WM_SETCURSOR", /* 0x20 */
62 "WM_MOUSEACTIVATE",
63 "WM_CHILDACTIVATE",
64 "WM_QUEUESYNC",
65 "WM_GETMINMAXINFO",
66 "wm_unused3",
67 "wm_painticon",
68 "WM_ICONERASEBKGND",
69 "WM_NEXTDLGCTL",
70 "wm_alttabactive",
71 "WM_SPOOLERSTATUS",
72 "WM_DRAWITEM",
73 "WM_MEASUREITEM",
74 "WM_DELETEITEM",
75 "WM_VKEYTOITEM",
76 "WM_CHARTOITEM",
77 "WM_SETFONT", /* 0x30 */
78 "WM_GETFONT",
79 "WM_SETHOTKEY",
80 "WM_GETHOTKEY",
81 "wm_filesyschange",
82 "wm_isactiveicon",
83 "wm_queryparkicon",
84 "WM_QUERYDRAGICON",
85 "wm_querysavestate",
86 "WM_COMPAREITEM",
87 "wm_testing",
88 NULL,
89 "wm_otherwindowcreated",
90 "wm_otherwindowdestroyed",
91 "wm_activateshellwindow",
92 NULL,
94 NULL, /* 0x40 */
95 "wm_compacting", NULL, NULL,
96 "WM_COMMNOTIFY", NULL,
97 "WM_WINDOWPOSCHANGING", /* 0x0046 */
98 "WM_WINDOWPOSCHANGED", /* 0x0047 */
99 "WM_POWER", NULL,
100 "WM_COPYDATA",
101 "WM_CANCELJOURNAL", NULL, NULL,
102 "WM_NOTIFY", NULL,
104 /* 0x0050 */
105 "WM_INPUTLANGCHANGEREQUEST",
106 "WM_INPUTLANGCHANGE",
107 "WM_TCARD",
108 "WM_HELP",
109 "WM_USERCHANGED",
110 "WM_NOTIFYFORMAT", NULL, NULL,
111 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
113 /* 0x0060 */
114 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
115 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
117 /* 0x0070 */
118 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
119 NULL, NULL, NULL,
120 "WM_CONTEXTMENU",
121 "WM_STYLECHANGING",
122 "WM_STYLECHANGED",
123 "WM_DISPLAYCHANGE",
124 "WM_GETICON",
126 "WM_SETICON", /* 0x0080 */
127 "WM_NCCREATE", /* 0x0081 */
128 "WM_NCDESTROY", /* 0x0082 */
129 "WM_NCCALCSIZE", /* 0x0083 */
130 "WM_NCHITTEST", /* 0x0084 */
131 "WM_NCPAINT", /* 0x0085 */
132 "WM_NCACTIVATE", /* 0x0086 */
133 "WM_GETDLGCODE", /* 0x0087 */
134 "WM_SYNCPAINT",
135 "WM_SYNCTASK", NULL, NULL, NULL, NULL, NULL, NULL,
137 /* 0x0090 */
138 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
139 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
141 /* 0x00A0 */
142 "WM_NCMOUSEMOVE", /* 0x00A0 */
143 "WM_NCLBUTTONDOWN", /* 0x00A1 */
144 "WM_NCLBUTTONUP", /* 0x00A2 */
145 "WM_NCLBUTTONDBLCLK", /* 0x00A3 */
146 "WM_NCRBUTTONDOWN", /* 0x00A4 */
147 "WM_NCRBUTTONUP", /* 0x00A5 */
148 "WM_NCRBUTTONDBLCLK", /* 0x00A6 */
149 "WM_NCMBUTTONDOWN", /* 0x00A7 */
150 "WM_NCMBUTTONUP", /* 0x00A8 */
151 "WM_NCMBUTTONDBLCLK", /* 0x00A9 */
152 NULL, NULL, NULL, NULL, NULL, NULL,
154 /* 0x00B0 - Win32 Edit controls */
155 "EM_GETSEL32", /* 0x00b0 */
156 "EM_SETSEL32", /* 0x00b1 */
157 "EM_GETRECT32", /* 0x00b2 */
158 "EM_SETRECT32", /* 0x00b3 */
159 "EM_SETRECTNP32", /* 0x00b4 */
160 "EM_SCROLL32", /* 0x00b5 */
161 "EM_LINESCROLL32", /* 0x00b6 */
162 "EM_SCROLLCARET32", /* 0x00b7 */
163 "EM_GETMODIFY32", /* 0x00b8 */
164 "EM_SETMODIFY32", /* 0x00b9 */
165 "EM_GETLINECOUNT32", /* 0x00ba */
166 "EM_LINEINDEX32", /* 0x00bb */
167 "EM_SETHANDLE32", /* 0x00bc */
168 "EM_GETHANDLE32", /* 0x00bd */
169 "EM_GETTHUMB32", /* 0x00be */
170 NULL, /* 0x00bf */
172 NULL, /* 0x00c0 */
173 "EM_LINELENGTH32", /* 0x00c1 */
174 "EM_REPLACESEL32", /* 0x00c2 */
175 NULL, /* 0x00c3 */
176 "EM_GETLINE32", /* 0x00c4 */
177 "EM_LIMITTEXT32", /* 0x00c5 */
178 "EM_CANUNDO32", /* 0x00c6 */
179 "EM_UNDO32", /* 0x00c7 */
180 "EM_FMTLINES32", /* 0x00c8 */
181 "EM_LINEFROMCHAR32", /* 0x00c9 */
182 NULL, /* 0x00ca */
183 "EM_SETTABSTOPS32", /* 0x00cb */
184 "EM_SETPASSWORDCHAR32", /* 0x00cc */
185 "EM_EMPTYUNDOBUFFER32", /* 0x00cd */
186 "EM_GETFIRSTVISIBLELINE32", /* 0x00ce */
187 "EM_SETREADONLY32", /* 0x00cf */
189 "EM_SETWORDBREAKPROC32", /* 0x00d0 */
190 "EM_GETWORDBREAKPROC32", /* 0x00d1 */
191 "EM_GETPASSWORDCHAR32", /* 0x00d2 */
192 "EM_SETMARGINS32", /* 0x00d3 */
193 "EM_GETMARGINS32", /* 0x00d4 */
194 "EM_GETLIMITTEXT32", /* 0x00d5 */
195 "EM_POSFROMCHAR32", /* 0x00d6 */
196 "EM_CHARFROMPOS32", /* 0x00d7 */
197 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
199 /* 0x00E0 - Win32 Scrollbars */
200 "SBM_SETPOS32", /* 0x00e0 */
201 "SBM_GETPOS32", /* 0x00e1 */
202 "SBM_SETRANGE32", /* 0x00e2 */
203 "SBM_GETRANGE32", /* 0x00e3 */
204 "SBM_ENABLE_ARROWS32", /* 0x00e4 */
205 NULL,
206 "SBM_SETRANGEREDRAW32", /* 0x00e6 */
207 NULL, NULL,
208 "SBM_SETSCROLLINFO32", /* 0x00e9 */
209 "SBM_GETSCROLLINFO32", /* 0x00ea */
210 NULL, NULL, NULL, NULL, NULL,
212 /* 0x00F0 - Win32 Buttons */
213 "BM_GETCHECK32", /* 0x00f0 */
214 "BM_SETCHECK32", /* 0x00f1 */
215 "BM_GETSTATE32", /* 0x00f2 */
216 "BM_SETSTATE32", /* 0x00f3 */
217 "BM_SETSTYLE32", /* 0x00f4 */
218 "BM_CLICK32", /* 0x00f5 */
219 "BM_GETIMAGE32", /* 0x00f6 */
220 "BM_SETIMAGE32", /* 0x00f7 */
221 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
223 "WM_KEYDOWN", /* 0x0100 */
224 "WM_KEYUP", /* 0x0101 */
225 "WM_CHAR", /* 0x0102 */
226 "WM_DEADCHAR", /* 0x0103 */
227 "WM_SYSKEYDOWN", /* 0x0104 */
228 "WM_SYSKEYUP", /* 0x0105 */
229 "WM_SYSCHAR", /* 0x0106 */
230 "WM_SYSDEADCHAR", /* 0x0107 */
231 "WM_KEYLAST", /* 0x0108 */
232 NULL,
233 "WM_CONVERTREQUEST",
234 "WM_CONVERTRESULT",
235 "WM_INTERIM",
236 "WM_IME_STARTCOMPOSITION", /* 0x010d */
237 "WM_IME_ENDCOMPOSITION", /* 0x010e */
238 "WM_IME_COMPOSITION", /* 0x010f */
240 "WM_INITDIALOG", /* 0x0110 */
241 "WM_COMMAND", /* 0x0111 */
242 "WM_SYSCOMMAND", /* 0x0112 */
243 "WM_TIMER", /* 0x0113 */
244 "WM_HSCROLL", /* 0x0114 */
245 "WM_VSCROLL", /* 0x0115 */
246 "WM_INITMENU", /* 0x0116 */
247 "WM_INITMENUPOPUP", /* 0x0117 */
248 "WM_SYSTIMER", /* 0x0118 */
249 NULL, NULL, NULL, NULL, NULL, NULL,
250 "WM_MENUSELECT", /* 0x011f */
252 "WM_MENUCHAR", /* 0x0120 */
253 "WM_ENTERIDLE", /* 0x0121 */
254 NULL, NULL, NULL, NULL, NULL, NULL,
255 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
257 /* 0x0130 */
258 NULL,
259 "WM_LBTRACKPOINT", /* 0x0131 */
260 "WM_CTLCOLORMSGBOX", /* 0x0132 */
261 "WM_CTLCOLOREDIT", /* 0x0133 */
262 "WM_CTLCOLORLISTBOX", /* 0x0134 */
263 "WM_CTLCOLORBTN", /* 0x0135 */
264 "WM_CTLCOLORDLG", /* 0x0136 */
265 "WM_CTLCOLORSCROLLBAR", /* 0x0137 */
266 "WM_CTLCOLORSTATIC", /* 0x0138 */
267 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
269 /* 0x0140 - Win32 Comboboxes */
270 "CB_GETEDITSEL32", /* 0x0140 */
271 "CB_LIMITTEXT32", /* 0x0141 */
272 "CB_SETEDITSEL32", /* 0x0142 */
273 "CB_ADDSTRING32", /* 0x0143 */
274 "CB_DELETESTRING32", /* 0x0144 */
275 "CB_DIR32", /* 0x0145 */
276 "CB_GETCOUNT32", /* 0x0146 */
277 "CB_GETCURSEL32", /* 0x0147 */
278 "CB_GETLBTEXT32", /* 0x0148 */
279 "CB_GETLBTEXTLEN32", /* 0x0149 */
280 "CB_INSERTSTRING32", /* 0x014a */
281 "CB_RESETCONTENT32", /* 0x014b */
282 "CB_FINDSTRING32", /* 0x014c */
283 "CB_SELECTSTRING32", /* 0x014d */
284 "CB_SETCURSEL32", /* 0x014e */
285 "CB_SHOWDROPDOWN32", /* 0x014f */
287 "CB_GETITEMDATA32", /* 0x0150 */
288 "CB_SETITEMDATA32", /* 0x0151 */
289 "CB_GETDROPPEDCONTROLRECT32",/* 0x0152 */
290 "CB_SETITEMHEIGHT32", /* 0x0153 */
291 "CB_GETITEMHEIGHT32", /* 0x0154 */
292 "CB_SETEXTENDEDUI32", /* 0x0155 */
293 "CB_GETEXTENDEDUI32", /* 0x0156 */
294 "CB_GETDROPPEDSTATE32", /* 0x0157 */
295 "CB_FINDSTRINGEXACT32", /* 0x0158 */
296 "CB_SETLOCALE32", /* 0x0159 */
297 "CB_GETLOCALE32", /* 0x015a */
298 "CB_GETTOPINDEX32", /* 0x015b */
299 "CB_SETTOPINDEX32", /* 0x015c */
300 "CB_GETHORIZONTALEXTENT32", /* 0x015d */
301 "CB_SETHORIZONTALEXTENT32", /* 0x015e */
302 "CB_GETDROPPEDWIDTH32", /* 0x015f */
304 "CB_SETDROPPEDWIDTH32", /* 0x0160 */
305 "CB_INITSTORAGE32", /* 0x0161 */
306 NULL, NULL, NULL, NULL, NULL, NULL,
307 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
309 /* 0x0170 - Win32 Static controls */
310 "STM_SETICON32", /* 0x0170 */
311 "STM_GETICON32", /* 0x0171 */
312 "STM_SETIMAGE32", /* 0x0172 */
313 "STM_GETIMAGE32", /* 0x0173 */
314 NULL, NULL, NULL, NULL,
315 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
317 /* 0x0180 - Win32 Listboxes */
318 "LB_ADDSTRING32", /* 0x0180 */
319 "LB_INSERTSTRING32", /* 0x0181 */
320 "LB_DELETESTRING32", /* 0x0182 */
321 "LB_SELITEMRANGEEX32", /* 0x0183 */
322 "LB_RESETCONTENT32", /* 0x0184 */
323 "LB_SETSEL32", /* 0x0185 */
324 "LB_SETCURSEL32", /* 0x0186 */
325 "LB_GETSEL32", /* 0x0187 */
326 "LB_GETCURSEL32", /* 0x0188 */
327 "LB_GETTEXT32", /* 0x0189 */
328 "LB_GETTEXTLEN32", /* 0x018a */
329 "LB_GETCOUNT32", /* 0x018b */
330 "LB_SELECTSTRING32", /* 0x018c */
331 "LB_DIR32", /* 0x018d */
332 "LB_GETTOPINDEX32", /* 0x018e */
333 "LB_FINDSTRING32", /* 0x018f */
335 "LB_GETSELCOUNT32", /* 0x0190 */
336 "LB_GETSELITEMS32", /* 0x0191 */
337 "LB_SETTABSTOPS32", /* 0x0192 */
338 "LB_GETHORIZONTALEXTENT32", /* 0x0193 */
339 "LB_SETHORIZONTALEXTENT32", /* 0x0194 */
340 "LB_SETCOLUMNWIDTH32", /* 0x0195 */
341 "LB_ADDFILE32", /* 0x0196 */
342 "LB_SETTOPINDEX32", /* 0x0197 */
343 "LB_GETITEMRECT32", /* 0x0198 */
344 "LB_GETITEMDATA32", /* 0x0199 */
345 "LB_SETITEMDATA32", /* 0x019a */
346 "LB_SELITEMRANGE32", /* 0x019b */
347 "LB_SETANCHORINDEX32", /* 0x019c */
348 "LB_GETANCHORINDEX32", /* 0x019d */
349 "LB_SETCARETINDEX32", /* 0x019e */
350 "LB_GETCARETINDEX32", /* 0x019f */
352 "LB_SETITEMHEIGHT32", /* 0x01a0 */
353 "LB_GETITEMHEIGHT32", /* 0x01a1 */
354 "LB_FINDSTRINGEXACT32", /* 0x01a2 */
355 "LB_CARETON32", /* 0x01a3 */
356 "LB_CARETOFF32", /* 0x01a4 */
357 "LB_SETLOCALE32", /* 0x01a5 */
358 "LB_GETLOCALE32", /* 0x01a6 */
359 "LB_SETCOUNT32", /* 0x01a7 */
360 "LB_INITSTORAGE32", /* 0x01a8 */
361 "LB_ITEMFROMPOINT32", /* 0x01a9 */
362 NULL, NULL, NULL, NULL, NULL, NULL,
364 /* 0x01B0 */
365 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
366 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
368 /* 0x01C0 */
369 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
370 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
372 /* 0x01D0 */
373 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
374 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
376 /* 0x01E0 */
377 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
378 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
380 /* 0x01F0 */
381 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
382 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
384 "WM_MOUSEMOVE", /* 0x0200 */
385 "WM_LBUTTONDOWN", /* 0x0201 */
386 "WM_LBUTTONUP", /* 0x0202 */
387 "WM_LBUTTONDBLCLK", /* 0x0203 */
388 "WM_RBUTTONDOWN", /* 0x0204 */
389 "WM_RBUTTONUP", /* 0x0205 */
390 "WM_RBUTTONDBLCLK", /* 0x0206 */
391 "WM_MBUTTONDOWN", /* 0x0207 */
392 "WM_MBUTTONUP", /* 0x0208 */
393 "WM_MBUTTONDBLCLK", /* 0x0209 */
394 NULL, NULL, NULL, NULL, NULL, NULL,
396 "WM_PARENTNOTIFY", /* 0x0210 */
397 "WM_ENTERMENULOOP", /* 0x0211 */
398 "WM_EXITMENULOOP", /* 0x0212 */
399 "WM_NEXTMENU", /* 0x0213 */
400 "WM_SIZING",
401 "WM_CAPTURECHANGED",
402 "WM_MOVING", NULL,
403 "WM_POWERBROADCAST",
404 "WM_DEVICECHANGE", NULL, NULL, NULL, NULL, NULL, NULL,
406 "WM_MDICREATE", /* 0x0220 */
407 "WM_MDIDESTROY", /* 0x0221 */
408 "WM_MDIACTIVATE", /* 0x0222 */
409 "WM_MDIRESTORE", /* 0x0223 */
410 "WM_MDINEXT", /* 0x0224 */
411 "WM_MDIMAXIMIZE", /* 0x0225 */
412 "WM_MDITILE", /* 0x0226 */
413 "WM_MDICASCADE", /* 0x0227 */
414 "WM_MDIICONARRANGE", /* 0x0228 */
415 "WM_MDIGETACTIVE", /* 0x0229 */
417 "WM_DROPOBJECT",
418 "WM_QUERYDROPOBJECT",
419 "WM_BEGINDRAG",
420 "WM_DRAGLOOP",
421 "WM_DRAGSELECT",
422 "WM_DRAGMOVE",
424 /* 0x0230*/
425 "WM_MDISETMENU", /* 0x0230 */
426 "WM_ENTERSIZEMOVE", /* 0x0231 */
427 "WM_EXITSIZEMOVE", /* 0x0232 */
428 "WM_DROPFILES", /* 0x0233 */
429 "WM_MDIREFRESHMENU", NULL, NULL, NULL,
430 /* 0x0238*/
431 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
433 /* 0x0240 */
434 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
435 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
437 /* 0x0250 */
438 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
439 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
441 /* 0x0260 */
442 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
443 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
444 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
445 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
447 /* 0x0280 */
448 NULL, "WM_IME_SETCONTEXT", "WM_IME_NOTIFY", "WM_IME_CONTROL", "WM_IME_COMPOSITIONFULL", "WM_IME_SELECT", "WM_IME_CHAR", NULL,
449 "WM_IME_REQUEST", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
450 "WM_IME_KEYDOWN", "WM_IME_KEYUP", NULL, NULL, NULL, NULL, NULL, NULL,
451 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
453 /* 0x02a0 */
454 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
455 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
456 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
457 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
459 /* 0x02c0 */
460 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
461 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
462 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
463 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
465 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
466 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
467 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
468 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
470 "WM_CUT", /* 0x0300 */
471 "WM_COPY",
472 "WM_PASTE",
473 "WM_CLEAR",
474 "WM_UNDO",
475 "WM_RENDERFORMAT",
476 "WM_RENDERALLFORMATS",
477 "WM_DESTROYCLIPBOARD",
478 "WM_DRAWCLIPBOARD",
479 "WM_PAINTCLIPBOARD",
480 "WM_VSCROLLCLIPBOARD",
481 "WM_SIZECLIPBOARD",
482 "WM_ASKCBFORMATNAME",
483 "WM_CHANGECBCHAIN",
484 "WM_HSCROLLCLIPBOARD",
485 "WM_QUERYNEWPALETTE", /* 0x030f*/
487 "WM_PALETTEISCHANGING",
488 "WM_PALETTECHANGED",
489 "WM_HOTKEY", /* 0x0312 */
490 NULL, NULL, NULL, NULL,
491 "WM_PRINT",
492 "WM_PRINTCLIENT",
493 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
495 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
496 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
497 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
498 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
500 /* 0x0340 */
501 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
502 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
503 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
504 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
506 "WM_QUERYAFXWNDPROC", /* 0x0360 */
507 "WM_SIZEPARENT", /* 0x0361 */
508 "WM_SETMESSAGESTRING", /* 0x0362 */
509 "WM_IDLEUPDATECMDUI", /* 0x0363 */
510 "WM_INITIALUPDATE", /* 0x0364 */
511 "WM_COMMANDHELP", /* 0x0365 */
512 "WM_HELPHITTEST", /* 0x0366 */
513 "WM_EXITHELPMODE", /* 0x0367 */
514 "WM_RECALCPARENT", /* 0x0368 */
515 "WM_SIZECHILD", /* 0x0369 */
516 "WM_KICKIDLE", /* 0x036A */
517 "WM_QUERYCENTERWND", /* 0x036B */
518 "WM_DISABLEMODAL", /* 0x036C */
519 "WM_FLOATSTATUS", /* 0x036D */
520 "WM_ACTIVATETOPLEVEL", /* 0x036E */
521 "WM_QUERY3DCONTROLS", /* 0x036F */
522 NULL,NULL,NULL,
523 "WM_SOCKET_NOTIFY", /* 0x0373 */
524 "WM_SOCKET_DEAD", /* 0x0374 */
525 "WM_POPMESSAGESTRING", /* 0x0375 */
526 "WM_OCC_LOADFROMSTREAM", /* 0x0376 */
527 "WM_OCC_LOADFROMSTORAGE", /* 0x0377 */
528 "WM_OCC_INITNEW", /* 0x0378 */
529 "WM_QUEUE_SENTINEL", /* 0x0379 */
530 "WM_OCC_LOADFROMSTREAM_EX", /* 0x037A */
531 "WM_OCC_LOADFROMSTORAGE_EX", /* 0x037B */
533 NULL,NULL,NULL,NULL,
535 /* 0x0380 */
536 "WM_PENWINFIRST",
537 "WM_RCRESULT",
538 "WM_HOOKRCRESULT",
539 "WM_GLOBALRCCHANGE",
540 "WM_SKB",
541 "WM_HEDITCTL",
542 NULL, NULL,
543 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
545 "WM_COALESCE_FIRST",
546 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
547 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
548 "WM_COALESCE_LAST",
550 /* 0x03a0 */
551 "MM_JOY1MOVE",
552 "MM_JOY2MOVE",
553 "MM_JOY1ZMOVE",
554 "MM_JOY2ZMOVE",
555 NULL, NULL, NULL, NULL,
556 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
558 /* 0x03b0 */
559 NULL, NULL, NULL, NULL, NULL,
560 "MM_JOY1BUTTONDOWN",
561 "MM_JOY2BUTTONDOWN",
562 "MM_JOY1BUTTONUP",
563 "MM_JOY2BUTTONUP",
564 "MM_MCINOTIFY",
565 NULL,
566 "MM_WOM_OPEN",
567 "MM_WOM_CLOSE",
568 "MM_WOM_DONE",
569 "MM_WIM_OPEN",
570 "MM_WIM_CLOSE",
572 /* 0x03c0 */
573 "MM_WIM_DATA",
574 "MM_MIM_OPEN",
575 "MM_MIM_CLOSE",
576 "MM_MIM_DATA",
577 "MM_MIM_LONGDATA",
578 "MM_MIM_ERROR",
579 "MM_MIM_LONGERROR",
580 "MM_MOM_OPEN",
581 "MM_MOM_CLOSE",
582 "MM_MOM_DONE",
583 NULL, NULL, NULL, NULL, NULL, NULL,
584 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
585 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
587 /* 0x03e0 */
588 "WM_DDE_INITIATE", /* 0x3E0 */
589 "WM_DDE_TERMINATE", /* 0x3E1 */
590 "WM_DDE_ADVISE", /* 0x3E2 */
591 "WM_DDE_UNADVISE", /* 0x3E3 */
592 "WM_DDE_ACK", /* 0x3E4 */
593 "WM_DDE_DATA", /* 0x3E5 */
594 "WM_DDE_REQUEST", /* 0x3E6 */
595 "WM_DDE_POKE", /* 0x3E7 */
596 "WM_DDE_EXECUTE", /* 0x3E8 */
597 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
600 /* 0x03f0 */
601 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
602 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
604 "WM_USER"
608 #define SPY_MAX_LVMMSGNUM 139
609 static const char * const LVMMessageTypeNames[SPY_MAX_LVMMSGNUM + 1] =
611 "LVM_GETBKCOLOR", /* 1000 */
612 "LVM_SETBKCOLOR",
613 "LVM_GETIMAGELIST",
614 "LVM_SETIMAGELIST",
615 "LVM_GETITEMCOUNT",
616 "LVM_GETITEMA",
617 "LVM_SETITEMA",
618 "LVM_INSERTITEMA",
619 "LVM_DELETEITEM",
620 "LVM_DELETEALLITEMS",
621 "LVM_GETCALLBACKMASK",
622 "LVM_SETCALLBACKMASK",
623 "LVM_GETNEXTITEM",
624 "LVM_FINDITEMA",
625 "LVM_GETITEMRECT",
626 "LVM_SETITEMPOSITION",
627 "LVM_GETITEMPOSITION",
628 "LVM_GETSTRINGWIDTHA",
629 "LVM_HITTEST",
630 "LVM_ENSUREVISIBLE",
631 "LVM_SCROLL",
632 "LVM_REDRAWITEMS",
633 "LVM_ARRANGE",
634 "LVM_EDITLABELA",
635 "LVM_GETEDITCONTROL",
636 "LVM_GETCOLUMNA",
637 "LVM_SETCOLUMNA",
638 "LVM_INSERTCOLUMNA",
639 "LVM_DELETECOLUMN",
640 "LVM_GETCOLUMNWIDTH",
641 "LVM_SETCOLUMNWIDTH",
642 "LVM_GETHEADER",
643 "LVM_CREATEDRAGIMAGE",
644 "LVM_GETVIEWRECT",
645 "LVM_GETTEXTCOLOR",
646 "LVM_SETTEXTCOLOR",
647 "LVM_GETTEXTBKCOLOR",
648 "LVM_SETTEXTBKCOLOR",
649 "LVM_GETTOPINDEX",
650 "LVM_GETCOUNTPERPAGE",
651 "LVM_GETORIGIN",
652 "LVM_UPDATE",
653 "LVM_SETITEMSTATE",
654 "LVM_GETITEMSTATE",
655 "LVM_GETITEMTEXTA",
656 "LVM_SETITEMTEXTA",
657 "LVM_SETITEMCOUNT",
658 "LVM_SORTITEMS",
659 "LVM_SETITEMPOSITION32",
660 "LVM_GETSELECTEDCOUNT",
661 "LVM_GETITEMSPACING",
662 "LVM_GETISEARCHSTRINGA",
663 "LVM_SETICONSPACING",
664 "LVM_SETEXTENDEDLISTVIEWSTYLE",
665 "LVM_GETEXTENDEDLISTVIEWSTYLE",
666 "LVM_GETSUBITEMRECT",
667 "LVM_SUBITEMHITTEST",
668 "LVM_SETCOLUMNORDERARRAY",
669 "LVM_GETCOLUMNORDERARRAY",
670 "LVM_SETHOTITEM",
671 "LVM_GETHOTITEM",
672 "LVM_SETHOTCURSOR",
673 "LVM_GETHOTCURSOR",
674 "LVM_APPROXIMATEVIEWRECT",
675 "LVM_SETWORKAREAS",
676 "LVM_GETSELECTIONMARK",
677 "LVM_SETSELECTIONMARK",
678 "LVM_SETBKIMAGEA",
679 "LVM_GETBKIMAGEA",
680 "LVM_GETWORKAREAS",
681 "LVM_SETHOVERTIME",
682 "LVM_GETHOVERTIME",
683 "LVM_GETNUMBEROFWORKAREAS",
684 "LVM_SETTOOLTIPS",
685 "LVM_GETITEMW",
686 "LVM_SETITEMW",
687 "LVM_INSERTITEMW",
688 "LVM_GETTOOLTIPS",
689 NULL,
690 NULL,
691 NULL,
692 NULL,
693 "LVM_FINDITEMW",
694 NULL,
695 NULL,
696 NULL,
697 "LVM_GETSTRINGWIDTHW",
698 NULL,
699 NULL,
700 NULL,
701 NULL,
702 NULL,
703 NULL,
704 NULL,
705 "LVM_GETCOLUMNW",
706 "LVM_SETCOLUMNW",
707 "LVM_INSERTCOLUMNW",
708 NULL,
709 NULL,
710 NULL,
711 NULL,
712 NULL,
713 NULL,
714 NULL,
715 NULL,
716 NULL,
717 NULL,
718 NULL,
719 NULL,
720 NULL,
721 NULL,
722 NULL,
723 NULL,
724 NULL,
725 "LVM_GETITEMTEXTW",
726 "LVM_SETITEMTEXTW",
727 "LVM_GETISEARCHSTRINGW",
728 "LVM_EDITLABELW",
729 NULL,
730 NULL,
731 NULL,
732 NULL,
733 NULL,
734 NULL,
735 NULL,
736 NULL,
737 NULL,
738 NULL,
739 NULL,
740 NULL,
741 NULL,
742 NULL,
743 NULL,
744 NULL,
745 NULL,
746 NULL,
747 NULL,
748 NULL,
749 "LVM_SETBKIMAGEW",
750 "LVM_GETBKIMAGEW" /* 0x108B */
753 #define SPY_MAX_CCMMSGNUM 6
754 static const char * const CCMMessageTypeNames[SPY_MAX_CCMMSGNUM + 1] =
756 NULL, /* 0x2000 */
757 "CCM_SETBKCOLOR",
758 "CCM_SETCOLORSCHEME",
759 "CCM_GETCOLORSCHEME",
760 "CCM_GETDROPTARGET",
761 "CCM_SETUNICODEFORMAT",
762 "CCM_GETUNICODEFORMAT"
765 static BOOL16 SPY_Exclude[SPY_MAX_MSGNUM+1];
766 static BOOL16 SPY_ExcludeDWP = 0;
767 static int SPY_IndentLevel = 0;
769 #define SPY_EXCLUDE(msg) \
770 (SPY_Exclude[(msg) > SPY_MAX_MSGNUM ? SPY_MAX_MSGNUM : (msg)])
772 /***********************************************************************
773 * SPY_GetMsgName
775 const char *SPY_GetMsgName( UINT msg )
777 static char msg_buffer[20];
779 if (msg <= SPY_MAX_MSGNUM)
781 if (!MessageTypeNames[msg]) return "???";
782 return MessageTypeNames[msg];
785 if (msg >= LVM_FIRST && msg <= LVM_FIRST + SPY_MAX_LVMMSGNUM)
787 if (!LVMMessageTypeNames[msg-LVM_FIRST]) return "LVM_?";
788 return LVMMessageTypeNames[msg-LVM_FIRST];
791 if (msg >= CCM_FIRST && msg <= CCM_FIRST + SPY_MAX_CCMMSGNUM)
793 if (!CCMMessageTypeNames[msg-CCM_FIRST]) return "???";
794 return CCMMessageTypeNames[msg-CCM_FIRST];
797 sprintf( msg_buffer, "WM_USER+%04x", msg - WM_USER );
798 return msg_buffer;
801 /***********************************************************************
802 * SPY_GetWndName
804 const char *SPY_GetWndName( HWND hwnd )
806 static char wnd_buffer[16];
808 WND* pWnd = WIN_FindWndPtr( hwnd );
809 if( pWnd )
811 INT n = sizeof(wnd_buffer) - 6;
812 LPSTR p = wnd_buffer;
813 LPSTR src;
815 char postfix;
817 if( pWnd->text && pWnd->text[0] != '\0' )
819 src = pWnd->text;
820 *(p++) = postfix = '\"';
821 while ((n-- > 1) && *src) *p++ = *src++;
823 else /* get class name */
825 INT len;
827 *(p++)='{';
828 GlobalGetAtomNameA((ATOM) GetClassWord(pWnd->hwndSelf, GCW_ATOM), p, n + 1);
829 src = p += (len = lstrlenA(p));
830 if( len >= n ) src = wnd_buffer; /* something nonzero */
831 postfix = '}';
833 if( *src ) for( n = 0; n < 3; n++ ) *(p++)='.';
834 *(p++) = postfix;
835 *(p++) = '\0';
836 WIN_ReleaseWndPtr(pWnd);
839 else lstrcpyA( wnd_buffer, "\"NULL\"" );
840 return wnd_buffer;
842 /***********************************************************************
843 * SPY_DumpStructure
845 void SPY_DumpStructure (UINT msg, LPARAM structure)
847 switch (msg)
849 case WM_DRAWITEM:
850 { DRAWITEMSTRUCT *lpdis = (DRAWITEMSTRUCT*) structure;
851 TRACE("DRAWITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n", lpdis->CtlType, lpdis->CtlID);
852 TRACE("itemID=0x%08x itemAction=0x%08x itemState=0x%08x\n", lpdis->itemID, lpdis->itemAction, lpdis->itemState);
853 TRACE("hWnd=0x%04x hDC=0x%04x (%d,%d)-(%d,%d) itemData=0x%08lx\n",
854 lpdis->hwndItem, lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top, lpdis->rcItem.right, lpdis->rcItem.bottom, lpdis->itemData);
856 break;
857 case WM_MEASUREITEM:
858 { MEASUREITEMSTRUCT *lpmis = (MEASUREITEMSTRUCT*) structure;
859 TRACE("MEASUREITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n", lpmis->CtlType, lpmis->CtlID);
860 TRACE("itemID=0x%08x itemWidth=0x%08x itemHeight=0x%08x\n", lpmis->itemID, lpmis->itemWidth, lpmis->itemHeight);
861 TRACE("itemData=0x%08lx\n", lpmis->itemData);
863 break;
864 case WM_NOTIFY:
865 { NMHDR * pnmh = (NMHDR*) structure;
866 TRACE("NMHDR hwndFrom=0x%08x idFrom=0x%08x code=0x%08x\n", pnmh->hwndFrom, pnmh->idFrom, pnmh->code);
868 default:
869 break;
873 /***********************************************************************
874 * SPY_EnterMessage
876 void SPY_EnterMessage( INT iFlag, HWND hWnd, UINT msg,
877 WPARAM wParam, LPARAM lParam )
879 LPCSTR pname;
881 if (!TRACE_ON(message) || SPY_EXCLUDE(msg)) return;
883 /* each SPY_SENDMESSAGE must be complemented by call to SPY_ExitMessage */
884 switch(iFlag)
886 case SPY_DISPATCHMESSAGE16:
887 pname = SPY_GetWndName(hWnd);
888 TRACE("%*s(%04x) %-16s message [%04x] %s dispatched wp=%04x lp=%08lx\n",
889 SPY_IndentLevel, "", hWnd, pname, msg, SPY_GetMsgName( msg ),
890 wParam, lParam);
891 break;
893 case SPY_DISPATCHMESSAGE:
894 pname = SPY_GetWndName(hWnd);
895 TRACE("%*s(%08x) %-16s message [%04x] %s dispatched wp=%08x lp=%08lx\n",
896 SPY_IndentLevel, "", hWnd, pname, msg, SPY_GetMsgName( msg ),
897 wParam, lParam);
898 break;
900 case SPY_SENDMESSAGE16:
901 case SPY_SENDMESSAGE:
903 char taskName[30];
904 HTASK16 hTask = GetWindowTask16(hWnd);
906 if (hTask == GetCurrentTask()) strcpy( taskName, "self" );
907 else if (!hTask) strcpy( taskName, "Wine" );
908 else
910 sprintf( taskName, "task %04x ???", hTask );
911 GetModuleName16( hTask, taskName + 10, sizeof(taskName) - 10 );
913 pname = SPY_GetWndName(hWnd);
915 if (iFlag == SPY_SENDMESSAGE16)
916 TRACE("%*s(%04x) %-16s message [%04x] %s sent from %s wp=%04x lp=%08lx\n",
917 SPY_IndentLevel, "", hWnd, pname, msg, SPY_GetMsgName( msg ),
918 taskName, wParam, lParam );
919 else
920 { TRACE("%*s(%08x) %-16s message [%04x] %s sent from %s wp=%08x lp=%08lx\n",
921 SPY_IndentLevel, "", hWnd, pname, msg, SPY_GetMsgName( msg ),
922 taskName, wParam, lParam );
923 SPY_DumpStructure(msg, lParam);
926 break;
928 case SPY_DEFWNDPROC16:
929 if( SPY_ExcludeDWP ) return;
930 TRACE("%*s(%04x) DefWindowProc16: %s [%04x] wp=%04x lp=%08lx\n",
931 SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ),
932 msg, wParam, lParam );
933 break;
935 case SPY_DEFWNDPROC:
936 if( SPY_ExcludeDWP ) return;
937 TRACE("%*s(%08x) DefWindowProc32: %s [%04x] wp=%08x lp=%08lx\n",
938 SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ),
939 msg, wParam, lParam );
940 break;
942 SPY_IndentLevel += SPY_INDENT_UNIT;
946 /***********************************************************************
947 * SPY_ExitMessage
949 void SPY_ExitMessage( INT iFlag, HWND hWnd, UINT msg, LRESULT lReturn )
951 LPCSTR pname;
953 if (!TRACE_ON(message) || SPY_EXCLUDE(msg) ||
954 (SPY_ExcludeDWP && (iFlag == SPY_RESULT_DEFWND16 || iFlag == SPY_RESULT_DEFWND)) )
955 return;
957 if (SPY_IndentLevel) SPY_IndentLevel -= SPY_INDENT_UNIT;
959 switch(iFlag)
961 case SPY_RESULT_DEFWND16:
962 TRACE(" %*s(%04x) DefWindowProc16: %s [%04x] returned %08lx\n",
963 SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ), msg, lReturn );
964 break;
966 case SPY_RESULT_DEFWND:
967 TRACE(" %*s(%08x) DefWindowProc32: %s [%04x] returned %08lx\n",
968 SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ), msg, lReturn );
969 break;
971 case SPY_RESULT_OK16:
972 pname = SPY_GetWndName(hWnd);
973 TRACE(" %*s(%04x) %-16s message [%04x] %s returned %08lx\n",
974 SPY_IndentLevel, "", hWnd, pname, msg,
975 SPY_GetMsgName( msg ), lReturn );
976 break;
978 case SPY_RESULT_OK:
979 pname = SPY_GetWndName(hWnd);
980 TRACE(" %*s(%08x) %-16s message [%04x] %s returned %08lx\n",
981 SPY_IndentLevel, "", hWnd, pname, msg,
982 SPY_GetMsgName( msg ), lReturn );
983 break;
985 case SPY_RESULT_INVALIDHWND16:
986 pname = SPY_GetWndName(hWnd);
987 WARN(" %*s(%04x) %-16s message [%04x] %s HAS INVALID HWND\n",
988 SPY_IndentLevel, "", hWnd, pname, msg,
989 SPY_GetMsgName( msg ) );
990 break;
992 case SPY_RESULT_INVALIDHWND:
993 pname = SPY_GetWndName(hWnd);
994 WARN(" %*s(%08x) %-16s message [%04x] %s HAS INVALID HWND\n",
995 SPY_IndentLevel, "", hWnd, pname, msg,
996 SPY_GetMsgName( msg ) );
997 break;
1002 /***********************************************************************
1003 * SPY_Init
1005 int SPY_Init(void)
1007 int i;
1008 char buffer[1024];
1010 if (!TRACE_ON(message)) return TRUE;
1012 PROFILE_GetWineIniString( "Spy", "Include", "", buffer, sizeof(buffer) );
1013 if (buffer[0] && strcmp( buffer, "INCLUDEALL" ))
1015 TRACE("Include=%s\n", buffer );
1016 for (i = 0; i <= SPY_MAX_MSGNUM; i++)
1017 SPY_Exclude[i] = (MessageTypeNames[i] && !strstr(buffer,MessageTypeNames[i]));
1020 PROFILE_GetWineIniString( "Spy", "Exclude", "", buffer, sizeof(buffer) );
1021 if (buffer[0])
1023 TRACE("Exclude=%s\n", buffer );
1024 if (!strcmp( buffer, "EXCLUDEALL" ))
1025 for (i = 0; i <= SPY_MAX_MSGNUM; i++) SPY_Exclude[i] = TRUE;
1026 else
1027 for (i = 0; i <= SPY_MAX_MSGNUM; i++)
1028 SPY_Exclude[i] = (MessageTypeNames[i] && strstr(buffer,MessageTypeNames[i]));
1031 SPY_ExcludeDWP = PROFILE_GetWineIniInt( "Spy", "ExcludeDWP", 0 );
1033 return 1;