Release 960712
[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, NULL, NULL, NULL, NULL, NULL, NULL,
94
95     NULL,                       /* 0x0050 */
96     NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
97     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
98
99     /* 0x0060 */
100     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
101     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
102
103     /* 0x0070 */
104     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
105     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
106
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,
117
118     /* 0x0090 */
119     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
120     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
121
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,
134
135     /* 0x00B0 - Win32 Edit controls */
136     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
137     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
138
139     /* 0x00C0 */
140     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
141     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
142
143     /* 0x00D0 */
144     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
145     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
146
147     /* 0x00E0 - Win32 Scrollbars */
148     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
149     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
150
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,
161
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,
175
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 */
187
188     "WM_MENUCHAR",              /* 0x0120 */
189     "WM_ENTERIDLE",             /* 0x0121 */
190     NULL, NULL, NULL, NULL, NULL, NULL,
191     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
192
193     /* 0x0130 */
194     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,
204
205     /* 0x0140 - Win32 Comboboxes */
206     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
207     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
208
209     /* 0x0150 */
210     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
211     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
212
213     /* 0x0160 */
214     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
215     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
216
217     /* 0x0170 - Win32 Static controls */
218     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
219     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
220
221     /* 0x0180 - Win32 Listboxes */
222     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
223     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
224
225     /* 0x0190 */
226     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
227     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
228
229     /* 0x01A0 */
230     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
231     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
232
233     /* 0x01B0 */
234     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
235     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
236
237     /* 0x01C0 */
238     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
239     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
240
241     /* 0x01D0 */
242     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
243     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
244
245     /* 0x01E0 */
246     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
247     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
248
249     /* 0x01F0 */
250     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
251     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
252
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,
264
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,
271
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 */
282
283     "wm_dropobject", 
284     "wm_querydropobject", 
285     "wm_begindrag",
286     "wm_dragloop",
287     "wn_dragselect",
288     "wm_dragmove",
289      
290     /* 0x0230*/
291     "WM_MDISETMENU",            /* 0x0230 */
292     "WM_ENTERSIZEMOVE",         /* 0x0231 */
293     "WM_EXITSIZEMOVE",          /* 0x0232 */
294     "WM_DROPFILES",             /* 0x0233 */
295     NULL, NULL, NULL, NULL, 
296     /* 0x0238*/
297     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
298     
299     /* 0x0240 */
300     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
301     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
302
303     /* 0x0250 */
304     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
305     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
306     
307     /* 0x0260 */
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,
312
313     /* 0x0280 */
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,
318
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,
323
324     /* 0x02c0 */
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,
329
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,
334
335     "WM_CUT",                   /* 0x0300 */
336     "WM_COPY", 
337     "WM_PASTE", 
338     "WM_CLEAR", 
339     "WM_UNDO", 
340     "WM_RENDERFORMAT", 
341     "WM_RENDERALLFORMATS", 
342     "WM_DESTROYCLIPBOARD",
343     "WM_DRAWCLIPBOARD", 
344     "WM_PAINTCLIPBOARD", 
345     "WM_VSCROLLCLIPBOARD", 
346     "WM_SIZECLIPBOARD", 
347     "WM_ASKCBFORMATNAME", 
348     "WM_CHANGECBCHAIN",
349     "WM_HSCROLLCLIPBOARD",
350     "WM_QUERYNEWPALETTE",       /* 0x030f*/
351
352     "WM_PALETTEISCHANGING",
353     "WM_PALETTECHANGED",        /* 0x0311 */
354     NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
355     NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
356
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,
361
362     /* 0x0340 */
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,
367
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,
372
373     /* 0x0380 */
374     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
375     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
376
377     "WM_COALESCE_FIRST", 
378           NULL, NULL, NULL, NULL, NULL, NULL, NULL,
379     NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
380     "WM_COALESCE_LAST", 
381
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,
386
387     /* 0x03c0 */
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,
392
393     /* 0x03e0 */
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,
404
405     
406     /* 0x03f0 */
407     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
408     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
409
410     "WM_USER"
411 };
412
413
414 static BOOL SPY_Exclude[SPY_MAX_MSGNUM+1];
415 static int SPY_IndentLevel  = 0;
416
417 #define SPY_EXCLUDE(msg) \
418     (SPY_Exclude[(msg) > SPY_MAX_MSGNUM ? SPY_MAX_MSGNUM : (msg)])
419
420 /***********************************************************************
421  *           SPY_GetMsgName
422  */
423 static const char *SPY_GetMsgName( UINT msg )
424 {
425     static char buffer[20];
426
427     if (msg <= SPY_MAX_MSGNUM)
428     {
429         if (!MessageTypeNames[msg]) return "???";
430         return MessageTypeNames[msg];
431     }
432     sprintf( buffer, "WM_USER+%04x", msg - WM_USER );
433     return buffer;
434 }
435
436
437 /***********************************************************************
438  *           SPY_EnterMessage
439  */
440 void SPY_EnterMessage( INT32 iFlag, HWND32 hWnd, UINT32 msg,
441                        WPARAM32 wParam, LPARAM lParam )
442 {
443     if (!debugging_message || SPY_EXCLUDE(msg)) return;
444
445     /* each SPY_SENDMESSAGE must be complemented by call to SPY_ExitMessage */
446     switch(iFlag)
447     {
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 ),
451                         wParam, lParam);
452         break;
453
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 ),
457                         wParam, lParam);
458         break;
459
460     case SPY_SENDMESSAGE16:
461     case SPY_SENDMESSAGE32:
462         {
463             char taskName[30];
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) ) );
469
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,
474                                 lParam );
475             else
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,
479                                 lParam );
480         }
481         break;   
482
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 );
487         break;
488
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 );
493         break;
494     }  
495     SPY_IndentLevel += SPY_INDENT_UNIT;
496 }
497
498
499 /***********************************************************************
500  *           SPY_ExitMessage
501  */
502 void SPY_ExitMessage( INT32 iFlag, HWND32 hWnd, UINT32 msg, LRESULT lReturn )
503 {
504     if (!debugging_message || SPY_EXCLUDE(msg)) return;
505     if (SPY_IndentLevel) SPY_IndentLevel -= SPY_INDENT_UNIT;
506
507     switch(iFlag)
508     {
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 );
513         break;
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 );
518         break; 
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 ) );
523         break;
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 ) );
528         break;
529    }
530 }
531
532
533 /***********************************************************************
534  *           SPY_Init
535  */
536 int SPY_Init(void)
537 {
538     int i;
539     char buffer[512];
540
541     PROFILE_GetWineIniString( "Spy", "Include", "", buffer, sizeof(buffer) );
542     if (buffer[0] && strcmp( buffer, "INCLUDEALL" ))
543     {
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]));
547     }
548
549     PROFILE_GetWineIniString( "Spy", "Exclude", "", buffer, sizeof(buffer) );
550     if (buffer[0])
551     {
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;
555         else
556             for (i = 0; i <= SPY_MAX_MSGNUM; i++)
557                 SPY_Exclude[i] = (MessageTypeNames[i] && strstr(buffer,MessageTypeNames[i]));
558     }
559     return 1;
560 }