Documentation update.
[wine] / windows / 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 <string.h>
10 #include <stdio.h>
11 #include "windef.h"
12 #include "wingdi.h"
13 #include "wine/winuser16.h"
14 #include "wine/winbase16.h"
15 #include "win.h"
16 #include "options.h"
17 #include "debugtools.h"
18 #include "spy.h"
19 #include "commctrl.h"
20
21 DEFAULT_DEBUG_CHANNEL(message);
22
23 #define SPY_MAX_MSGNUM   WM_USER
24 #define SPY_INDENT_UNIT  4  /* 4 spaces */
25
26 static const char * const MessageTypeNames[SPY_MAX_MSGNUM + 1] =
27 {
28     "wm_null",                  /* 0x00 */
29     "WM_CREATE",        
30     "WM_DESTROY",    
31     "WM_MOVE",
32     "wm_sizewait",
33     "WM_SIZE",
34     "WM_ACTIVATE",
35     "WM_SETFOCUS",
36     "WM_KILLFOCUS",
37     "WM_SETVISIBLE",
38     "WM_ENABLE",
39     "WM_SETREDRAW",
40     "WM_SETTEXT",
41     "WM_GETTEXT",
42     "WM_GETTEXTLENGTH",
43     "WM_PAINT",
44     "WM_CLOSE",                 /* 0x10 */
45     "WM_QUERYENDSESSION",
46     "WM_QUIT",
47     "WM_QUERYOPEN",
48     "WM_ERASEBKGND",
49     "WM_SYSCOLORCHANGE",
50     "WM_ENDSESSION",
51     "wm_systemerror",
52     "WM_SHOWWINDOW",
53     "WM_CTLCOLOR",
54     "WM_WININICHANGE",
55     "WM_DEVMODECHANGE",
56     "WM_ACTIVATEAPP",
57     "WM_FONTCHANGE",
58     "WM_TIMECHANGE",
59     "WM_CANCELMODE",
60     "WM_SETCURSOR",             /* 0x20 */
61     "WM_MOUSEACTIVATE",
62     "WM_CHILDACTIVATE",
63     "WM_QUEUESYNC",
64     "WM_GETMINMAXINFO",
65     "wm_unused3",
66     "wm_painticon",
67     "WM_ICONERASEBKGND",
68     "WM_NEXTDLGCTL",
69     "wm_alttabactive",
70     "WM_SPOOLERSTATUS",
71     "WM_DRAWITEM",
72     "WM_MEASUREITEM",
73     "WM_DELETEITEM",
74     "WM_VKEYTOITEM",
75     "WM_CHARTOITEM",
76     "WM_SETFONT",               /* 0x30 */
77     "WM_GETFONT",
78     "WM_SETHOTKEY", 
79     "WM_GETHOTKEY", 
80     "wm_filesyschange", 
81     "wm_isactiveicon",
82     "wm_queryparkicon",
83     "WM_QUERYDRAGICON",
84     "wm_querysavestate",
85     "WM_COMPAREITEM", 
86     "wm_testing",
87     NULL, 
88     "wm_otherwindowcreated", 
89     "wm_otherwindowdestroyed", 
90     "wm_activateshellwindow",
91     NULL,
92
93     NULL,                       /* 0x40 */
94     "wm_compacting", NULL, NULL, 
95     "WM_COMMNOTIFY", NULL, 
96     "WM_WINDOWPOSCHANGING",     /* 0x0046 */
97     "WM_WINDOWPOSCHANGED",      /* 0x0047 */
98     "WM_POWER", NULL, 
99     "WM_COPYDATA", 
100     "WM_CANCELJOURNAL", NULL, NULL, 
101     "WM_NOTIFY", NULL,
102
103     /* 0x0050 */
104     "WM_INPUTLANGCHANGEREQUEST",
105     "WM_INPUTLANGCHANGE", 
106     "WM_TCARD", 
107     "WM_HELP", 
108     "WM_USERCHANGED", 
109     "WM_NOTIFYFORMAT", NULL, NULL, 
110     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
111
112     /* 0x0060 */
113     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
114     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
115
116     /* 0x0070 */
117     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
118     NULL, NULL, NULL, 
119     "WM_CONTEXTMENU", 
120     "WM_STYLECHANGING", 
121     "WM_STYLECHANGED", 
122     "WM_DISPLAYCHANGE", 
123     "WM_GETICON",
124
125     "WM_SETICON",               /* 0x0080 */
126     "WM_NCCREATE",              /* 0x0081 */
127     "WM_NCDESTROY",             /* 0x0082 */
128     "WM_NCCALCSIZE",            /* 0x0083 */
129     "WM_NCHITTEST",             /* 0x0084 */
130     "WM_NCPAINT",               /* 0x0085 */
131     "WM_NCACTIVATE",            /* 0x0086 */
132     "WM_GETDLGCODE",            /* 0x0087 */
133     "WM_SYNCPAINT", 
134     "WM_SYNCTASK", NULL, NULL, NULL, NULL, NULL, NULL,
135
136     /* 0x0090 */
137     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
138     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
139
140     /* 0x00A0 */
141     "WM_NCMOUSEMOVE",           /* 0x00A0 */
142     "WM_NCLBUTTONDOWN",         /* 0x00A1 */
143     "WM_NCLBUTTONUP",           /* 0x00A2 */
144     "WM_NCLBUTTONDBLCLK",       /* 0x00A3 */
145     "WM_NCRBUTTONDOWN",         /* 0x00A4 */
146     "WM_NCRBUTTONUP",           /* 0x00A5 */
147     "WM_NCRBUTTONDBLCLK",       /* 0x00A6 */
148     "WM_NCMBUTTONDOWN",         /* 0x00A7 */
149     "WM_NCMBUTTONUP",           /* 0x00A8 */
150     "WM_NCMBUTTONDBLCLK",       /* 0x00A9 */
151     NULL, NULL, NULL, NULL, NULL, NULL,
152
153     /* 0x00B0 - Win32 Edit controls */
154     "EM_GETSEL32",              /* 0x00b0 */
155     "EM_SETSEL32",              /* 0x00b1 */
156     "EM_GETRECT32",             /* 0x00b2 */
157     "EM_SETRECT32",             /* 0x00b3 */
158     "EM_SETRECTNP32",           /* 0x00b4 */
159     "EM_SCROLL32",              /* 0x00b5 */
160     "EM_LINESCROLL32",          /* 0x00b6 */
161     "EM_SCROLLCARET32",         /* 0x00b7 */
162     "EM_GETMODIFY32",           /* 0x00b8 */
163     "EM_SETMODIFY32",           /* 0x00b9 */
164     "EM_GETLINECOUNT32",        /* 0x00ba */
165     "EM_LINEINDEX32",           /* 0x00bb */
166     "EM_SETHANDLE32",           /* 0x00bc */
167     "EM_GETHANDLE32",           /* 0x00bd */
168     "EM_GETTHUMB32",            /* 0x00be */
169     NULL,                       /* 0x00bf */
170
171     NULL,                       /* 0x00c0 */
172     "EM_LINELENGTH32",          /* 0x00c1 */
173     "EM_REPLACESEL32",          /* 0x00c2 */
174     NULL,                       /* 0x00c3 */
175     "EM_GETLINE32",             /* 0x00c4 */
176     "EM_LIMITTEXT32",           /* 0x00c5 */
177     "EM_CANUNDO32",             /* 0x00c6 */
178     "EM_UNDO32",                /* 0x00c7 */
179     "EM_FMTLINES32",            /* 0x00c8 */
180     "EM_LINEFROMCHAR32",        /* 0x00c9 */
181     NULL,                       /* 0x00ca */
182     "EM_SETTABSTOPS32",         /* 0x00cb */
183     "EM_SETPASSWORDCHAR32",     /* 0x00cc */
184     "EM_EMPTYUNDOBUFFER32",     /* 0x00cd */
185     "EM_GETFIRSTVISIBLELINE32", /* 0x00ce */
186     "EM_SETREADONLY32",         /* 0x00cf */
187
188     "EM_SETWORDBREAKPROC32",    /* 0x00d0 */
189     "EM_GETWORDBREAKPROC32",    /* 0x00d1 */
190     "EM_GETPASSWORDCHAR32",     /* 0x00d2 */
191     "EM_SETMARGINS32",          /* 0x00d3 */
192     "EM_GETMARGINS32",          /* 0x00d4 */
193     "EM_GETLIMITTEXT32",        /* 0x00d5 */
194     "EM_POSFROMCHAR32",         /* 0x00d6 */
195     "EM_CHARFROMPOS32",         /* 0x00d7 */
196     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
197
198     /* 0x00E0 - Win32 Scrollbars */
199     "SBM_SETPOS32",             /* 0x00e0 */
200     "SBM_GETPOS32",             /* 0x00e1 */
201     "SBM_SETRANGE32",           /* 0x00e2 */
202     "SBM_GETRANGE32",           /* 0x00e3 */
203     "SBM_ENABLE_ARROWS32",      /* 0x00e4 */
204     NULL,
205     "SBM_SETRANGEREDRAW32",     /* 0x00e6 */
206     NULL, NULL,
207     "SBM_SETSCROLLINFO32",      /* 0x00e9 */
208     "SBM_GETSCROLLINFO32",      /* 0x00ea */
209     NULL, NULL, NULL, NULL, NULL,
210
211     /* 0x00F0 - Win32 Buttons */
212     "BM_GETCHECK32",            /* 0x00f0 */
213     "BM_SETCHECK32",            /* 0x00f1 */
214     "BM_GETSTATE32",            /* 0x00f2 */
215     "BM_SETSTATE32",            /* 0x00f3 */
216     "BM_SETSTYLE32",            /* 0x00f4 */
217     "BM_CLICK32",               /* 0x00f5 */
218     "BM_GETIMAGE32",            /* 0x00f6 */
219     "BM_SETIMAGE32",            /* 0x00f7 */
220     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
221
222     "WM_KEYDOWN",               /* 0x0100 */
223     "WM_KEYUP",                 /* 0x0101 */
224     "WM_CHAR",                  /* 0x0102 */
225     "WM_DEADCHAR",              /* 0x0103 */
226     "WM_SYSKEYDOWN",            /* 0x0104 */
227     "WM_SYSKEYUP",              /* 0x0105 */
228     "WM_SYSCHAR",               /* 0x0106 */
229     "WM_SYSDEADCHAR",           /* 0x0107 */
230     "WM_KEYLAST",               /* 0x0108 */
231     NULL,
232     "WM_CONVERTREQUEST",
233     "WM_CONVERTRESULT",
234     "WM_INTERIM",
235     "WM_IME_STARTCOMPOSITION",  /* 0x010d */
236     "WM_IME_ENDCOMPOSITION",    /* 0x010e */
237     "WM_IME_COMPOSITION",       /* 0x010f */
238
239     "WM_INITDIALOG",            /* 0x0110 */
240     "WM_COMMAND",               /* 0x0111 */
241     "WM_SYSCOMMAND",            /* 0x0112 */
242     "WM_TIMER",                 /* 0x0113 */
243     "WM_HSCROLL",               /* 0x0114 */
244     "WM_VSCROLL",               /* 0x0115 */
245     "WM_INITMENU",              /* 0x0116 */
246     "WM_INITMENUPOPUP",         /* 0x0117 */
247     "WM_SYSTIMER",              /* 0x0118 */
248     NULL, NULL, NULL, NULL, NULL, NULL,
249     "WM_MENUSELECT",            /* 0x011f */
250
251     "WM_MENUCHAR",              /* 0x0120 */
252     "WM_ENTERIDLE",             /* 0x0121 */
253     NULL, NULL, NULL, NULL, NULL, NULL,
254     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
255
256     /* 0x0130 */
257     NULL,
258     "WM_LBTRACKPOINT",          /* 0x0131 */
259     "WM_CTLCOLORMSGBOX",        /* 0x0132 */
260     "WM_CTLCOLOREDIT",          /* 0x0133 */
261     "WM_CTLCOLORLISTBOX",       /* 0x0134 */
262     "WM_CTLCOLORBTN",           /* 0x0135 */
263     "WM_CTLCOLORDLG",           /* 0x0136 */
264     "WM_CTLCOLORSCROLLBAR",     /* 0x0137 */
265     "WM_CTLCOLORSTATIC",        /* 0x0138 */
266     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
267
268     /* 0x0140 - Win32 Comboboxes */
269     "CB_GETEDITSEL32",          /* 0x0140 */
270     "CB_LIMITTEXT32",           /* 0x0141 */
271     "CB_SETEDITSEL32",          /* 0x0142 */
272     "CB_ADDSTRING32",           /* 0x0143 */
273     "CB_DELETESTRING32",        /* 0x0144 */
274     "CB_DIR32",                 /* 0x0145 */
275     "CB_GETCOUNT32",            /* 0x0146 */
276     "CB_GETCURSEL32",           /* 0x0147 */
277     "CB_GETLBTEXT32",           /* 0x0148 */
278     "CB_GETLBTEXTLEN32",        /* 0x0149 */
279     "CB_INSERTSTRING32",        /* 0x014a */
280     "CB_RESETCONTENT32",        /* 0x014b */
281     "CB_FINDSTRING32",          /* 0x014c */
282     "CB_SELECTSTRING32",        /* 0x014d */
283     "CB_SETCURSEL32",           /* 0x014e */
284     "CB_SHOWDROPDOWN32",        /* 0x014f */
285
286     "CB_GETITEMDATA32",         /* 0x0150 */
287     "CB_SETITEMDATA32",         /* 0x0151 */
288     "CB_GETDROPPEDCONTROLRECT32",/* 0x0152 */
289     "CB_SETITEMHEIGHT32",       /* 0x0153 */
290     "CB_GETITEMHEIGHT32",       /* 0x0154 */
291     "CB_SETEXTENDEDUI32",       /* 0x0155 */
292     "CB_GETEXTENDEDUI32",       /* 0x0156 */
293     "CB_GETDROPPEDSTATE32",     /* 0x0157 */
294     "CB_FINDSTRINGEXACT32",     /* 0x0158 */
295     "CB_SETLOCALE32",           /* 0x0159 */
296     "CB_GETLOCALE32",           /* 0x015a */
297     "CB_GETTOPINDEX32",         /* 0x015b */
298     "CB_SETTOPINDEX32",         /* 0x015c */
299     "CB_GETHORIZONTALEXTENT32", /* 0x015d */
300     "CB_SETHORIZONTALEXTENT32", /* 0x015e */
301     "CB_GETDROPPEDWIDTH32",     /* 0x015f */
302
303     "CB_SETDROPPEDWIDTH32",     /* 0x0160 */
304     "CB_INITSTORAGE32",         /* 0x0161 */
305     NULL, NULL, NULL, NULL, NULL, NULL,
306     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
307
308     /* 0x0170 - Win32 Static controls */
309     "STM_SETICON32",            /* 0x0170 */
310     "STM_GETICON32",            /* 0x0171 */
311     "STM_SETIMAGE32",           /* 0x0172 */
312     "STM_GETIMAGE32",           /* 0x0173 */
313     NULL, NULL, NULL, NULL, 
314     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
315
316     /* 0x0180 - Win32 Listboxes */
317     "LB_ADDSTRING32",           /* 0x0180 */
318     "LB_INSERTSTRING32",        /* 0x0181 */
319     "LB_DELETESTRING32",        /* 0x0182 */
320     "LB_SELITEMRANGEEX32",      /* 0x0183 */
321     "LB_RESETCONTENT32",        /* 0x0184 */
322     "LB_SETSEL32",              /* 0x0185 */
323     "LB_SETCURSEL32",           /* 0x0186 */
324     "LB_GETSEL32",              /* 0x0187 */
325     "LB_GETCURSEL32",           /* 0x0188 */
326     "LB_GETTEXT32",             /* 0x0189 */
327     "LB_GETTEXTLEN32",          /* 0x018a */
328     "LB_GETCOUNT32",            /* 0x018b */
329     "LB_SELECTSTRING32",        /* 0x018c */
330     "LB_DIR32",                 /* 0x018d */
331     "LB_GETTOPINDEX32",         /* 0x018e */
332     "LB_FINDSTRING32",          /* 0x018f */
333
334     "LB_GETSELCOUNT32",         /* 0x0190 */
335     "LB_GETSELITEMS32",         /* 0x0191 */
336     "LB_SETTABSTOPS32",         /* 0x0192 */
337     "LB_GETHORIZONTALEXTENT32", /* 0x0193 */
338     "LB_SETHORIZONTALEXTENT32", /* 0x0194 */
339     "LB_SETCOLUMNWIDTH32",      /* 0x0195 */
340     "LB_ADDFILE32",             /* 0x0196 */
341     "LB_SETTOPINDEX32",         /* 0x0197 */
342     "LB_GETITEMRECT32",         /* 0x0198 */
343     "LB_GETITEMDATA32",         /* 0x0199 */
344     "LB_SETITEMDATA32",         /* 0x019a */
345     "LB_SELITEMRANGE32",        /* 0x019b */
346     "LB_SETANCHORINDEX32",      /* 0x019c */
347     "LB_GETANCHORINDEX32",      /* 0x019d */
348     "LB_SETCARETINDEX32",       /* 0x019e */
349     "LB_GETCARETINDEX32",       /* 0x019f */
350
351     "LB_SETITEMHEIGHT32",       /* 0x01a0 */
352     "LB_GETITEMHEIGHT32",       /* 0x01a1 */
353     "LB_FINDSTRINGEXACT32",     /* 0x01a2 */
354     "LB_CARETON32",             /* 0x01a3 */
355     "LB_CARETOFF32",            /* 0x01a4 */
356     "LB_SETLOCALE32",           /* 0x01a5 */
357     "LB_GETLOCALE32",           /* 0x01a6 */
358     "LB_SETCOUNT32",            /* 0x01a7 */
359     "LB_INITSTORAGE32",         /* 0x01a8 */
360     "LB_ITEMFROMPOINT32",       /* 0x01a9 */
361     NULL, NULL, NULL, NULL, NULL, NULL,
362
363     /* 0x01B0 */
364     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
365     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
366
367     /* 0x01C0 */
368     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
369     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
370
371     /* 0x01D0 */
372     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
373     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
374
375     /* 0x01E0 */
376     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
377     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
378
379     /* 0x01F0 */
380     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
381     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
382
383     "WM_MOUSEMOVE",             /* 0x0200 */
384     "WM_LBUTTONDOWN",           /* 0x0201 */
385     "WM_LBUTTONUP",             /* 0x0202 */
386     "WM_LBUTTONDBLCLK",         /* 0x0203 */
387     "WM_RBUTTONDOWN",           /* 0x0204 */
388     "WM_RBUTTONUP",             /* 0x0205 */
389     "WM_RBUTTONDBLCLK",         /* 0x0206 */
390     "WM_MBUTTONDOWN",           /* 0x0207 */
391     "WM_MBUTTONUP",             /* 0x0208 */
392     "WM_MBUTTONDBLCLK",         /* 0x0209 */
393     "WM_MOUSEWHEEL",            /* 0x020A */
394     NULL, NULL, NULL, NULL, NULL,
395
396     "WM_PARENTNOTIFY",          /* 0x0210 */
397     "WM_ENTERMENULOOP",         /* 0x0211 */
398     "WM_EXITMENULOOP",          /* 0x0212 */
399     "WM_NEXTMENU",              /* 0x0213 */
400     "WM_SIZING", 
401     "WM_CAPTURECHANGED",
402     "WM_MOVING", NULL,
403     "WM_POWERBROADCAST", 
404     "WM_DEVICECHANGE", NULL, NULL, NULL, NULL, NULL, NULL,
405
406     "WM_MDICREATE",             /* 0x0220 */
407     "WM_MDIDESTROY",            /* 0x0221 */
408     "WM_MDIACTIVATE",           /* 0x0222 */
409     "WM_MDIRESTORE",            /* 0x0223 */
410     "WM_MDINEXT",               /* 0x0224 */
411     "WM_MDIMAXIMIZE",           /* 0x0225 */
412     "WM_MDITILE",               /* 0x0226 */
413     "WM_MDICASCADE",            /* 0x0227 */
414     "WM_MDIICONARRANGE",        /* 0x0228 */
415     "WM_MDIGETACTIVE",          /* 0x0229 */
416
417     "WM_DROPOBJECT", 
418     "WM_QUERYDROPOBJECT", 
419     "WM_BEGINDRAG",
420     "WM_DRAGLOOP",
421     "WM_DRAGSELECT",
422     "WM_DRAGMOVE",
423      
424     /* 0x0230*/
425     "WM_MDISETMENU",            /* 0x0230 */
426     "WM_ENTERSIZEMOVE",         /* 0x0231 */
427     "WM_EXITSIZEMOVE",          /* 0x0232 */
428     "WM_DROPFILES",             /* 0x0233 */
429     "WM_MDIREFRESHMENU", NULL, NULL, NULL, 
430     /* 0x0238*/
431     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
432     
433     /* 0x0240 */
434     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
435     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
436
437     /* 0x0250 */
438     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
439     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
440     
441     /* 0x0260 */
442     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
443     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
444     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
445     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
446
447     /* 0x0280 */
448     NULL, "WM_IME_SETCONTEXT", "WM_IME_NOTIFY", "WM_IME_CONTROL", "WM_IME_COMPOSITIONFULL", "WM_IME_SELECT", "WM_IME_CHAR", NULL,
449     "WM_IME_REQUEST", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
450     "WM_IME_KEYDOWN", "WM_IME_KEYUP", NULL, NULL, NULL, NULL, NULL, NULL,
451     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
452
453     /* 0x02a0 */
454     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
455     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
456     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
457     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
458
459     /* 0x02c0 */
460     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
461     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
462     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
463     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
464
465     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
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
470     "WM_CUT",                   /* 0x0300 */
471     "WM_COPY", 
472     "WM_PASTE", 
473     "WM_CLEAR", 
474     "WM_UNDO", 
475     "WM_RENDERFORMAT", 
476     "WM_RENDERALLFORMATS", 
477     "WM_DESTROYCLIPBOARD",
478     "WM_DRAWCLIPBOARD", 
479     "WM_PAINTCLIPBOARD", 
480     "WM_VSCROLLCLIPBOARD", 
481     "WM_SIZECLIPBOARD", 
482     "WM_ASKCBFORMATNAME", 
483     "WM_CHANGECBCHAIN",
484     "WM_HSCROLLCLIPBOARD",
485     "WM_QUERYNEWPALETTE",       /* 0x030f*/
486
487     "WM_PALETTEISCHANGING",
488     "WM_PALETTECHANGED",
489     "WM_HOTKEY",                /* 0x0312 */
490           NULL, NULL, NULL, NULL, 
491     "WM_PRINT", 
492     "WM_PRINTCLIENT", 
493     NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
494
495     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
496     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
497     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
498     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
499
500     /* 0x0340 */
501     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
502     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
503     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
504     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
505
506     "WM_QUERYAFXWNDPROC",   /*  0x0360 */
507     "WM_SIZEPARENT",        /*  0x0361 */
508     "WM_SETMESSAGESTRING",  /*  0x0362 */
509     "WM_IDLEUPDATECMDUI",   /*  0x0363 */
510     "WM_INITIALUPDATE",     /*  0x0364 */
511     "WM_COMMANDHELP",       /*  0x0365 */
512     "WM_HELPHITTEST",       /*  0x0366 */
513     "WM_EXITHELPMODE",      /*  0x0367 */
514     "WM_RECALCPARENT",      /*  0x0368 */
515     "WM_SIZECHILD",         /*  0x0369 */
516     "WM_KICKIDLE",          /*  0x036A */
517     "WM_QUERYCENTERWND",    /*  0x036B */
518     "WM_DISABLEMODAL",      /*  0x036C */
519     "WM_FLOATSTATUS",       /*  0x036D */
520     "WM_ACTIVATETOPLEVEL",  /*  0x036E */
521     "WM_QUERY3DCONTROLS",   /*  0x036F */
522     NULL,NULL,NULL,
523     "WM_SOCKET_NOTIFY",     /*  0x0373 */
524     "WM_SOCKET_DEAD",       /*  0x0374 */
525     "WM_POPMESSAGESTRING",  /*  0x0375 */
526     "WM_OCC_LOADFROMSTREAM",     /* 0x0376 */
527     "WM_OCC_LOADFROMSTORAGE",    /* 0x0377 */
528     "WM_OCC_INITNEW",            /* 0x0378 */
529     "WM_QUEUE_SENTINEL",         /* 0x0379 */
530     "WM_OCC_LOADFROMSTREAM_EX",  /* 0x037A */
531     "WM_OCC_LOADFROMSTORAGE_EX", /* 0x037B */
532
533     NULL,NULL,NULL,NULL,
534
535     /* 0x0380 */
536     "WM_PENWINFIRST", 
537     "WM_RCRESULT", 
538     "WM_HOOKRCRESULT", 
539     "WM_GLOBALRCCHANGE", 
540     "WM_SKB", 
541     "WM_HEDITCTL", 
542                                         NULL, NULL,
543     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
544
545     "WM_COALESCE_FIRST", 
546           NULL, NULL, NULL, NULL, NULL, NULL, NULL,
547     NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
548     "WM_COALESCE_LAST", 
549     
550     /* 0x03a0 */
551     "MM_JOY1MOVE", 
552     "MM_JOY2MOVE", 
553     "MM_JOY1ZMOVE", 
554     "MM_JOY2ZMOVE", 
555                             NULL, NULL, NULL, NULL,
556     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
557
558     /* 0x03b0 */
559     NULL, NULL, NULL, NULL, NULL, 
560     "MM_JOY1BUTTONDOWN", 
561     "MM_JOY2BUTTONDOWN", 
562     "MM_JOY1BUTTONUP",
563     "MM_JOY2BUTTONUP",
564     "MM_MCINOTIFY",
565                 NULL, 
566     "MM_WOM_OPEN",
567     "MM_WOM_CLOSE",
568     "MM_WOM_DONE",
569     "MM_WIM_OPEN",
570     "MM_WIM_CLOSE",
571
572     /* 0x03c0 */
573     "MM_WIM_DATA",
574     "MM_MIM_OPEN",
575     "MM_MIM_CLOSE",
576     "MM_MIM_DATA",
577     "MM_MIM_LONGDATA",
578     "MM_MIM_ERROR",
579     "MM_MIM_LONGERROR",
580     "MM_MOM_OPEN",
581     "MM_MOM_CLOSE",
582     "MM_MOM_DONE",
583                 NULL, NULL, NULL, NULL, NULL, NULL,
584     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
585     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
586
587     /* 0x03e0 */
588     "WM_DDE_INITIATE",  /* 0x3E0 */
589     "WM_DDE_TERMINATE", /* 0x3E1 */
590     "WM_DDE_ADVISE",    /* 0x3E2 */
591     "WM_DDE_UNADVISE",  /* 0x3E3 */
592     "WM_DDE_ACK",       /* 0x3E4 */
593     "WM_DDE_DATA",      /* 0x3E5 */
594     "WM_DDE_REQUEST",   /* 0x3E6 */
595     "WM_DDE_POKE",      /* 0x3E7 */
596     "WM_DDE_EXECUTE",   /* 0x3E8 */
597     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
598
599     
600     /* 0x03f0 */
601     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
602     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
603
604     "WM_USER"
605 };
606
607
608 #define SPY_MAX_LVMMSGNUM   139
609 static const char * const LVMMessageTypeNames[SPY_MAX_LVMMSGNUM + 1] =
610 {
611     "LVM_GETBKCOLOR",           /* 1000 */
612     "LVM_SETBKCOLOR",
613     "LVM_GETIMAGELIST",
614     "LVM_SETIMAGELIST",
615     "LVM_GETITEMCOUNT",
616     "LVM_GETITEMA",
617     "LVM_SETITEMA",
618     "LVM_INSERTITEMA",
619     "LVM_DELETEITEM",
620     "LVM_DELETEALLITEMS",
621     "LVM_GETCALLBACKMASK",
622     "LVM_SETCALLBACKMASK",
623     "LVM_GETNEXTITEM",
624     "LVM_FINDITEMA",
625     "LVM_GETITEMRECT",
626     "LVM_SETITEMPOSITION",
627     "LVM_GETITEMPOSITION",
628     "LVM_GETSTRINGWIDTHA",
629     "LVM_HITTEST",
630     "LVM_ENSUREVISIBLE",
631     "LVM_SCROLL",
632     "LVM_REDRAWITEMS",
633     "LVM_ARRANGE",
634     "LVM_EDITLABELA",
635     "LVM_GETEDITCONTROL",
636     "LVM_GETCOLUMNA",
637     "LVM_SETCOLUMNA",
638     "LVM_INSERTCOLUMNA",
639     "LVM_DELETECOLUMN",
640     "LVM_GETCOLUMNWIDTH",
641     "LVM_SETCOLUMNWIDTH",
642     "LVM_GETHEADER",
643     "LVM_CREATEDRAGIMAGE",
644     "LVM_GETVIEWRECT",
645     "LVM_GETTEXTCOLOR",
646     "LVM_SETTEXTCOLOR",
647     "LVM_GETTEXTBKCOLOR",
648     "LVM_SETTEXTBKCOLOR",
649     "LVM_GETTOPINDEX",
650     "LVM_GETCOUNTPERPAGE",
651     "LVM_GETORIGIN",
652     "LVM_UPDATE",
653     "LVM_SETITEMSTATE",
654     "LVM_GETITEMSTATE",
655     "LVM_GETITEMTEXTA",
656     "LVM_SETITEMTEXTA",
657     "LVM_SETITEMCOUNT",
658     "LVM_SORTITEMS",
659     "LVM_SETITEMPOSITION32",
660     "LVM_GETSELECTEDCOUNT",
661     "LVM_GETITEMSPACING",
662     "LVM_GETISEARCHSTRINGA",
663     "LVM_SETICONSPACING",
664     "LVM_SETEXTENDEDLISTVIEWSTYLE",
665     "LVM_GETEXTENDEDLISTVIEWSTYLE",
666     "LVM_GETSUBITEMRECT",
667     "LVM_SUBITEMHITTEST",
668     "LVM_SETCOLUMNORDERARRAY",
669     "LVM_GETCOLUMNORDERARRAY",
670     "LVM_SETHOTITEM",
671     "LVM_GETHOTITEM",
672     "LVM_SETHOTCURSOR",
673     "LVM_GETHOTCURSOR",
674     "LVM_APPROXIMATEVIEWRECT",
675     "LVM_SETWORKAREAS",
676     "LVM_GETSELECTIONMARK",
677     "LVM_SETSELECTIONMARK",
678     "LVM_SETBKIMAGEA",
679     "LVM_GETBKIMAGEA",
680     "LVM_GETWORKAREAS",
681     "LVM_SETHOVERTIME",
682     "LVM_GETHOVERTIME",
683     "LVM_GETNUMBEROFWORKAREAS",
684     "LVM_SETTOOLTIPS",
685     "LVM_GETITEMW",
686     "LVM_SETITEMW",
687     "LVM_INSERTITEMW",
688     "LVM_GETTOOLTIPS",
689     NULL,
690     NULL,
691     NULL,
692     NULL,
693     "LVM_FINDITEMW",
694     NULL,
695     NULL,
696     NULL,
697     "LVM_GETSTRINGWIDTHW",
698     NULL,
699     NULL,
700     NULL,
701     NULL,
702     NULL,
703     NULL,
704     NULL,
705     "LVM_GETCOLUMNW",
706     "LVM_SETCOLUMNW",
707     "LVM_INSERTCOLUMNW",
708     NULL,
709     NULL,
710     NULL,
711     NULL,
712     NULL,
713     NULL,
714     NULL,
715     NULL,
716     NULL,
717     NULL,
718     NULL,
719     NULL,
720     NULL,
721     NULL,
722     NULL,
723     NULL,
724     NULL,
725     "LVM_GETITEMTEXTW",
726     "LVM_SETITEMTEXTW",
727     "LVM_GETISEARCHSTRINGW",
728     "LVM_EDITLABELW",
729     NULL,
730     NULL,
731     NULL,
732     NULL,
733     NULL,
734     NULL,
735     NULL,
736     NULL,
737     NULL,
738     NULL,
739     NULL,
740     NULL,
741     NULL,
742     NULL,
743     NULL,
744     NULL,
745     NULL,
746     NULL,
747     NULL,
748     NULL,
749     "LVM_SETBKIMAGEW",
750     "LVM_GETBKIMAGEW"   /* 0x108B */
751 };
752
753 #define SPY_MAX_CCMMSGNUM   6
754 static const char * const CCMMessageTypeNames[SPY_MAX_CCMMSGNUM + 1] =
755 {
756     NULL,               /* 0x2000 */
757     "CCM_SETBKCOLOR",
758     "CCM_SETCOLORSCHEME",
759     "CCM_GETCOLORSCHEME",
760     "CCM_GETDROPTARGET",
761     "CCM_SETUNICODEFORMAT",
762     "CCM_GETUNICODEFORMAT"
763 };
764
765 /* Virtual key names */
766 #define SPY_MAX_VKKEYSNUM 255
767 static const char * const VK_KeyNames[SPY_MAX_VKKEYSNUM + 1] =
768 {
769     NULL,               /* 0x00 */
770     "VK_LBUTTON",       /* 0x01 */
771     "VK_RBUTTON",       /* 0x02 */
772     "VK_CANCEL",        /* 0x03 */
773     "VK_MBUTTON",       /* 0x04 */
774     NULL,               /* 0x05 */
775     NULL,               /* 0x06 */
776     NULL,               /* 0x07 */
777     "VK_BACK",          /* 0x08 */
778     "VK_TAB",           /* 0x09 */
779     NULL,               /* 0x0A */
780     NULL,               /* 0x0B */
781     "VK_CLEAR",         /* 0x0C */
782     "VK_RETURN",        /* 0x0D */
783     NULL,               /* 0x0E */
784     NULL,               /* 0x0F */
785     "VK_SHIFT",         /* 0x10 */
786     "VK_CONTROL",       /* 0x11 */
787     "VK_MENU",          /* 0x12 */
788     "VK_PAUSE",         /* 0x13 */
789     "VK_CAPITAL",       /* 0x14 */
790     NULL,               /* 0x15 */
791     NULL,               /* 0x16 */
792     NULL,               /* 0x17 */
793     NULL,               /* 0x18 */
794     NULL,               /* 0x19 */
795     NULL,               /* 0x1A */
796     "VK_ESCAPE",        /* 0x1B */
797     NULL,               /* 0x1C */
798     NULL,               /* 0x1D */
799     NULL,               /* 0x1E */
800     NULL,               /* 0x1F */
801     "VK_SPACE",         /* 0x20 */
802     "VK_PRIOR",         /* 0x21 */
803     "VK_NEXT",          /* 0x22 */
804     "VK_END",           /* 0x23 */
805     "VK_HOME",          /* 0x24 */
806     "VK_LEFT",          /* 0x25 */
807     "VK_UP",            /* 0x26 */
808     "VK_RIGHT",         /* 0x27 */
809     "VK_DOWN",          /* 0x28 */
810     "VK_SELECT",        /* 0x29 */
811     "VK_PRINT",         /* 0x2A */
812     "VK_EXECUTE",       /* 0x2B */
813     "VK_SNAPSHOT",      /* 0x2C */
814     "VK_INSERT",        /* 0x2D */
815     "VK_DELETE",        /* 0x2E */
816     "VK_HELP",          /* 0x2F */
817     "VK_0",             /* 0x30 */
818     "VK_1",             /* 0x31 */
819     "VK_2",             /* 0x32 */
820     "VK_3",             /* 0x33 */
821     "VK_4",             /* 0x34 */
822     "VK_5",             /* 0x35 */
823     "VK_6",             /* 0x36 */
824     "VK_7",             /* 0x37 */
825     "VK_8",             /* 0x38 */
826     "VK_9",             /* 0x39 */
827     NULL,               /* 0x3A */
828     NULL,               /* 0x3B */
829     NULL,               /* 0x3C */
830     NULL,               /* 0x3D */
831     NULL,               /* 0x3E */
832     NULL,               /* 0x3F */
833     NULL,               /* 0x40 */
834     "VK_A",             /* 0x41 */
835     "VK_B",             /* 0x42 */
836     "VK_C",             /* 0x43 */
837     "VK_D",             /* 0x44 */
838     "VK_E",             /* 0x45 */
839     "VK_F",             /* 0x46 */
840     "VK_G",             /* 0x47 */
841     "VK_H",             /* 0x48 */
842     "VK_I",             /* 0x49 */
843     "VK_J",             /* 0x4A */
844     "VK_K",             /* 0x4B */
845     "VK_L",             /* 0x4C */
846     "VK_M",             /* 0x4D */
847     "VK_N",             /* 0x4E */
848     "VK_O",             /* 0x4F */
849     "VK_P",             /* 0x50 */
850     "VK_Q",             /* 0x51 */
851     "VK_R",             /* 0x52 */
852     "VK_S",             /* 0x53 */
853     "VK_T",             /* 0x54 */
854     "VK_U",             /* 0x55 */
855     "VK_V",             /* 0x56 */
856     "VK_W",             /* 0x57 */
857     "VK_X",             /* 0x58 */
858     "VK_Y",             /* 0x59 */
859     "VK_Z",             /* 0x5A */
860     "VK_LWIN",          /* 0x5B */
861     "VK_RWIN",          /* 0x5C */
862     "VK_APPS",          /* 0x5D */
863     NULL,               /* 0x5E */
864     NULL,               /* 0x5F */
865     "VK_NUMPAD0",       /* 0x60 */
866     "VK_NUMPAD1",       /* 0x61 */
867     "VK_NUMPAD2",       /* 0x62 */
868     "VK_NUMPAD3",       /* 0x63 */
869     "VK_NUMPAD4",       /* 0x64 */
870     "VK_NUMPAD5",       /* 0x65 */
871     "VK_NUMPAD6",       /* 0x66 */
872     "VK_NUMPAD7",       /* 0x67 */
873     "VK_NUMPAD8",       /* 0x68 */
874     "VK_NUMPAD9",       /* 0x69 */
875     "VK_MULTIPLY",      /* 0x6A */
876     "VK_ADD",           /* 0x6B */
877     "VK_SEPARATOR",     /* 0x6C */
878     "VK_SUBTRACT",      /* 0x6D */
879     "VK_DECIMAL",       /* 0x6E */
880     "VK_DIVIDE",        /* 0x6F */
881     "VK_F1",            /* 0x70 */
882     "VK_F2",            /* 0x71 */
883     "VK_F3",            /* 0x72 */
884     "VK_F4",            /* 0x73 */
885     "VK_F5",            /* 0x74 */
886     "VK_F6",            /* 0x75 */
887     "VK_F7",            /* 0x76 */
888     "VK_F8",            /* 0x77 */
889     "VK_F9",            /* 0x78 */
890     "VK_F10",           /* 0x79 */
891     "VK_F11",           /* 0x7A */
892     "VK_F12",           /* 0x7B */
893     "VK_F13",           /* 0x7C */
894     "VK_F14",           /* 0x7D */
895     "VK_F15",           /* 0x7E */
896     "VK_F16",           /* 0x7F */
897     "VK_F17",           /* 0x80 */
898     "VK_F18",           /* 0x81 */
899     "VK_F19",           /* 0x82 */
900     "VK_F20",           /* 0x83 */
901     "VK_F21",           /* 0x84 */
902     "VK_F22",           /* 0x85 */
903     "VK_F23",           /* 0x86 */
904     "VK_F24",           /* 0x87 */
905     NULL,               /* 0x88 */
906     NULL,               /* 0x89 */
907     NULL,               /* 0x8A */
908     NULL,               /* 0x8B */
909     NULL,               /* 0x8C */
910     NULL,               /* 0x8D */
911     NULL,               /* 0x8E */
912     NULL,               /* 0x8F */
913     "VK_NUMLOCK",       /* 0x90 */
914     "VK_SCROLL",        /* 0x91 */
915     NULL,               /* 0x92 */
916     NULL,               /* 0x93 */
917     NULL,               /* 0x94 */
918     NULL,               /* 0x95 */
919     NULL,               /* 0x96 */
920     NULL,               /* 0x97 */
921     NULL,               /* 0x98 */
922     NULL,               /* 0x99 */
923     NULL,               /* 0x9A */
924     NULL,               /* 0x9B */
925     NULL,               /* 0x9C */
926     NULL,               /* 0x9D */
927     NULL,               /* 0x9E */
928     NULL,               /* 0x9F */
929     "VK_LSHIFT",        /* 0xA0 */
930     "VK_RSHIFT",        /* 0xA1 */
931     "VK_LCONTROL",      /* 0xA2 */
932     "VK_RCONTROL",      /* 0xA3 */
933     "VK_LMENU",         /* 0xA4 */
934     "VK_RMENU",         /* 0xA5 */
935     NULL,               /* 0xA6 */
936     NULL,               /* 0xA7 */
937     NULL,               /* 0xA8 */
938     NULL,               /* 0xA9 */
939     NULL,               /* 0xAA */
940     NULL,               /* 0xAB */
941     NULL,               /* 0xAC */
942     NULL,               /* 0xAD */
943     NULL,               /* 0xAE */
944     NULL,               /* 0xAF */
945     NULL,               /* 0xB0 */
946     NULL,               /* 0xB1 */
947     NULL,               /* 0xB2 */
948     NULL,               /* 0xB3 */
949     NULL,               /* 0xB4 */
950     NULL,               /* 0xB5 */
951     NULL,               /* 0xB6 */
952     NULL,               /* 0xB7 */
953     NULL,               /* 0xB8 */
954     NULL,               /* 0xB9 */
955     "VK_OEM_1",         /* 0xBA */
956     "VK_OEM_PLUS",      /* 0xBB */
957     "VK_OEM_COMMA",     /* 0xBC */
958     "VK_OEM_MINUS",     /* 0xBD */
959     "VK_OEM_PERIOD",    /* 0xBE */
960     "VK_OEM_2",         /* 0xBF */
961     "VK_OEM_3",         /* 0xC0 */
962     NULL,               /* 0xC1 */
963     NULL,               /* 0xC2 */
964     NULL,               /* 0xC3 */
965     NULL,               /* 0xC4 */
966     NULL,               /* 0xC5 */
967     NULL,               /* 0xC6 */
968     NULL,               /* 0xC7 */
969     NULL,               /* 0xC8 */
970     NULL,               /* 0xC9 */
971     NULL,               /* 0xCA */
972     NULL,               /* 0xCB */
973     NULL,               /* 0xCC */
974     NULL,               /* 0xCD */
975     NULL,               /* 0xCE */
976     NULL,               /* 0xCF */
977     NULL,               /* 0xD0 */
978     NULL,               /* 0xD1 */
979     NULL,               /* 0xD2 */
980     NULL,               /* 0xD3 */
981     NULL,               /* 0xD4 */
982     NULL,               /* 0xD5 */
983     NULL,               /* 0xD6 */
984     NULL,               /* 0xD7 */
985     NULL,               /* 0xD8 */
986     NULL,               /* 0xD9 */
987     NULL,               /* 0xDA */
988     "VK_OEM_4",         /* 0xDB */
989     "VK_OEM_5",         /* 0xDC */
990     "VK_OEM_6",         /* 0xDD */
991     "VK_OEM_7",         /* 0xDE */
992     "VK_OEM_8",         /* 0xDF */
993     NULL,               /* 0xE0 */
994     "VK_OEM_AX",        /* 0xE1 */
995     "VK_OEM_102",       /* 0xE2 */
996     "VK_ICO_HELP",      /* 0xE3 */
997     "VK_ICO_00",        /* 0xE4 */
998     "VK_PROCESSKEY",    /* 0xE5 */
999     NULL,               /* 0xE6 */
1000     NULL,               /* 0xE7 */
1001     NULL,               /* 0xE8 */
1002     NULL,               /* 0xE9 */
1003     NULL,               /* 0xEA */
1004     NULL,               /* 0xEB */
1005     NULL,               /* 0xEC */
1006     NULL,               /* 0xED */
1007     NULL,               /* 0xEE */
1008     NULL,               /* 0xEF */
1009     NULL,               /* 0xF0 */
1010     NULL,               /* 0xF1 */
1011     NULL,               /* 0xF2 */
1012     NULL,               /* 0xF3 */
1013     NULL,               /* 0xF4 */
1014     NULL,               /* 0xF5 */
1015     "VK_ATTN",          /* 0xF6 */
1016     "VK_CRSEL",         /* 0xF7 */
1017     "VK_EXSEL",         /* 0xF8 */
1018     "VK_EREOF",         /* 0xF9 */
1019     "VK_PLAY",          /* 0xFA */
1020     "VK_ZOOM",          /* 0xFB */
1021     "VK_NONAME",        /* 0xFC */
1022     "VK_PA1",           /* 0xFD */
1023     "VK_OEM_CLEAR",     /* 0xFE */
1024     NULL                /* 0xFF */
1025 };
1026
1027 static BOOL16 SPY_Exclude[SPY_MAX_MSGNUM+1];
1028 static BOOL16 SPY_ExcludeDWP = 0;
1029 static int SPY_IndentLevel  = 0;
1030
1031 #define SPY_EXCLUDE(msg) \
1032     (SPY_Exclude[(msg) > SPY_MAX_MSGNUM ? SPY_MAX_MSGNUM : (msg)])
1033
1034 /***********************************************************************
1035  *           SPY_GetMsgName
1036  */
1037 const char *SPY_GetMsgName( UINT msg )
1038 {
1039     static char msg_buffer[20];
1040
1041     if (msg <= SPY_MAX_MSGNUM)
1042     {
1043         if (!MessageTypeNames[msg]) return "???";
1044         return MessageTypeNames[msg];
1045     }
1046
1047     if (msg >= LVM_FIRST && msg <= LVM_FIRST + SPY_MAX_LVMMSGNUM)
1048     {
1049         if (!LVMMessageTypeNames[msg-LVM_FIRST]) return "LVM_?";
1050         return LVMMessageTypeNames[msg-LVM_FIRST];
1051     }
1052
1053     if (msg >= CCM_FIRST && msg <= CCM_FIRST + SPY_MAX_CCMMSGNUM)
1054     {
1055         if (!CCMMessageTypeNames[msg-CCM_FIRST]) return "???";
1056         return CCMMessageTypeNames[msg-CCM_FIRST];
1057     }
1058
1059     sprintf( msg_buffer, "WM_USER+%04x", msg - WM_USER );
1060     return msg_buffer;
1061 }
1062
1063 /***********************************************************************
1064  *           SPY_GetWndName
1065  */
1066 const char *SPY_GetWndName( HWND hwnd )
1067 {
1068     static char wnd_buffer[16];
1069
1070     WND* pWnd = WIN_FindWndPtr( hwnd );
1071     if( pWnd )
1072     {
1073         INT n = sizeof(wnd_buffer) - 6;
1074         LPSTR p = wnd_buffer;
1075         char  postfix;
1076         
1077         if( pWnd->text && pWnd->text[0] != '\0' )
1078         {
1079             LPWSTR src = pWnd->text;
1080             *(p++) = postfix = '\"';
1081             while ((n-- > 1) && *src) *p++ = *src++;
1082             if( *src ) for( n = 0; n < 3; n++ ) *(p++)='.';
1083         }
1084         else /* get class name */
1085         {
1086             *(p++)='{';
1087             GlobalGetAtomNameA((ATOM) GetClassWord(pWnd->hwndSelf, GCW_ATOM), p, n + 1);
1088             p += strlen(p);
1089             postfix = '}';
1090         }
1091         *(p++) = postfix;
1092         *(p++) = '\0';
1093         WIN_ReleaseWndPtr(pWnd);
1094
1095     }
1096     else strcpy( wnd_buffer, "\"NULL\"" );
1097     return wnd_buffer;
1098 }
1099
1100 /***********************************************************************
1101  *           SPY_GetVKeyName
1102  */
1103 const char *SPY_GetVKeyName(WPARAM wParam)
1104 {
1105     const char *vk_key_name;
1106
1107     if(wParam <= SPY_MAX_VKKEYSNUM && VK_KeyNames[wParam])
1108         vk_key_name = VK_KeyNames[wParam];
1109     else
1110         vk_key_name = "VK_???";
1111
1112     return vk_key_name;
1113 }
1114
1115 /***********************************************************************
1116  *           SPY_DumpStructure
1117  */
1118 void SPY_DumpStructure (UINT msg, BOOL enter, LPARAM structure)
1119 {
1120         switch (msg)
1121         {
1122             case WM_DRAWITEM:
1123                 if (!enter) break;
1124                 {   DRAWITEMSTRUCT *lpdis = (DRAWITEMSTRUCT*) structure;
1125                     TRACE("DRAWITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n", lpdis->CtlType, lpdis->CtlID);
1126                     TRACE("itemID=0x%08x itemAction=0x%08x itemState=0x%08x\n", lpdis->itemID, lpdis->itemAction, lpdis->itemState);
1127                     TRACE("hWnd=0x%04x hDC=0x%04x (%d,%d)-(%d,%d) itemData=0x%08lx\n",
1128                     lpdis->hwndItem, lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top, lpdis->rcItem.right, lpdis->rcItem.bottom, lpdis->itemData);
1129                 }
1130                 break;
1131             case WM_MEASUREITEM:
1132                 {   MEASUREITEMSTRUCT *lpmis = (MEASUREITEMSTRUCT*) structure;
1133                     TRACE("MEASUREITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n", lpmis->CtlType, lpmis->CtlID);
1134                     TRACE("itemID=0x%08x itemWidth=0x%08x itemHeight=0x%08x\n", lpmis->itemID, lpmis->itemWidth, lpmis->itemHeight);
1135                     TRACE("itemData=0x%08lx\n", lpmis->itemData);
1136                 }
1137                 break;
1138             case WM_STYLECHANGED:
1139                 if (!enter) break;
1140             case WM_STYLECHANGING:
1141                 {   LPSTYLESTRUCT ss = (LPSTYLESTRUCT) structure;
1142                     TRACE("STYLESTRUCT: StyleOld=0x%08lx, StyleNew=0x%08lx\n",
1143                           ss->styleOld, ss->styleNew); 
1144                 }
1145                 break;
1146             case WM_NOTIFY:
1147                 if (!enter) break;
1148                 {   NMHDR * pnmh = (NMHDR*) structure;
1149                     TRACE("NMHDR hwndFrom=0x%08x idFrom=0x%08x code=0x%08x\n", pnmh->hwndFrom, pnmh->idFrom, pnmh->code);
1150                 }
1151             default:
1152                 break;
1153         }
1154         
1155 }
1156 /***********************************************************************
1157  *           SPY_EnterMessage
1158  */
1159 void SPY_EnterMessage( INT iFlag, HWND hWnd, UINT msg,
1160                        WPARAM wParam, LPARAM lParam )
1161 {
1162     LPCSTR pname;
1163
1164     if (!TRACE_ON(message) || SPY_EXCLUDE(msg)) return;
1165
1166     /* each SPY_SENDMESSAGE must be complemented by call to SPY_ExitMessage */
1167     switch(iFlag)
1168     {
1169     case SPY_DISPATCHMESSAGE16:
1170         pname = SPY_GetWndName(hWnd);
1171         TRACE("%*s(%04x) %-16s message [%04x] %s dispatched  wp=%04x lp=%08lx\n",
1172                         SPY_IndentLevel, "", hWnd, pname, msg, SPY_GetMsgName( msg ),
1173                         wParam, lParam);
1174         break;
1175
1176     case SPY_DISPATCHMESSAGE:
1177         pname = SPY_GetWndName(hWnd);
1178         TRACE("%*s(%08x) %-16s message [%04x] %s dispatched  wp=%08x lp=%08lx\n",
1179                         SPY_IndentLevel, "", hWnd, pname, msg, SPY_GetMsgName( msg ),
1180                         wParam, lParam);
1181         break;
1182
1183     case SPY_SENDMESSAGE16:
1184     case SPY_SENDMESSAGE:
1185         {
1186             char taskName[30];
1187             HTASK16 hTask = GetWindowTask16(hWnd);
1188
1189             if (hTask == GetCurrentTask()) strcpy( taskName, "self" );
1190             else if (!hTask) strcpy( taskName, "Wine" );
1191             else
1192             {
1193                 sprintf( taskName, "task %04x ???", hTask );
1194                 GetModuleName16( hTask, taskName + 10, sizeof(taskName) - 10 );
1195             }
1196             pname = SPY_GetWndName(hWnd);
1197
1198             if (iFlag == SPY_SENDMESSAGE16)
1199                 TRACE("%*s(%04x) %-16s message [%04x] %s sent from %s wp=%04x lp=%08lx\n",
1200                              SPY_IndentLevel, "", hWnd, pname, msg, SPY_GetMsgName( msg ), 
1201                              taskName, wParam, lParam );
1202             else
1203             {   TRACE("%*s(%08x) %-16s message [%04x] %s sent from %s wp=%08x lp=%08lx\n",
1204                              SPY_IndentLevel, "", hWnd, pname, msg, SPY_GetMsgName( msg ), 
1205                              taskName, wParam, lParam );
1206                 SPY_DumpStructure(msg, TRUE, lParam);
1207             }
1208         }
1209         break;   
1210
1211     case SPY_DEFWNDPROC16:
1212         if( SPY_ExcludeDWP ) return;
1213         TRACE("%*s(%04x)  DefWindowProc16: %s [%04x]  wp=%04x lp=%08lx\n",
1214                         SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ),
1215                         msg, wParam, lParam );
1216         break;
1217
1218     case SPY_DEFWNDPROC:
1219         if( SPY_ExcludeDWP ) return;
1220         TRACE("%*s(%08x)  DefWindowProc32: %s [%04x]  wp=%08x lp=%08lx\n",
1221                         SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ),
1222                         msg, wParam, lParam );
1223         break;
1224     }  
1225     SPY_IndentLevel += SPY_INDENT_UNIT;
1226 }
1227
1228
1229 /***********************************************************************
1230  *           SPY_ExitMessage
1231  */
1232 void SPY_ExitMessage( INT iFlag, HWND hWnd, UINT msg, LRESULT lReturn,
1233                        WPARAM wParam, LPARAM lParam )
1234 {
1235     LPCSTR pname;
1236
1237     if (!TRACE_ON(message) || SPY_EXCLUDE(msg) ||
1238         (SPY_ExcludeDWP && (iFlag == SPY_RESULT_DEFWND16 || iFlag == SPY_RESULT_DEFWND)) )
1239         return;
1240
1241     if (SPY_IndentLevel) SPY_IndentLevel -= SPY_INDENT_UNIT;
1242
1243     switch(iFlag)
1244     {
1245     case SPY_RESULT_DEFWND16:
1246         TRACE(" %*s(%04x)  DefWindowProc16: %s [%04x] returned %08lx\n",
1247                         SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ), msg, lReturn );
1248         break;
1249
1250     case SPY_RESULT_DEFWND:
1251         TRACE(" %*s(%08x)  DefWindowProc32: %s [%04x] returned %08lx\n",
1252                         SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ), msg, lReturn );
1253         break;
1254
1255     case SPY_RESULT_OK16:
1256         pname = SPY_GetWndName(hWnd);
1257         TRACE(" %*s(%04x) %-16s message [%04x] %s returned %08lx\n",
1258                         SPY_IndentLevel, "", hWnd, pname, msg,
1259                         SPY_GetMsgName( msg ), lReturn );
1260         break;
1261
1262     case SPY_RESULT_OK:
1263         pname = SPY_GetWndName(hWnd);
1264         TRACE(" %*s(%08x) %-16s message [%04x] %s returned %08lx\n",
1265                         SPY_IndentLevel, "", hWnd, pname, msg,
1266                         SPY_GetMsgName( msg ), lReturn );
1267         SPY_DumpStructure(msg, FALSE, lParam);
1268         break; 
1269
1270     case SPY_RESULT_INVALIDHWND16:
1271         pname = SPY_GetWndName(hWnd);
1272         WARN(" %*s(%04x) %-16s message [%04x] %s HAS INVALID HWND\n",
1273                         SPY_IndentLevel, "", hWnd, pname, msg,
1274                         SPY_GetMsgName( msg ) );
1275         break;
1276
1277     case SPY_RESULT_INVALIDHWND:
1278         pname = SPY_GetWndName(hWnd);
1279         WARN(" %*s(%08x) %-16s message [%04x] %s HAS INVALID HWND\n",
1280                         SPY_IndentLevel, "", hWnd, pname, msg,
1281                         SPY_GetMsgName( msg ) );
1282         break;
1283    }
1284 }
1285
1286
1287 /***********************************************************************
1288  *           SPY_Init
1289  */
1290 int SPY_Init(void)
1291 {
1292     int i;
1293     char buffer[1024];
1294
1295     if (!TRACE_ON(message)) return TRUE;
1296
1297     PROFILE_GetWineIniString( "Spy", "Include", "", buffer, sizeof(buffer) );
1298     if (buffer[0] && strcmp( buffer, "INCLUDEALL" ))
1299     {
1300         TRACE("Include=%s\n", buffer );
1301         for (i = 0; i <= SPY_MAX_MSGNUM; i++)
1302             SPY_Exclude[i] = (MessageTypeNames[i] && !strstr(buffer,MessageTypeNames[i]));
1303     }
1304
1305     PROFILE_GetWineIniString( "Spy", "Exclude", "", buffer, sizeof(buffer) );
1306     if (buffer[0])
1307     {
1308         TRACE("Exclude=%s\n", buffer );
1309         if (!strcmp( buffer, "EXCLUDEALL" ))
1310             for (i = 0; i <= SPY_MAX_MSGNUM; i++) SPY_Exclude[i] = TRUE;
1311         else
1312             for (i = 0; i <= SPY_MAX_MSGNUM; i++)
1313                 SPY_Exclude[i] = (MessageTypeNames[i] && strstr(buffer,MessageTypeNames[i]));
1314     }
1315
1316     SPY_ExcludeDWP = PROFILE_GetWineIniInt( "Spy", "ExcludeDWP", 0 );
1317
1318     return 1;
1319 }