Release 960818
[wine] / misc / spy.c
1 /*
2  * Message spying routines
3  *
4  * Copyright 1994, Bob Amstadt
5  *           1995, Alex Korobka  
6  */
7
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"
17
18 #define SPY_MAX_MSGNUM   WM_USER
19 #define SPY_INDENT_UNIT  4  /* 4 spaces */
20
21 static const char * const MessageTypeNames[SPY_MAX_MSGNUM + 1] =
22 {
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,
87
88     NULL,                       /* 0x40 */
89     "wm_compacting", NULL, NULL, 
90     "WM_COMMNOTIFY", NULL, 
91     "WM_WINDOWPOSCHANGING",     /* 0x0046 */
92     "WM_WINDOWPOSCHANGED",      /* 0x0047 */
93     "WM_POWER", NULL, 
94     "WM_COPYDATA", 
95     "WM_CANCELJOURNAL", NULL, NULL, NULL, NULL,
96
97     NULL,                       /* 0x0050 */
98     NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
99     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
100
101     /* 0x0060 */
102     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
103     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
104
105     /* 0x0070 */
106     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
107     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
108
109     NULL,                       /* 0x0080 */
110     "WM_NCCREATE",              /* 0x0081 */
111     "WM_NCDESTROY",             /* 0x0082 */
112     "WM_NCCALCSIZE",            /* 0x0083 */
113     "WM_NCHITTEST",             /* 0x0084 */
114     "WM_NCPAINT",               /* 0x0085 */
115     "WM_NCACTIVATE",            /* 0x0086 */
116     "WM_GETDLGCODE",            /* 0x0087 */
117     "wm_syncpaint", 
118     "wm_synctask", NULL, NULL, NULL, NULL, NULL, NULL,
119
120     /* 0x0090 */
121     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
122     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
123
124     /* 0x00A0 */
125     "WM_NCMOUSEMOVE",           /* 0x00A0 */
126     "WM_NCLBUTTONDOWN",         /* 0x00A1 */
127     "WM_NCLBUTTONUP",           /* 0x00A2 */
128     "WM_NCLBUTTONDBLCLK",       /* 0x00A3 */
129     "WM_NCRBUTTONDOWN",         /* 0x00A4 */
130     "WM_NCRBUTTONUP",           /* 0x00A5 */
131     "WM_NCRBUTTONDBLCLK",       /* 0x00A6 */
132     "WM_NCMBUTTONDOWN",         /* 0x00A7 */
133     "WM_NCMBUTTONUP",           /* 0x00A8 */
134     "WM_NCMBUTTONDBLCLK",       /* 0x00A9 */
135     NULL, NULL, NULL, NULL, NULL, NULL,
136
137     /* 0x00B0 - Win32 Edit controls */
138     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
139     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
140
141     /* 0x00C0 */
142     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
143     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
144
145     /* 0x00D0 */
146     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
147     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
148
149     /* 0x00E0 - Win32 Scrollbars */
150     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
151     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
152
153     /* 0x00F0 - Win32 Buttons */
154     "BM_GETCHECK32",            /* 0x00f0 */
155     "BM_SETCHECK32",            /* 0x00f1 */
156     "BM_GETSTATE32",            /* 0x00f2 */
157     "BM_SETSTATE32",            /* 0x00f3 */
158     "BM_SETSTYLE32",            /* 0x00f4 */
159     "BM_CLICK32",               /* 0x00f5 */
160     "BM_GETIMAGE32",            /* 0x00f6 */
161     "BM_SETIMAGE32",            /* 0x00f7 */
162     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
163
164     "WM_KEYDOWN",               /* 0x0100 */
165     "WM_KEYUP",                 /* 0x0101 */
166     "WM_CHAR",                  /* 0x0102 */
167     "WM_DEADCHAR",              /* 0x0103 */
168     "WM_SYSKEYDOWN",            /* 0x0104 */
169     "WM_SYSKEYUP",              /* 0x0105 */
170     "WM_SYSCHAR",               /* 0x0106 */
171     "WM_SYSDEADCHAR",           /* 0x0107 */
172     "WM_KEYLAST",               /* 0x0108 */
173     NULL, 
174     "WM_CONVERTREQUEST",
175     "WM_CONVERTRESULT", 
176     "WM_INTERIM", NULL, NULL, NULL,
177
178     "WM_INITDIALOG",            /* 0x0110 */
179     "WM_COMMAND",               /* 0x0111 */
180     "WM_SYSCOMMAND",            /* 0x0112 */
181     "WM_TIMER",                 /* 0x0113 */
182     "WM_HSCROLL",               /* 0x0114 */
183     "WM_VSCROLL",               /* 0x0115 */
184     "WM_INITMENU",              /* 0x0116 */
185     "WM_INITMENUPOPUP",         /* 0x0117 */
186     "WM_SYSTIMER",              /* 0x0118 */
187     NULL, NULL, NULL, NULL, NULL, NULL,
188     "WM_MENUSELECT",            /* 0x011f */
189
190     "WM_MENUCHAR",              /* 0x0120 */
191     "WM_ENTERIDLE",             /* 0x0121 */
192     NULL, NULL, NULL, NULL, NULL, NULL,
193     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
194
195     /* 0x0130 */
196     NULL,
197     "wm_lbtrackpoint",          /* 0x0131 */
198     "WM_CTLCOLORMSGBOX",        /* 0x0132 */
199     "WM_CTLCOLOREDIT",          /* 0x0133 */
200     "WM_CTLCOLORLISTBOX",       /* 0x0134 */
201     "WM_CTLCOLORBTN",           /* 0x0135 */
202     "WM_CTLCOLORDLG",           /* 0x0136 */
203     "WM_CTLCOLORSCROLLBAR",     /* 0x0137 */
204     "WM_CTLCOLORSTATIC",        /* 0x0138 */
205     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
206
207     /* 0x0140 - Win32 Comboboxes */
208     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
209     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
210
211     /* 0x0150 */
212     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
213     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
214
215     /* 0x0160 */
216     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
217     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
218
219     /* 0x0170 - Win32 Static controls */
220     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
221     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
222
223     /* 0x0180 - Win32 Listboxes */
224     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
225     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
226
227     /* 0x0190 */
228     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
229     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
230
231     /* 0x01A0 */
232     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
233     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
234
235     /* 0x01B0 */
236     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
237     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
238
239     /* 0x01C0 */
240     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
241     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
242
243     /* 0x01D0 */
244     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
245     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
246
247     /* 0x01E0 */
248     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
249     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
250
251     /* 0x01F0 */
252     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
253     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
254
255     "WM_MOUSEMOVE",             /* 0x0200 */
256     "WM_LBUTTONDOWN",           /* 0x0201 */
257     "WM_LBUTTONUP",             /* 0x0202 */
258     "WM_LBUTTONDBLCLK",         /* 0x0203 */
259     "WM_RBUTTONDOWN",           /* 0x0204 */
260     "WM_RBUTTONUP",             /* 0x0205 */
261     "WM_RBUTTONDBLCLK",         /* 0x0206 */
262     "WM_MBUTTONDOWN",           /* 0x0207 */
263     "WM_MBUTTONUP",             /* 0x0208 */
264     "WM_MBUTTONDBLCLK",         /* 0x0209 */
265     NULL, NULL, NULL, NULL, NULL, NULL,
266
267     "WM_PARENTNOTIFY",          /* 0x0210 */
268     "WM_ENTERMENULOOP",         /* 0x0211 */
269     "WM_EXITMENULOOP",          /* 0x0212 */
270     "wm_nextmenu",              /* 0x0213 */
271                             NULL, NULL, NULL, NULL,
272     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
273
274     "WM_MDICREATE",             /* 0x0220 */
275     "WM_MDIDESTROY",            /* 0x0221 */
276     "WM_MDIACTIVATE",           /* 0x0222 */
277     "WM_MDIRESTORE",            /* 0x0223 */
278     "WM_MDINEXT",               /* 0x0224 */
279     "WM_MDIMAXIMIZE",           /* 0x0225 */
280     "WM_MDITILE",               /* 0x0226 */
281     "WM_MDICASCADE",            /* 0x0227 */
282     "WM_MDIICONARRANGE",        /* 0x0228 */
283     "WM_MDIGETACTIVE",          /* 0x0229 */
284
285     "wm_dropobject", 
286     "wm_querydropobject", 
287     "wm_begindrag",
288     "wm_dragloop",
289     "wn_dragselect",
290     "wm_dragmove",
291      
292     /* 0x0230*/
293     "WM_MDISETMENU",            /* 0x0230 */
294     "WM_ENTERSIZEMOVE",         /* 0x0231 */
295     "WM_EXITSIZEMOVE",          /* 0x0232 */
296     "WM_DROPFILES",             /* 0x0233 */
297     "WM_MDIREFRESHMENU", NULL, NULL, NULL, 
298     /* 0x0238*/
299     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
300     
301     /* 0x0240 */
302     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
303     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
304
305     /* 0x0250 */
306     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
307     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
308     
309     /* 0x0260 */
310     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
311     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
315     /* 0x0280 */
316     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
317     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
318     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
319     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
320
321     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
322     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
326     /* 0x02c0 */
327     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
328     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
329     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
330     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
331
332     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
333     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
334     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
335     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
336
337     "WM_CUT",                   /* 0x0300 */
338     "WM_COPY", 
339     "WM_PASTE", 
340     "WM_CLEAR", 
341     "WM_UNDO", 
342     "WM_RENDERFORMAT", 
343     "WM_RENDERALLFORMATS", 
344     "WM_DESTROYCLIPBOARD",
345     "WM_DRAWCLIPBOARD", 
346     "WM_PAINTCLIPBOARD", 
347     "WM_VSCROLLCLIPBOARD", 
348     "WM_SIZECLIPBOARD", 
349     "WM_ASKCBFORMATNAME", 
350     "WM_CHANGECBCHAIN",
351     "WM_HSCROLLCLIPBOARD",
352     "WM_QUERYNEWPALETTE",       /* 0x030f*/
353
354     "WM_PALETTEISCHANGING",
355     "WM_PALETTECHANGED",
356     "WM_HOTKEY",                /* 0x0312 */
357           NULL, NULL, NULL, NULL, NULL, NULL, 
358     NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
359
360     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
365     /* 0x0340 */
366     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
367     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
371     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
372     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
373     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
374     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
375
376     /* 0x0380 */
377     "WM_PENWINFIRST", 
378     "WM_RCRESULT", 
379     "WM_HOOKRCRESULT", 
380     "WM_GLOBALRCCHANGE", 
381     "WM_SKB", 
382     "WM_HEDITCTL", 
383                                         NULL, NULL,
384     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
385
386     "WM_COALESCE_FIRST", 
387           NULL, NULL, NULL, NULL, NULL, NULL, NULL,
388     NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
389     "WM_COALESCE_LAST", 
390
391     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
392     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
393     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
394     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
395
396     /* 0x03c0 */
397     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
398     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
399     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
400     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
401
402     /* 0x03e0 */
403     "WM_DDE_INITIATE",  /* 0x3E0 */
404     "WM_DDE_TERMINATE", /* 0x3E1 */
405     "WM_DDE_ADVISE",    /* 0x3E2 */
406     "WM_DDE_UNADVISE",  /* 0x3E3 */
407     "WM_DDE_ACK",       /* 0x3E4 */
408     "WM_DDE_DATA",      /* 0x3E5 */
409     "WM_DDE_REQUEST",   /* 0x3E6 */
410     "WM_DDE_POKE",      /* 0x3E7 */
411     "WM_DDE_EXECUTE",   /* 0x3E8 */
412     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
413
414     
415     /* 0x03f0 */
416     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
417     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
418
419     "WM_USER"
420 };
421
422
423 static BOOL SPY_Exclude[SPY_MAX_MSGNUM+1];
424 static int SPY_IndentLevel  = 0;
425
426 #define SPY_EXCLUDE(msg) \
427     (SPY_Exclude[(msg) > SPY_MAX_MSGNUM ? SPY_MAX_MSGNUM : (msg)])
428
429 /***********************************************************************
430  *           SPY_GetMsgName
431  */
432 static const char *SPY_GetMsgName( UINT msg )
433 {
434     static char buffer[20];
435
436     if (msg <= SPY_MAX_MSGNUM)
437     {
438         if (!MessageTypeNames[msg]) return "???";
439         return MessageTypeNames[msg];
440     }
441     sprintf( buffer, "WM_USER+%04x", msg - WM_USER );
442     return buffer;
443 }
444
445
446 /***********************************************************************
447  *           SPY_EnterMessage
448  */
449 void SPY_EnterMessage( INT32 iFlag, HWND32 hWnd, UINT32 msg,
450                        WPARAM32 wParam, LPARAM lParam )
451 {
452     if (!debugging_message || SPY_EXCLUDE(msg)) return;
453
454     /* each SPY_SENDMESSAGE must be complemented by call to SPY_ExitMessage */
455     switch(iFlag)
456     {
457     case SPY_DISPATCHMESSAGE16:
458         dprintf_message(stddeb,"%*s(%04x) message [%04x] %s dispatched  wp=%04x lp=%08lx\n",
459                         SPY_IndentLevel, "", hWnd, msg, SPY_GetMsgName( msg ),
460                         wParam, lParam);
461         break;
462
463     case SPY_DISPATCHMESSAGE32:
464         dprintf_message(stddeb,"%*s(%08x) message [%04x] %s dispatched  wp=%08x lp=%08lx\n",
465                         SPY_IndentLevel, "", hWnd, msg, SPY_GetMsgName( msg ),
466                         wParam, lParam);
467         break;
468
469     case SPY_SENDMESSAGE16:
470     case SPY_SENDMESSAGE32:
471         {
472             char taskName[30];
473             HTASK hTask = GetWindowTask16(hWnd);
474             if (hTask == GetCurrentTask()) strcpy( taskName, "self" );
475             else if (!hTask) strcpy( taskName, "Wine" );
476             else sprintf( taskName, "task %04x %s",
477                           hTask, MODULE_GetModuleName( GetExePtr(hTask) ) );
478
479             if (iFlag == SPY_SENDMESSAGE16)
480                 dprintf_message(stddeb,"%*s(%04x) message [%04x] %s sent from %s wp=%04x lp=%08lx\n",
481                                 SPY_IndentLevel, "", hWnd, msg,
482                                 SPY_GetMsgName( msg ), taskName, wParam,
483                                 lParam );
484             else
485                 dprintf_message(stddeb,"%*s(%08x) message [%04x] %s sent from %s wp=%08x lp=%08lx\n",
486                                 SPY_IndentLevel, "", hWnd, msg,
487                                 SPY_GetMsgName( msg ), taskName, wParam,
488                                 lParam );
489         }
490         break;   
491
492     case SPY_DEFWNDPROC16:
493         dprintf_message(stddeb, "%*s(%04x) DefWindowProc: %s [%04x]  wp=%04x lp=%08lx\n",
494                         SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ),
495                         msg, wParam, lParam );
496         break;
497
498     case SPY_DEFWNDPROC32:
499         dprintf_message(stddeb, "%*s(%08x) DefWindowProc: %s [%04x]  wp=%08x lp=%08lx\n",
500                         SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ),
501                         msg, wParam, lParam );
502         break;
503     }  
504     SPY_IndentLevel += SPY_INDENT_UNIT;
505 }
506
507
508 /***********************************************************************
509  *           SPY_ExitMessage
510  */
511 void SPY_ExitMessage( INT32 iFlag, HWND32 hWnd, UINT32 msg, LRESULT lReturn )
512 {
513     if (!debugging_message || SPY_EXCLUDE(msg)) return;
514     if (SPY_IndentLevel) SPY_IndentLevel -= SPY_INDENT_UNIT;
515
516     switch(iFlag)
517     {
518     case SPY_RESULT_OK16:
519         dprintf_message(stddeb,"%*s(%04x) message [%04x] %s returned %08lx\n",
520                         SPY_IndentLevel, "", hWnd, msg,
521                         SPY_GetMsgName( msg ), lReturn );
522         break;
523     case SPY_RESULT_OK32:
524         dprintf_message(stddeb,"%*s(%08x) message [%04x] %s returned %08lx\n",
525                         SPY_IndentLevel, "", hWnd, msg,
526                         SPY_GetMsgName( msg ), lReturn );
527         break; 
528     case SPY_RESULT_INVALIDHWND16:
529         dprintf_message(stddeb,"%*s(%04x) message [%04x] %s HAS INVALID HWND\n",
530                         SPY_IndentLevel, "", hWnd, msg,
531                         SPY_GetMsgName( msg ) );
532         break;
533     case SPY_RESULT_INVALIDHWND32:
534         dprintf_message(stddeb,"%*s(%08x) message [%04x] %s HAS INVALID HWND\n",
535                         SPY_IndentLevel, "", hWnd, msg,
536                         SPY_GetMsgName( msg ) );
537         break;
538    }
539 }
540
541
542 /***********************************************************************
543  *           SPY_Init
544  */
545 int SPY_Init(void)
546 {
547     int i;
548     char buffer[512];
549
550     PROFILE_GetWineIniString( "Spy", "Include", "", buffer, sizeof(buffer) );
551     if (buffer[0] && strcmp( buffer, "INCLUDEALL" ))
552     {
553         dprintf_message( stddeb, "SpyInit: Include=%s\n", buffer );
554         for (i = 0; i <= SPY_MAX_MSGNUM; i++)
555             SPY_Exclude[i] = (MessageTypeNames[i] && !strstr(buffer,MessageTypeNames[i]));
556     }
557
558     PROFILE_GetWineIniString( "Spy", "Exclude", "", buffer, sizeof(buffer) );
559     if (buffer[0])
560     {
561         dprintf_message( stddeb, "SpyInit: Exclude=%s\n", buffer );
562         if (!strcmp( buffer, "EXCLUDEALL" ))
563             for (i = 0; i <= SPY_MAX_MSGNUM; i++) SPY_Exclude[i] = TRUE;
564         else
565             for (i = 0; i <= SPY_MAX_MSGNUM; i++)
566                 SPY_Exclude[i] = (MessageTypeNames[i] && strstr(buffer,MessageTypeNames[i]));
567     }
568     return 1;
569 }