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