2 * Message spying routines
4 * Copyright 1994, Bob Amstadt
18 #define SPY_MAX_MSGNUM WM_USER
19 #define SPY_INDENT_UNIT 4 /* 4 spaces */
21 static const char * const MessageTypeNames[SPY_MAX_MSGNUM + 1] =
39 "WM_CLOSE", /* 0x10 */
55 "WM_SETCURSOR", /* 0x20 */
71 "WM_SETFONT", /* 0x30 */
83 "WM_OTHERWINDOWCREATED",
84 "WM_OTHERWINDOWDESTROYED",
85 "WM_ACTIVATESHELLWINDOW",
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,
96 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
97 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
100 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
101 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
104 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
105 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
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 */
116 "WM_SYNCTASK", NULL, NULL, NULL, NULL, NULL, NULL,
119 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
120 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
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,
140 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
141 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
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 */
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,
195 "wm_lbtrackpoint", /* 0x0131 */
196 "WM_CTLCOLORMSGBOX", /* 0x0132 */
197 "WM_CTLCOLOREDIT", /* 0x0133 */
198 "WM_CTLCOLORLISTBOX", /* 0x0134 */
199 "WM_CTLCOLORBTN", /* 0x0135 */
200 "WM_CTLCOLORDLG", /* 0x0136 */
201 "WM_CTLCOLORSCROLLBAR", /* 0x0137 */
202 "WM_CTLCOLORSTATIC", /* 0x0138 */
203 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
205 /* 0x0140 - Win32 Comboboxes */
206 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
207 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
210 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
211 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
214 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
215 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
217 /* 0x0170 - Win32 Static controls */
218 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
219 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
221 /* 0x0180 - Win32 Listboxes */
222 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
223 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
226 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
227 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
230 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
231 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
234 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
235 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
238 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
239 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
242 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
243 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
246 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
247 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
250 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
251 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
253 "WM_MOUSEMOVE", /* 0x0200 */
254 "WM_LBUTTONDOWN", /* 0x0201 */
255 "WM_LBUTTONUP", /* 0x0202 */
256 "WM_LBUTTONDBLCLK", /* 0x0203 */
257 "WM_RBUTTONDOWN", /* 0x0204 */
258 "WM_RBUTTONUP", /* 0x0205 */
259 "WM_RBUTTONDBLCLK", /* 0x0206 */
260 "WM_MBUTTONDOWN", /* 0x0207 */
261 "WM_MBUTTONUP", /* 0x0208 */
262 "WM_MBUTTONDBLCLK", /* 0x0209 */
263 NULL, NULL, NULL, NULL, NULL, NULL,
265 "WM_PARENTNOTIFY", /* 0x0210 */
266 "WM_ENTERMENULOOP", /* 0x0211 */
267 "WM_EXITMENULOOP", /* 0x0212 */
268 "WM_NEXTMENU", /* 0x0213 */
269 NULL, NULL, NULL, NULL,
270 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
272 "WM_MDICREATE", /* 0x0220 */
273 "WM_MDIDESTROY", /* 0x0221 */
274 "WM_MDIACTIVATE", /* 0x0222 */
275 "WM_MDIRESTORE", /* 0x0223 */
276 "WM_MDINEXT", /* 0x0224 */
277 "WM_MDIMAXIMIZE", /* 0x0225 */
278 "WM_MDITILE", /* 0x0226 */
279 "WM_MDICASCADE", /* 0x0227 */
280 "WM_MDIICONARRANGE", /* 0x0228 */
281 "WM_MDIGETACTIVE", /* 0x0229 */
284 "wm_querydropobject",
291 "WM_MDISETMENU", /* 0x0230 */
292 "WM_ENTERSIZEMOVE", /* 0x0231 */
293 "WM_EXITSIZEMOVE", /* 0x0232 */
294 "WM_DROPFILES", /* 0x0233 */
295 NULL, NULL, NULL, NULL,
297 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
300 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
301 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
304 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
305 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,
311 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,
316 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
317 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,
322 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,
327 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
328 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
330 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
331 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
332 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
333 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
335 "WM_CUT", /* 0x0300 */
341 "WM_RENDERALLFORMATS",
342 "WM_DESTROYCLIPBOARD",
345 "WM_VSCROLLCLIPBOARD",
347 "WM_ASKCBFORMATNAME",
349 "WM_HSCROLLCLIPBOARD",
350 "WM_QUERYNEWPALETTE", /* 0x030f*/
352 "WM_PALETTEISCHANGING",
353 "WM_PALETTECHANGED", /* 0x0311 */
354 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
355 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,
360 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,
365 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
366 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
368 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
369 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
370 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
371 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
374 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
375 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
378 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
379 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,
385 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
388 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
389 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
390 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
391 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
394 "WM_DDE_INITIATE", /* 0x3E0 */
395 "WM_DDE_TERMINATE", /* 0x3E1 */
396 "WM_DDE_ADVISE", /* 0x3E2 */
397 "WM_DDE_UNADVISE", /* 0x3E3 */
398 "WM_DDE_ACK", /* 0x3E4 */
399 "WM_DDE_DATA", /* 0x3E5 */
400 "WM_DDE_REQUEST", /* 0x3E6 */
401 "WM_DDE_POKE", /* 0x3E7 */
402 "WM_DDE_EXECUTE", /* 0x3E8 */
403 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
407 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
408 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
414 static BOOL SPY_Exclude[SPY_MAX_MSGNUM+1];
415 static int SPY_IndentLevel = 0;
417 #define SPY_EXCLUDE(msg) \
418 (SPY_Exclude[(msg) > SPY_MAX_MSGNUM ? SPY_MAX_MSGNUM : (msg)])
420 /***********************************************************************
423 static const char *SPY_GetMsgName( UINT msg )
425 static char buffer[20];
427 if (msg <= SPY_MAX_MSGNUM)
429 if (!MessageTypeNames[msg]) return "???";
430 return MessageTypeNames[msg];
432 sprintf( buffer, "WM_USER+%04x", msg - WM_USER );
437 /***********************************************************************
440 void SPY_EnterMessage( INT32 iFlag, HWND32 hWnd, UINT32 msg,
441 WPARAM32 wParam, LPARAM lParam )
443 if (!debugging_message || SPY_EXCLUDE(msg)) return;
445 /* each SPY_SENDMESSAGE must be complemented by call to SPY_ExitMessage */
448 case SPY_DISPATCHMESSAGE16:
449 dprintf_message(stddeb,"%*s(%04x) message [%04x] %s dispatched wp=%04x lp=%08lx\n",
450 SPY_IndentLevel, "", hWnd, msg, SPY_GetMsgName( msg ),
454 case SPY_DISPATCHMESSAGE32:
455 dprintf_message(stddeb,"%*s(%08x) message [%04x] %s dispatched wp=%08x lp=%08lx\n",
456 SPY_IndentLevel, "", hWnd, msg, SPY_GetMsgName( msg ),
460 case SPY_SENDMESSAGE16:
461 case SPY_SENDMESSAGE32:
464 HTASK hTask = GetWindowTask16(hWnd);
465 if (hTask == GetCurrentTask()) strcpy( taskName, "self" );
466 else if (!hTask) strcpy( taskName, "Wine" );
467 else sprintf( taskName, "task %04x %s",
468 hTask, MODULE_GetModuleName( GetExePtr(hTask) ) );
470 if (iFlag == SPY_SENDMESSAGE16)
471 dprintf_message(stddeb,"%*s(%04x) message [%04x] %s sent from %s wp=%04x lp=%08lx\n",
472 SPY_IndentLevel, "", hWnd, msg,
473 SPY_GetMsgName( msg ), taskName, wParam,
476 dprintf_message(stddeb,"%*s(%08x) message [%04x] %s sent from %s wp=%08x lp=%08lx\n",
477 SPY_IndentLevel, "", hWnd, msg,
478 SPY_GetMsgName( msg ), taskName, wParam,
483 case SPY_DEFWNDPROC16:
484 dprintf_message(stddeb, "%*s(%04x) DefWindowProc: %s [%04x] wp=%04x lp=%08lx\n",
485 SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ),
486 msg, wParam, lParam );
489 case SPY_DEFWNDPROC32:
490 dprintf_message(stddeb, "%*s(%08x) DefWindowProc: %s [%04x] wp=%08x lp=%08lx\n",
491 SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ),
492 msg, wParam, lParam );
495 SPY_IndentLevel += SPY_INDENT_UNIT;
499 /***********************************************************************
502 void SPY_ExitMessage( INT32 iFlag, HWND32 hWnd, UINT32 msg, LRESULT lReturn )
504 if (!debugging_message || SPY_EXCLUDE(msg)) return;
505 if (SPY_IndentLevel) SPY_IndentLevel -= SPY_INDENT_UNIT;
509 case SPY_RESULT_OK16:
510 dprintf_message(stddeb,"%*s(%04x) message [%04x] %s returned %08lx\n",
511 SPY_IndentLevel, "", hWnd, msg,
512 SPY_GetMsgName( msg ), lReturn );
514 case SPY_RESULT_OK32:
515 dprintf_message(stddeb,"%*s(%08x) message [%04x] %s returned %08lx\n",
516 SPY_IndentLevel, "", hWnd, msg,
517 SPY_GetMsgName( msg ), lReturn );
519 case SPY_RESULT_INVALIDHWND16:
520 dprintf_message(stddeb,"%*s(%04x) message [%04x] %s HAS INVALID HWND\n",
521 SPY_IndentLevel, "", hWnd, msg,
522 SPY_GetMsgName( msg ) );
524 case SPY_RESULT_INVALIDHWND32:
525 dprintf_message(stddeb,"%*s(%08x) message [%04x] %s HAS INVALID HWND\n",
526 SPY_IndentLevel, "", hWnd, msg,
527 SPY_GetMsgName( msg ) );
533 /***********************************************************************
541 PROFILE_GetWineIniString( "Spy", "Include", "", buffer, sizeof(buffer) );
542 if (buffer[0] && strcmp( buffer, "INCLUDEALL" ))
544 dprintf_message( stddeb, "SpyInit: Include=%s\n", buffer );
545 for (i = 0; i <= SPY_MAX_MSGNUM; i++)
546 SPY_Exclude[i] = (MessageTypeNames[i] && !strstr(buffer,MessageTypeNames[i]));
549 PROFILE_GetWineIniString( "Spy", "Exclude", "", buffer, sizeof(buffer) );
552 dprintf_message( stddeb, "SpyInit: Exclude=%s\n", buffer );
553 if (!strcmp( buffer, "EXCLUDEALL" ))
554 for (i = 0; i <= SPY_MAX_MSGNUM; i++) SPY_Exclude[i] = TRUE;
556 for (i = 0; i <= SPY_MAX_MSGNUM; i++)
557 SPY_Exclude[i] = (MessageTypeNames[i] && strstr(buffer,MessageTypeNames[i]));