Release 960516
[wine.git] / misc / spy.c
blob791326b565b07d27229bed99a255b01d8bbe5987
1 /*
2 * Message spying routines
4 * Copyright 1994, Bob Amstadt
5 * 1995, Alex Korobka
6 */
8 #include <stdlib.h>
9 #include <stdio.h>
10 #include <string.h>
11 #include "windows.h"
12 #include "module.h"
13 #include "options.h"
14 #include "stddebug.h"
15 #include "debug.h"
16 #include "spy.h"
18 #define SPY_MAX_MSGNUM WM_USER
19 #define SPY_INDENT_UNIT 4 /* 4 spaces */
21 static const char *MessageTypeNames[SPY_MAX_MSGNUM + 1] =
23 "WM_NULL", /* 0x00 */
24 "WM_CREATE",
25 "WM_DESTROY",
26 "WM_MOVE",
27 "WM_SIZEWAIT",
28 "WM_SIZE",
29 "WM_ACTIVATE",
30 "WM_SETFOCUS",
31 "WM_KILLFOCUS",
32 "WM_SETVISIBLE",
33 "WM_ENABLE",
34 "WM_SETREDRAW",
35 "WM_SETTEXT",
36 "WM_GETTEXT",
37 "WM_GETTEXTLENGTH",
38 "WM_PAINT",
39 "WM_CLOSE", /* 0x10 */
40 "WM_QUERYENDSESSION",
41 "WM_QUIT",
42 "WM_QUERYOPEN",
43 "WM_ERASEBKGND",
44 "WM_SYSCOLORCHANGE",
45 "WM_ENDSESSION",
46 "WM_SYSTEMERROR",
47 "WM_SHOWWINDOW",
48 "WM_CTLCOLOR",
49 "WM_WININICHANGE",
50 "WM_DEVMODECHANGE",
51 "WM_ACTIVATEAPP",
52 "WM_FONTCHANGE",
53 "WM_TIMECHANGE",
54 "WM_CANCELMODE",
55 "WM_SETCURSOR", /* 0x20 */
56 "WM_MOUSEACTIVATE",
57 "WM_CHILDACTIVATE",
58 "WM_QUEUESYNC",
59 "WM_GETMINMAXINFO",
60 "WM_UNUSED3",
61 "WM_PAINTICON",
62 "WM_ICONERASEBKGND",
63 "WM_NEXTDLGCTL",
64 "WM_ALTTABACTIVE",
65 "WM_SPOOLERSTATUS",
66 "WM_DRAWITEM",
67 "WM_MEASUREITEM",
68 "WM_DELETEITEM",
69 "WM_VKEYTOITEM",
70 "WM_CHARTOITEM",
71 "WM_SETFONT", /* 0x30 */
72 "WM_GETFONT",
73 "WM_SETHOTKEY",
74 "WM_GETHOTKEY",
75 "WM_FILESYSCHANGE",
76 "WM_ISACTIVEICON",
77 "WM_QUERYPARKICON",
78 "WM_QUERYDRAGICON",
79 "WM_QUERYSAVESTATE",
80 "WM_COMPAREITEM",
81 "WM_TESTING",
82 NULL,
83 "WM_OTHERWINDOWCREATED",
84 "WM_OTHERWINDOWDESTROYED",
85 "WM_ACTIVATESHELLWINDOW",
86 NULL,
88 NULL, /* 0x40 */
89 "WM_COMPACTING", NULL, NULL,
90 "WM_COMMNOTIFY", NULL,
91 "WM_WINDOWPOSCHANGING", /* 0x0046 */
92 "WM_WINDOWPOSCHANGED", /* 0x0047 */
93 "WM_POWER", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
95 NULL, /* 0x0050 */
96 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
97 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
99 /* 0x0060 */
100 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
101 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
103 /* 0x0070 */
104 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
105 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
107 NULL, /* 0x0080 */
108 "WM_NCCREATE", /* 0x0081 */
109 "WM_NCDESTROY", /* 0x0082 */
110 "WM_NCCALCSIZE", /* 0x0083 */
111 "WM_NCHITTEST", /* 0x0084 */
112 "WM_NCPAINT", /* 0x0085 */
113 "WM_NCACTIVATE", /* 0x0086 */
114 "WM_GETDLGCODE", /* 0x0087 */
115 "WM_SYNCPAINT",
116 "WM_SYNCTASK", NULL, NULL, NULL, NULL, NULL, NULL,
118 /* 0x0090 */
119 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
120 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
122 /* 0x00A0 */
123 "WM_NCMOUSEMOVE", /* 0x00A0 */
124 "WM_NCLBUTTONDOWN", /* 0x00A1 */
125 "WM_NCLBUTTONUP", /* 0x00A2 */
126 "WM_NCLBUTTONDBLCLK", /* 0x00A3 */
127 "WM_NCRBUTTONDOWN", /* 0x00A4 */
128 "WM_NCRBUTTONUP", /* 0x00A5 */
129 "WM_NCRBUTTONDBLCLK", /* 0x00A6 */
130 "WM_NCMBUTTONDOWN", /* 0x00A7 */
131 "WM_NCMBUTTONUP", /* 0x00A8 */
132 "WM_NCMBUTTONDBLCLK", /* 0x00A9 */
133 NULL, NULL, NULL, NULL, NULL, NULL,
135 /* 0x00B0 - Win32 Edit controls */
136 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
137 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
139 /* 0x00C0 */
140 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
141 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
143 /* 0x00D0 */
144 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
145 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
147 /* 0x00E0 - Win32 Scrollbars */
148 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
149 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
151 /* 0x00F0 - Win32 Buttons */
152 "BM_GETCHECK32", /* 0x00f0 */
153 "BM_SETCHECK32", /* 0x00f1 */
154 "BM_GETSTATE32", /* 0x00f2 */
155 "BM_SETSTATE32", /* 0x00f3 */
156 "BM_SETSTYLE32", /* 0x00f4 */
157 "BM_CLICK32", /* 0x00f5 */
158 "BM_GETIMAGE32", /* 0x00f6 */
159 "BM_SETIMAGE32", /* 0x00f7 */
160 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
162 "WM_KEYDOWN", /* 0x0100 */
163 "WM_KEYUP", /* 0x0101 */
164 "WM_CHAR", /* 0x0102 */
165 "WM_DEADCHAR", /* 0x0103 */
166 "WM_SYSKEYDOWN", /* 0x0104 */
167 "WM_SYSKEYUP", /* 0x0105 */
168 "WM_SYSCHAR", /* 0x0106 */
169 "WM_SYSDEADCHAR", /* 0x0107 */
170 "WM_KEYLAST", /* 0x0108 */
171 NULL,
172 "WM_CONVERTREQUEST",
173 "WM_CONVERTRESULT",
174 "WM_INTERIM", NULL, NULL, NULL,
176 "WM_INITDIALOG", /* 0x0110 */
177 "WM_COMMAND", /* 0x0111 */
178 "WM_SYSCOMMAND", /* 0x0112 */
179 "WM_TIMER", /* 0x0113 */
180 "WM_HSCROLL", /* 0x0114 */
181 "WM_VSCROLL", /* 0x0115 */
182 "WM_INITMENU", /* 0x0116 */
183 "WM_INITMENUPOPUP", /* 0x0117 */
184 "WM_SYSTIMER", /* 0x0118 */
185 NULL, NULL, NULL, NULL, NULL, NULL,
186 "WM_MENUSELECT", /* 0x011f */
188 "WM_MENUCHAR", /* 0x0120 */
189 "WM_ENTERIDLE", /* 0x0121 */
190 NULL, NULL, NULL, NULL, NULL, NULL,
191 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
193 /* 0x0130 */
194 NULL, "wm_lbtrackpoint",
195 NULL, NULL, NULL, NULL, NULL, NULL,
196 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
198 /* 0x0140 - Win32 Comboboxes */
199 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
200 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
202 /* 0x0150 */
203 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
204 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
206 /* 0x0160 */
207 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
208 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
210 /* 0x0170 - Win32 Static controls */
211 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
212 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
214 /* 0x0180 - Win32 Listboxes */
215 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
216 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
218 /* 0x0190 */
219 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
220 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
222 /* 0x01A0 */
223 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
224 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
226 /* 0x01B0 */
227 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
228 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
230 /* 0x01C0 */
231 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
232 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
234 /* 0x01D0 */
235 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
236 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
238 /* 0x01E0 */
239 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
240 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
242 /* 0x01F0 */
243 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
244 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
246 "WM_MOUSEMOVE", /* 0x0200 */
247 "WM_LBUTTONDOWN", /* 0x0201 */
248 "WM_LBUTTONUP", /* 0x0202 */
249 "WM_LBUTTONDBLCLK", /* 0x0203 */
250 "WM_RBUTTONDOWN", /* 0x0204 */
251 "WM_RBUTTONUP", /* 0x0205 */
252 "WM_RBUTTONDBLCLK", /* 0x0206 */
253 "WM_MBUTTONDOWN", /* 0x0207 */
254 "WM_MBUTTONUP", /* 0x0208 */
255 "WM_MBUTTONDBLCLK", /* 0x0209 */
256 NULL, NULL, NULL, NULL, NULL, NULL,
258 "WM_PARENTNOTIFY", /* 0x0210 */
259 "WM_ENTERMENULOOP", /* 0x0211 */
260 "WM_EXITMENULOOP", /* 0x0212 */
261 "WM_NEXTMENU", /* 0x0213 */
262 NULL, NULL, NULL, NULL,
263 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
265 "WM_MDICREATE", /* 0x0220 */
266 "WM_MDIDESTROY", /* 0x0221 */
267 "WM_MDIACTIVATE", /* 0x0222 */
268 "WM_MDIRESTORE", /* 0x0223 */
269 "WM_MDINEXT", /* 0x0224 */
270 "WM_MDIMAXIMIZE", /* 0x0225 */
271 "WM_MDITILE", /* 0x0226 */
272 "WM_MDICASCADE", /* 0x0227 */
273 "WM_MDIICONARRANGE", /* 0x0228 */
274 "WM_MDIGETACTIVE", /* 0x0229 */
276 "wm_dropobject",
277 "wm_querydropobject",
278 "wm_begindrag",
279 "wm_dragloop",
280 "wn_dragselect",
281 "wm_dragmove",
283 /* 0x0230*/
284 "WM_MDISETMENU", /* 0x0230 */
285 "WM_ENTERSIZEMOVE", /* 0x0231 */
286 "WM_EXITSIZEMOVE", /* 0x0232 */
287 "WM_DROPFILES", /* 0x0233 */
288 NULL, NULL, NULL, NULL,
289 /* 0x0238*/
290 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
292 /* 0x0240 */
293 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
294 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
296 /* 0x0250 */
297 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
298 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
300 /* 0x0260 */
301 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
302 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
303 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
304 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
306 /* 0x0280 */
307 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
308 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
309 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
310 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
312 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
313 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
314 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
315 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
317 /* 0x02c0 */
318 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
319 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
320 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
321 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
323 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
324 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
325 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
326 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
328 "WM_CUT", /* 0x0300 */
329 "WM_COPY",
330 "WM_PASTE",
331 "WM_CLEAR",
332 "WM_UNDO",
333 "WM_RENDERFORMAT",
334 "WM_RENDERALLFORMATS",
335 "WM_DESTROYCLIPBOARD",
336 "WM_DRAWCLIPBOARD",
337 "WM_PAINTCLIPBOARD",
338 "WM_VSCROLLCLIPBOARD",
339 "WM_SIZECLIPBOARD",
340 "WM_ASKCBFORMATNAME",
341 "WM_CHANGECBCHAIN",
342 "WM_HSCROLLCLIPBOARD",
343 "WM_QUERYNEWPALETTE", /* 0x030f*/
345 "WM_PALETTEISCHANGING",
346 "WM_PALETTECHANGED", /* 0x0311 */
347 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
348 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
350 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
351 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
352 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
353 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
355 /* 0x0340 */
356 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
357 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
358 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
359 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
361 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
362 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
363 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
364 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
366 /* 0x0380 */
367 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
368 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
370 "WM_COALESCE_FIRST",
371 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
372 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
373 "WM_COALESCE_LAST",
375 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
376 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
377 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
378 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
380 /* 0x03c0 */
381 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
382 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
383 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
384 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
386 /* 0x03e0 */
387 "WM_DDE_INITIATE", /* 0x3E0 */
388 "WM_DDE_TERMINATE", /* 0x3E1 */
389 "WM_DDE_ADVISE", /* 0x3E2 */
390 "WM_DDE_UNADVISE", /* 0x3E3 */
391 "WM_DDE_ACK", /* 0x3E4 */
392 "WM_DDE_DATA", /* 0x3E5 */
393 "WM_DDE_REQUEST", /* 0x3E6 */
394 "WM_DDE_POKE", /* 0x3E7 */
395 "WM_DDE_EXECUTE", /* 0x3E8 */
396 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
399 /* 0x03f0 */
400 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
401 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
403 "WM_USER"
407 static BOOL SPY_Exclude[SPY_MAX_MSGNUM+1] = { FALSE, };
408 static int SPY_IndentLevel = 0;
410 #define SPY_EXCLUDE(msg) \
411 (SPY_Exclude[(msg) > SPY_MAX_MSGNUM ? SPY_MAX_MSGNUM : (msg)])
413 /***********************************************************************
414 * SPY_GetMsgName
416 static const char *SPY_GetMsgName( UINT msg )
418 static char buffer[20];
420 if (msg <= SPY_MAX_MSGNUM)
422 if (!MessageTypeNames[msg]) return "???";
423 return MessageTypeNames[msg];
425 sprintf( buffer, "WM_USER+%04x\n", msg - WM_USER );
426 return buffer;
430 /***********************************************************************
431 * SPY_EnterMessage
433 void SPY_EnterMessage( int iFlag, HWND hWnd, UINT msg,
434 WPARAM wParam, LPARAM lParam )
436 if (!debugging_message || SPY_EXCLUDE(msg)) return;
438 /* each SPY_SENDMESSAGE must be complemented by call to ExitSpyMessage */
439 switch(iFlag)
441 case SPY_DISPATCHMESSAGE:
442 dprintf_message(stddeb,"(%04x) message [%04x] %s dispatched wp=%04x lp=%08lx\n",
443 hWnd, msg, SPY_GetMsgName( msg ),
444 wParam, lParam);
445 break;
447 case SPY_SENDMESSAGE:
449 char taskName[30];
450 HTASK hTask = GetWindowTask(hWnd);
451 if (hTask == GetCurrentTask()) strcpy( taskName, "self" );
452 else if (!hTask) strcpy( taskName, "Wine" );
453 else sprintf( taskName, "task %04x %s",
454 hTask, MODULE_GetModuleName( GetExePtr(hTask) ) );
456 dprintf_message(stddeb,"%*s(%04x) message [%04x] %s sent from %s wp=%04x lp=%08lx\n",
457 SPY_IndentLevel, "", hWnd, msg,
458 SPY_GetMsgName( msg ), taskName, wParam, lParam );
459 SPY_IndentLevel += SPY_INDENT_UNIT;
461 break;
463 case SPY_DEFWNDPROC:
464 dprintf_message(stddeb, "%*s(%04x) DefWindowProc: %s [%04x] wp=%04x lp=%08lx\n",
465 SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ),
466 msg, wParam, lParam );
467 break;
472 /***********************************************************************
473 * SPY_ExitMessage
475 void SPY_ExitMessage( int iFlag, HWND hWnd, UINT msg, LRESULT lReturn )
477 if (!debugging_message || SPY_EXCLUDE(msg)) return;
478 if (SPY_IndentLevel) SPY_IndentLevel -= SPY_INDENT_UNIT;
480 switch(iFlag)
482 case SPY_RESULT_INVALIDHWND:
483 dprintf_message(stddeb,"%*s(%04x) message [%04x] %s HAS INVALID HWND\n",
484 SPY_IndentLevel, "", hWnd, msg,
485 SPY_GetMsgName( msg ) );
486 break;
487 case SPY_RESULT_OK:
488 dprintf_message(stddeb,"%*s(%04x) message [%04x] %s returned %08lx\n",
489 SPY_IndentLevel, "", hWnd, msg,
490 SPY_GetMsgName( msg ), lReturn );
491 break;
496 /***********************************************************************
497 * SPY_Init
499 int SPY_Init(void)
501 int i;
502 char buffer[512];
504 PROFILE_GetWineIniString( "Spy", "Include", "", buffer, sizeof(buffer) );
505 if (buffer[0] && strcmp( buffer, "INCLUDEALL" ))
507 dprintf_message( stddeb, "SpyInit: Include=%s\n", buffer );
508 for (i = 0; i <= SPY_MAX_MSGNUM; i++)
509 SPY_Exclude[i] = (MessageTypeNames[i] && !strstr(buffer,MessageTypeNames[i]));
512 PROFILE_GetWineIniString( "Spy", "Exclude", "", buffer, sizeof(buffer) );
513 if (buffer[0])
515 dprintf_message( stddeb, "SpyInit: Exclude=%s\n", buffer );
516 if (!strcmp( buffer, "EXCLUDEALL" ))
517 for (i = 0; i <= SPY_MAX_MSGNUM; i++) SPY_Exclude[i] = TRUE;
518 else
519 for (i = 0; i <= SPY_MAX_MSGNUM; i++)
520 SPY_Exclude[i] = (MessageTypeNames[i] && strstr(buffer,MessageTypeNames[i]));
522 return 1;