Release 970120
[wine] / misc / spy.c
1 /*
2  * Message spying routines
3  *
4  * Copyright 1994, Bob Amstadt
5  *           1995, Alex Korobka  
6  */
7
8 #define NO_TRANSITION_TYPES  /* This file is Win32-clean */
9 #include <stdlib.h>
10 #include <stdio.h>
11 #include <string.h>
12 #include "windows.h"
13 #include "module.h"
14 #include "options.h"
15 #include "stddebug.h"
16 #include "debug.h"
17 #include "spy.h"
18
19 #define SPY_MAX_MSGNUM   WM_USER
20 #define SPY_INDENT_UNIT  4  /* 4 spaces */
21
22 static const char * const MessageTypeNames[SPY_MAX_MSGNUM + 1] =
23 {
24     "wm_null",                  /* 0x00 */
25     "WM_CREATE",        
26     "WM_DESTROY",    
27     "WM_MOVE",
28     "wm_sizewait",
29     "WM_SIZE",
30     "WM_ACTIVATE",
31     "WM_SETFOCUS",
32     "WM_KILLFOCUS",
33     "WM_SETVISIBLE",
34     "WM_ENABLE",
35     "WM_SETREDRAW",
36     "WM_SETTEXT",
37     "WM_GETTEXT",
38     "WM_GETTEXTLENGTH",
39     "WM_PAINT",
40     "WM_CLOSE",                 /* 0x10 */
41     "WM_QUERYENDSESSION",
42     "WM_QUIT",
43     "WM_QUERYOPEN",
44     "WM_ERASEBKGND",
45     "WM_SYSCOLORCHANGE",
46     "WM_ENDSESSION",
47     "wm_systemerror",
48     "WM_SHOWWINDOW",
49     "WM_CTLCOLOR",
50     "WM_WININICHANGE",
51     "WM_DEVMODECHANGE",
52     "WM_ACTIVATEAPP",
53     "WM_FONTCHANGE",
54     "WM_TIMECHANGE",
55     "WM_CANCELMODE",
56     "WM_SETCURSOR",             /* 0x20 */
57     "WM_MOUSEACTIVATE",
58     "WM_CHILDACTIVATE",
59     "WM_QUEUESYNC",
60     "WM_GETMINMAXINFO",
61     "wm_unused3",
62     "wm_painticon",
63     "WM_ICONERASEBKGND",
64     "WM_NEXTDLGCTL",
65     "wm_alttabactive",
66     "WM_SPOOLERSTATUS",
67     "WM_DRAWITEM",
68     "WM_MEASUREITEM",
69     "WM_DELETEITEM",
70     "WM_VKEYTOITEM",
71     "WM_CHARTOITEM",
72     "WM_SETFONT",               /* 0x30 */
73     "WM_GETFONT",
74     "WM_SETHOTKEY", 
75     "WM_GETHOTKEY", 
76     "wm_filesyschange", 
77     "wm_isactiveicon",
78     "wm_queryparkicon",
79     "WM_QUERYDRAGICON",
80     "wm_querysavestate",
81     "WM_COMPAREITEM", 
82     "wm_testing",
83     NULL, 
84     "wm_otherwindowcreated", 
85     "wm_otherwindowdestroyed", 
86     "wm_activateshellwindow",
87     NULL,
88
89     NULL,                       /* 0x40 */
90     "wm_compacting", NULL, NULL, 
91     "WM_COMMNOTIFY", NULL, 
92     "WM_WINDOWPOSCHANGING",     /* 0x0046 */
93     "WM_WINDOWPOSCHANGED",      /* 0x0047 */
94     "WM_POWER", NULL, 
95     "WM_COPYDATA", 
96     "WM_CANCELJOURNAL", NULL, NULL, NULL, NULL,
97
98     NULL,                       /* 0x0050 */
99     NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
100     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
101
102     /* 0x0060 */
103     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
104     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
105
106     /* 0x0070 */
107     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
108     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
109
110     NULL,                       /* 0x0080 */
111     "WM_NCCREATE",              /* 0x0081 */
112     "WM_NCDESTROY",             /* 0x0082 */
113     "WM_NCCALCSIZE",            /* 0x0083 */
114     "WM_NCHITTEST",             /* 0x0084 */
115     "WM_NCPAINT",               /* 0x0085 */
116     "WM_NCACTIVATE",            /* 0x0086 */
117     "WM_GETDLGCODE",            /* 0x0087 */
118     "wm_syncpaint", 
119     "wm_synctask", NULL, NULL, NULL, NULL, NULL, NULL,
120
121     /* 0x0090 */
122     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
123     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
124
125     /* 0x00A0 */
126     "WM_NCMOUSEMOVE",           /* 0x00A0 */
127     "WM_NCLBUTTONDOWN",         /* 0x00A1 */
128     "WM_NCLBUTTONUP",           /* 0x00A2 */
129     "WM_NCLBUTTONDBLCLK",       /* 0x00A3 */
130     "WM_NCRBUTTONDOWN",         /* 0x00A4 */
131     "WM_NCRBUTTONUP",           /* 0x00A5 */
132     "WM_NCRBUTTONDBLCLK",       /* 0x00A6 */
133     "WM_NCMBUTTONDOWN",         /* 0x00A7 */
134     "WM_NCMBUTTONUP",           /* 0x00A8 */
135     "WM_NCMBUTTONDBLCLK",       /* 0x00A9 */
136     NULL, NULL, NULL, NULL, NULL, NULL,
137
138     /* 0x00B0 - Win32 Edit controls */
139     "EM_GETSEL32",              /* 0x00b0 */
140     "EM_SETSEL32",              /* 0x00b1 */
141     "EM_GETRECT32",             /* 0x00b2 */
142     "EM_SETRECT32",             /* 0x00b3 */
143     "EM_SETRECTNP32",           /* 0x00b4 */
144     "EM_SCROLL32",              /* 0x00b5 */
145     "EM_LINESCROLL32",          /* 0x00b6 */
146     "EM_SCROLLCARET32",         /* 0x00b7 */
147     "EM_GETMODIFY32",           /* 0x00b8 */
148     "EM_SETMODIFY32",           /* 0x00b9 */
149     "EM_GETLINECOUNT32",        /* 0x00ba */
150     "EM_LINEINDEX32",           /* 0x00bb */
151     "EM_SETHANDLE32",           /* 0x00bc */
152     "EM_GETHANDLE32",           /* 0x00bd */
153     "EM_GETTHUMB32",            /* 0x00be */
154     NULL,                       /* 0x00bf */
155
156     NULL,                       /* 0x00c0 */
157     "EM_LINELENGTH32",          /* 0x00c1 */
158     "EM_REPLACESEL32",          /* 0x00c2 */
159     NULL,                       /* 0x00c3 */
160     "EM_GETLINE32",             /* 0x00c4 */
161     "EM_LIMITTEXT32",           /* 0x00c5 */
162     "EM_CANUNDO32",             /* 0x00c6 */
163     "EM_UNDO32",                /* 0x00c7 */
164     "EM_FMTLINES32",            /* 0x00c8 */
165     "EM_LINEFROMCHAR32",        /* 0x00c9 */
166     NULL,                       /* 0x00ca */
167     "EM_SETTABSTOPS32",         /* 0x00cb */
168     "EM_SETPASSWORDCHAR32",     /* 0x00cc */
169     "EM_EMPTYUNDOBUFFER32",     /* 0x00cd */
170     "EM_GETFIRSTVISIBLELINE32", /* 0x00ce */
171     "EM_SETREADONLY32",         /* 0x00cf */
172
173     "EM_SETWORDBREAKPROC32",    /* 0x00d0 */
174     "EM_GETWORDBREAKPROC32",    /* 0x00d1 */
175     "EM_GETPASSWORDCHAR32",     /* 0x00d2 */
176     "EM_SETMARGINS32",          /* 0x00d3 */
177     "EM_GETMARGINS32",          /* 0x00d4 */
178     "EM_GETLIMITTEXT32",        /* 0x00d5 */
179     "EM_POSFROMCHAR32",         /* 0x00d6 */
180     "EM_CHARFROMPOS32",         /* 0x00d7 */
181     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
182
183     /* 0x00E0 - Win32 Scrollbars */
184     "SBM_SETPOS32",             /* 0x00e0 */
185     "SBM_GETPOS32",             /* 0x00e1 */
186     "SBM_SETRANGE32",           /* 0x00e2 */
187     "SBM_GETRANGE32",           /* 0x00e3 */
188     "SBM_ENABLE_ARROWS32",      /* 0x00e4 */
189     NULL,
190     "SBM_SETRANGEREDRAW32",     /* 0x00e6 */
191     NULL, NULL,
192     "SBM_SETSCROLLINFO32",      /* 0x00e9 */
193     "SBM_GETSCROLLINFO32",      /* 0x00ea */
194     NULL, NULL, NULL, NULL, NULL,
195
196     /* 0x00F0 - Win32 Buttons */
197     "BM_GETCHECK32",            /* 0x00f0 */
198     "BM_SETCHECK32",            /* 0x00f1 */
199     "BM_GETSTATE32",            /* 0x00f2 */
200     "BM_SETSTATE32",            /* 0x00f3 */
201     "BM_SETSTYLE32",            /* 0x00f4 */
202     "BM_CLICK32",               /* 0x00f5 */
203     "BM_GETIMAGE32",            /* 0x00f6 */
204     "BM_SETIMAGE32",            /* 0x00f7 */
205     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
206
207     "WM_KEYDOWN",               /* 0x0100 */
208     "WM_KEYUP",                 /* 0x0101 */
209     "WM_CHAR",                  /* 0x0102 */
210     "WM_DEADCHAR",              /* 0x0103 */
211     "WM_SYSKEYDOWN",            /* 0x0104 */
212     "WM_SYSKEYUP",              /* 0x0105 */
213     "WM_SYSCHAR",               /* 0x0106 */
214     "WM_SYSDEADCHAR",           /* 0x0107 */
215     "WM_KEYLAST",               /* 0x0108 */
216     NULL, 
217     "WM_CONVERTREQUEST",
218     "WM_CONVERTRESULT", 
219     "WM_INTERIM", NULL, NULL, NULL,
220
221     "WM_INITDIALOG",            /* 0x0110 */
222     "WM_COMMAND",               /* 0x0111 */
223     "WM_SYSCOMMAND",            /* 0x0112 */
224     "WM_TIMER",                 /* 0x0113 */
225     "WM_HSCROLL",               /* 0x0114 */
226     "WM_VSCROLL",               /* 0x0115 */
227     "WM_INITMENU",              /* 0x0116 */
228     "WM_INITMENUPOPUP",         /* 0x0117 */
229     "WM_SYSTIMER",              /* 0x0118 */
230     NULL, NULL, NULL, NULL, NULL, NULL,
231     "WM_MENUSELECT",            /* 0x011f */
232
233     "WM_MENUCHAR",              /* 0x0120 */
234     "WM_ENTERIDLE",             /* 0x0121 */
235     NULL, NULL, NULL, NULL, NULL, NULL,
236     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
237
238     /* 0x0130 */
239     NULL,
240     "wm_lbtrackpoint",          /* 0x0131 */
241     "WM_CTLCOLORMSGBOX",        /* 0x0132 */
242     "WM_CTLCOLOREDIT",          /* 0x0133 */
243     "WM_CTLCOLORLISTBOX",       /* 0x0134 */
244     "WM_CTLCOLORBTN",           /* 0x0135 */
245     "WM_CTLCOLORDLG",           /* 0x0136 */
246     "WM_CTLCOLORSCROLLBAR",     /* 0x0137 */
247     "WM_CTLCOLORSTATIC",        /* 0x0138 */
248     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
249
250     /* 0x0140 - Win32 Comboboxes */
251     "CB_GETEDITSEL32",          /* 0x0140 */
252     "CB_LIMITTEXT32",           /* 0x0141 */
253     "CB_SETEDITSEL32",          /* 0x0142 */
254     "CB_ADDSTRING32",           /* 0x0143 */
255     "CB_DELETESTRING32",        /* 0x0144 */
256     "CB_DIR32",                 /* 0x0145 */
257     "CB_GETCOUNT32",            /* 0x0146 */
258     "CB_GETCURSEL32",           /* 0x0147 */
259     "CB_GETLBTEXT32",           /* 0x0148 */
260     "CB_GETLBTEXTLEN32",        /* 0x0149 */
261     "CB_INSERTSTRING32",        /* 0x014a */
262     "CB_RESETCONTENT32",        /* 0x014b */
263     "CB_FINDSTRING32",          /* 0x014c */
264     "CB_SELECTSTRING32",        /* 0x014d */
265     "CB_SETCURSEL32",           /* 0x014e */
266     "CB_SHOWDROPDOWN32",        /* 0x014f */
267
268     "CB_GETITEMDATA32",         /* 0x0150 */
269     "CB_SETITEMDATA32",         /* 0x0151 */
270     "CB_GETDROPPEDCONTROLRECT32",/* 0x0152 */
271     "CB_SETITEMHEIGHT32",       /* 0x0153 */
272     "CB_GETITEMHEIGHT32",       /* 0x0154 */
273     "CB_SETEXTENDEDUI32",       /* 0x0155 */
274     "CB_GETEXTENDEDUI32",       /* 0x0156 */
275     "CB_GETDROPPEDSTATE32",     /* 0x0157 */
276     "CB_FINDSTRINGEXACT32",     /* 0x0158 */
277     "CB_SETLOCALE32",           /* 0x0159 */
278     "CB_GETLOCALE32",           /* 0x015a */
279     "CB_GETTOPINDEX32",         /* 0x015b */
280     "CB_SETTOPINDEX32",         /* 0x015c */
281     "CB_GETHORIZONTALEXTENT32", /* 0x015d */
282     "CB_SETHORIZONTALEXTENT32", /* 0x015e */
283     "CB_GETDROPPEDWIDTH32",     /* 0x015f */
284
285     "CB_SETDROPPEDWIDTH32",     /* 0x0160 */
286     "CB_INITSTORAGE32",         /* 0x0161 */
287     NULL, NULL, NULL, NULL, NULL, NULL,
288     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
289
290     /* 0x0170 - Win32 Static controls */
291     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
292     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
293
294     /* 0x0180 - Win32 Listboxes */
295     "LB_ADDSTRING32",           /* 0x0180 */
296     "LB_INSERTSTRING32",        /* 0x0181 */
297     "LB_DELETESTRING32",        /* 0x0182 */
298     "LB_SELITEMRANGEEX32",      /* 0x0183 */
299     "LB_RESETCONTENT32",        /* 0x0184 */
300     "LB_SETSEL32",              /* 0x0185 */
301     "LB_SETCURSEL32",           /* 0x0186 */
302     "LB_GETSEL32",              /* 0x0187 */
303     "LB_GETCURSEL32",           /* 0x0188 */
304     "LB_GETTEXT32",             /* 0x0189 */
305     "LB_GETTEXTLEN32",          /* 0x018a */
306     "LB_GETCOUNT32",            /* 0x018b */
307     "LB_SELECTSTRING32",        /* 0x018c */
308     "LB_DIR32",                 /* 0x018d */
309     "LB_GETTOPINDEX32",         /* 0x018e */
310     "LB_FINDSTRING32",          /* 0x018f */
311
312     "LB_GETSELCOUNT32",         /* 0x0190 */
313     "LB_GETSELITEMS32",         /* 0x0191 */
314     "LB_SETTABSTOPS32",         /* 0x0192 */
315     "LB_GETHORIZONTALEXTENT32", /* 0x0193 */
316     "LB_SETHORIZONTALEXTENT32", /* 0x0194 */
317     "LB_SETCOLUMNWIDTH32",      /* 0x0195 */
318     "LB_ADDFILE32",             /* 0x0196 */
319     "LB_SETTOPINDEX32",         /* 0x0197 */
320     "LB_GETITEMRECT32",         /* 0x0198 */
321     "LB_GETITEMDATA32",         /* 0x0199 */
322     "LB_SETITEMDATA32",         /* 0x019a */
323     "LB_SELITEMRANGE32",        /* 0x019b */
324     "LB_SETANCHORINDEX32",      /* 0x019c */
325     "LB_GETANCHORINDEX32",      /* 0x019d */
326     "LB_SETCARETINDEX32",       /* 0x019e */
327     "LB_GETCARETINDEX32",       /* 0x019f */
328
329     "LB_SETITEMHEIGHT32",       /* 0x01a0 */
330     "LB_GETITEMHEIGHT32",       /* 0x01a1 */
331     "LB_FINDSTRINGEXACT32",     /* 0x01a2 */
332     "LB_CARETON32",             /* 0x01a3 */
333     "LB_CARETOFF32",            /* 0x01a4 */
334     "LB_SETLOCALE32",           /* 0x01a5 */
335     "LB_GETLOCALE32",           /* 0x01a6 */
336     "LB_SETCOUNT32",            /* 0x01a7 */
337     "LB_INITSTORAGE32",         /* 0x01a8 */
338     "LB_ITEMFROMPOINT32",       /* 0x01a9 */
339     NULL, NULL, NULL, NULL, NULL, NULL,
340
341     /* 0x01B0 */
342     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
343     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
344
345     /* 0x01C0 */
346     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
347     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
348
349     /* 0x01D0 */
350     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
351     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
352
353     /* 0x01E0 */
354     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
355     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
356
357     /* 0x01F0 */
358     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
359     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
360
361     "WM_MOUSEMOVE",             /* 0x0200 */
362     "WM_LBUTTONDOWN",           /* 0x0201 */
363     "WM_LBUTTONUP",             /* 0x0202 */
364     "WM_LBUTTONDBLCLK",         /* 0x0203 */
365     "WM_RBUTTONDOWN",           /* 0x0204 */
366     "WM_RBUTTONUP",             /* 0x0205 */
367     "WM_RBUTTONDBLCLK",         /* 0x0206 */
368     "WM_MBUTTONDOWN",           /* 0x0207 */
369     "WM_MBUTTONUP",             /* 0x0208 */
370     "WM_MBUTTONDBLCLK",         /* 0x0209 */
371     NULL, NULL, NULL, NULL, NULL, NULL,
372
373     "WM_PARENTNOTIFY",          /* 0x0210 */
374     "WM_ENTERMENULOOP",         /* 0x0211 */
375     "WM_EXITMENULOOP",          /* 0x0212 */
376     "wm_nextmenu",              /* 0x0213 */
377                             NULL, NULL, NULL, NULL,
378     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
379
380     "WM_MDICREATE",             /* 0x0220 */
381     "WM_MDIDESTROY",            /* 0x0221 */
382     "WM_MDIACTIVATE",           /* 0x0222 */
383     "WM_MDIRESTORE",            /* 0x0223 */
384     "WM_MDINEXT",               /* 0x0224 */
385     "WM_MDIMAXIMIZE",           /* 0x0225 */
386     "WM_MDITILE",               /* 0x0226 */
387     "WM_MDICASCADE",            /* 0x0227 */
388     "WM_MDIICONARRANGE",        /* 0x0228 */
389     "WM_MDIGETACTIVE",          /* 0x0229 */
390
391     "wm_dropobject", 
392     "wm_querydropobject", 
393     "wm_begindrag",
394     "wm_dragloop",
395     "wn_dragselect",
396     "wm_dragmove",
397      
398     /* 0x0230*/
399     "WM_MDISETMENU",            /* 0x0230 */
400     "WM_ENTERSIZEMOVE",         /* 0x0231 */
401     "WM_EXITSIZEMOVE",          /* 0x0232 */
402     "WM_DROPFILES",             /* 0x0233 */
403     "WM_MDIREFRESHMENU", NULL, NULL, NULL, 
404     /* 0x0238*/
405     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
406     
407     /* 0x0240 */
408     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
409     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
410
411     /* 0x0250 */
412     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
413     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
414     
415     /* 0x0260 */
416     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
417     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
418     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
419     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
420
421     /* 0x0280 */
422     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
423     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
424     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
425     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
426
427     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
428     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
429     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
430     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
431
432     /* 0x02c0 */
433     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
434     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
435     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
436     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
437
438     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
439     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
440     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
441     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
442
443     "WM_CUT",                   /* 0x0300 */
444     "WM_COPY", 
445     "WM_PASTE", 
446     "WM_CLEAR", 
447     "WM_UNDO", 
448     "WM_RENDERFORMAT", 
449     "WM_RENDERALLFORMATS", 
450     "WM_DESTROYCLIPBOARD",
451     "WM_DRAWCLIPBOARD", 
452     "WM_PAINTCLIPBOARD", 
453     "WM_VSCROLLCLIPBOARD", 
454     "WM_SIZECLIPBOARD", 
455     "WM_ASKCBFORMATNAME", 
456     "WM_CHANGECBCHAIN",
457     "WM_HSCROLLCLIPBOARD",
458     "WM_QUERYNEWPALETTE",       /* 0x030f*/
459
460     "WM_PALETTEISCHANGING",
461     "WM_PALETTECHANGED",
462     "WM_HOTKEY",                /* 0x0312 */
463           NULL, NULL, NULL, NULL, NULL, NULL, 
464     NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
465
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,
469     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
470
471     /* 0x0340 */
472     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
473     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
474     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
475     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
476
477     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
478     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
479     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
480     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
481
482     /* 0x0380 */
483     "WM_PENWINFIRST", 
484     "WM_RCRESULT", 
485     "WM_HOOKRCRESULT", 
486     "WM_GLOBALRCCHANGE", 
487     "WM_SKB", 
488     "WM_HEDITCTL", 
489                                         NULL, NULL,
490     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
491
492     "WM_COALESCE_FIRST", 
493           NULL, NULL, NULL, NULL, NULL, NULL, NULL,
494     NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
495     "WM_COALESCE_LAST", 
496
497     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
498     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
499     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
500     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
501
502     /* 0x03c0 */
503     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
504     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
505     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
506     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
507
508     /* 0x03e0 */
509     "WM_DDE_INITIATE",  /* 0x3E0 */
510     "WM_DDE_TERMINATE", /* 0x3E1 */
511     "WM_DDE_ADVISE",    /* 0x3E2 */
512     "WM_DDE_UNADVISE",  /* 0x3E3 */
513     "WM_DDE_ACK",       /* 0x3E4 */
514     "WM_DDE_DATA",      /* 0x3E5 */
515     "WM_DDE_REQUEST",   /* 0x3E6 */
516     "WM_DDE_POKE",      /* 0x3E7 */
517     "WM_DDE_EXECUTE",   /* 0x3E8 */
518     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
519
520     
521     /* 0x03f0 */
522     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
523     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
524
525     "WM_USER"
526 };
527
528
529 static BOOL16 SPY_Exclude[SPY_MAX_MSGNUM+1];
530 static int SPY_IndentLevel  = 0;
531
532 #define SPY_EXCLUDE(msg) \
533     (SPY_Exclude[(msg) > SPY_MAX_MSGNUM ? SPY_MAX_MSGNUM : (msg)])
534
535 /***********************************************************************
536  *           SPY_GetMsgName
537  */
538 const char *SPY_GetMsgName( UINT32 msg )
539 {
540     static char buffer[20];
541
542     if (msg <= SPY_MAX_MSGNUM)
543     {
544         if (!MessageTypeNames[msg]) return "???";
545         return MessageTypeNames[msg];
546     }
547     sprintf( buffer, "WM_USER+%04x", msg - WM_USER );
548     return buffer;
549 }
550
551
552 /***********************************************************************
553  *           SPY_EnterMessage
554  */
555 void SPY_EnterMessage( INT32 iFlag, HWND32 hWnd, UINT32 msg,
556                        WPARAM32 wParam, LPARAM lParam )
557 {
558     if (!debugging_message || SPY_EXCLUDE(msg)) return;
559
560     /* each SPY_SENDMESSAGE must be complemented by call to SPY_ExitMessage */
561     switch(iFlag)
562     {
563     case SPY_DISPATCHMESSAGE16:
564         dprintf_message(stddeb,"%*s(%04x) message [%04x] %s dispatched  wp=%04x lp=%08lx\n",
565                         SPY_IndentLevel, "", hWnd, msg, SPY_GetMsgName( msg ),
566                         wParam, lParam);
567         break;
568
569     case SPY_DISPATCHMESSAGE32:
570         dprintf_message(stddeb,"%*s(%08x) message [%04x] %s dispatched  wp=%08x lp=%08lx\n",
571                         SPY_IndentLevel, "", hWnd, msg, SPY_GetMsgName( msg ),
572                         wParam, lParam);
573         break;
574
575     case SPY_SENDMESSAGE16:
576     case SPY_SENDMESSAGE32:
577         {
578             char taskName[30];
579             HTASK16 hTask = GetWindowTask16(hWnd);
580             if (hTask == GetCurrentTask()) strcpy( taskName, "self" );
581             else if (!hTask) strcpy( taskName, "Wine" );
582             else sprintf( taskName, "task %04x %s",
583                           hTask, MODULE_GetModuleName( GetExePtr(hTask) ) );
584
585             if (iFlag == SPY_SENDMESSAGE16)
586                 dprintf_message(stddeb,"%*s(%04x) message [%04x] %s sent from %s wp=%04x lp=%08lx\n",
587                                 SPY_IndentLevel, "", hWnd, msg,
588                                 SPY_GetMsgName( msg ), taskName, wParam,
589                                 lParam );
590             else
591                 dprintf_message(stddeb,"%*s(%08x) message [%04x] %s sent from %s wp=%08x lp=%08lx\n",
592                                 SPY_IndentLevel, "", hWnd, msg,
593                                 SPY_GetMsgName( msg ), taskName, wParam,
594                                 lParam );
595         }
596         break;   
597
598     case SPY_DEFWNDPROC16:
599         dprintf_message(stddeb, "%*s(%04x) DefWindowProc: %s [%04x]  wp=%04x lp=%08lx\n",
600                         SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ),
601                         msg, wParam, lParam );
602         break;
603
604     case SPY_DEFWNDPROC32:
605         dprintf_message(stddeb, "%*s(%08x) DefWindowProc: %s [%04x]  wp=%08x lp=%08lx\n",
606                         SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ),
607                         msg, wParam, lParam );
608         break;
609     }  
610     SPY_IndentLevel += SPY_INDENT_UNIT;
611 }
612
613
614 /***********************************************************************
615  *           SPY_ExitMessage
616  */
617 void SPY_ExitMessage( INT32 iFlag, HWND32 hWnd, UINT32 msg, LRESULT lReturn )
618 {
619     if (!debugging_message || SPY_EXCLUDE(msg)) return;
620     if (SPY_IndentLevel) SPY_IndentLevel -= SPY_INDENT_UNIT;
621
622     switch(iFlag)
623     {
624     case SPY_RESULT_OK16:
625         dprintf_message(stddeb,"%*s(%04x) message [%04x] %s returned %08lx\n",
626                         SPY_IndentLevel, "", hWnd, msg,
627                         SPY_GetMsgName( msg ), lReturn );
628         break;
629     case SPY_RESULT_OK32:
630         dprintf_message(stddeb,"%*s(%08x) message [%04x] %s returned %08lx\n",
631                         SPY_IndentLevel, "", hWnd, msg,
632                         SPY_GetMsgName( msg ), lReturn );
633         break; 
634     case SPY_RESULT_INVALIDHWND16:
635         dprintf_message(stddeb,"%*s(%04x) message [%04x] %s HAS INVALID HWND\n",
636                         SPY_IndentLevel, "", hWnd, msg,
637                         SPY_GetMsgName( msg ) );
638         break;
639     case SPY_RESULT_INVALIDHWND32:
640         dprintf_message(stddeb,"%*s(%08x) message [%04x] %s HAS INVALID HWND\n",
641                         SPY_IndentLevel, "", hWnd, msg,
642                         SPY_GetMsgName( msg ) );
643         break;
644    }
645 }
646
647
648 /***********************************************************************
649  *           SPY_Init
650  */
651 int SPY_Init(void)
652 {
653     int i;
654     char buffer[512];
655
656     PROFILE_GetWineIniString( "Spy", "Include", "", buffer, sizeof(buffer) );
657     if (buffer[0] && strcmp( buffer, "INCLUDEALL" ))
658     {
659         dprintf_message( stddeb, "SpyInit: Include=%s\n", buffer );
660         for (i = 0; i <= SPY_MAX_MSGNUM; i++)
661             SPY_Exclude[i] = (MessageTypeNames[i] && !strstr(buffer,MessageTypeNames[i]));
662     }
663
664     PROFILE_GetWineIniString( "Spy", "Exclude", "", buffer, sizeof(buffer) );
665     if (buffer[0])
666     {
667         dprintf_message( stddeb, "SpyInit: Exclude=%s\n", buffer );
668         if (!strcmp( buffer, "EXCLUDEALL" ))
669             for (i = 0; i <= SPY_MAX_MSGNUM; i++) SPY_Exclude[i] = TRUE;
670         else
671             for (i = 0; i <= SPY_MAX_MSGNUM; i++)
672                 SPY_Exclude[i] = (MessageTypeNames[i] && strstr(buffer,MessageTypeNames[i]));
673     }
674     return 1;
675 }