msxml3: Embed user/password in uri used to create a moniker.
[wine] / dlls / user32 / spy.c
1 /*
2  * Message spying routines
3  *
4  * Copyright 1994, Bob Amstadt
5  *           1995, Alex Korobka
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20  */
21
22 #include <stdlib.h>
23 #include <string.h>
24 #include <stdarg.h>
25 #include <stdio.h>
26 #include "windef.h"
27 #include "winbase.h"
28 #include "wingdi.h"
29 #include "winreg.h"
30 #include "wine/unicode.h"
31 #include "win.h"
32 #include "user_private.h"
33 #include "wine/debug.h"
34 #include "commctrl.h"
35 #include "commdlg.h"
36 #include "richedit.h"
37
38 WINE_DEFAULT_DEBUG_CHANNEL(message);
39
40 #define SPY_MAX_MSGNUM   WM_USER
41 #define SPY_INDENT_UNIT  4  /* 4 spaces */
42 #define ARRAYSIZE(a) ((sizeof(a) / sizeof((a)[0])))
43
44 #define DEBUG_SPY 0
45
46 static const char * const ClassLongOffsetNames[] =
47 {
48     "GCLP_MENUNAME",      /*  -8 */
49     "GCLP_HBRBACKGROUND", /* -10 */
50     "GCLP_HCURSOR",       /* -12 */
51     "GCLP_HICON",         /* -14 */
52     "GCLP_HMODULE",       /* -16 */
53     "GCL_CBWNDEXTRA",     /* -18 */
54     "GCL_CBCLSEXTRA",     /* -20 */
55     "?",
56     "GCLP_WNDPROC",       /* -24 */
57     "GCL_STYLE",          /* -26 */
58     "?",
59     "?",
60     "GCW_ATOM",           /* -32 */
61     "GCLP_HICONSM",       /* -34 */
62 };
63
64 static const char * const MessageTypeNames[SPY_MAX_MSGNUM + 1] =
65 {
66     "WM_NULL",                  /* 0x00 */
67     "WM_CREATE",
68     "WM_DESTROY",
69     "WM_MOVE",
70     "wm_sizewait",
71     "WM_SIZE",
72     "WM_ACTIVATE",
73     "WM_SETFOCUS",
74     "WM_KILLFOCUS",
75     "WM_SETVISIBLE",
76     "WM_ENABLE",
77     "WM_SETREDRAW",
78     "WM_SETTEXT",
79     "WM_GETTEXT",
80     "WM_GETTEXTLENGTH",
81     "WM_PAINT",
82     "WM_CLOSE",                 /* 0x10 */
83     "WM_QUERYENDSESSION",
84     "WM_QUIT",
85     "WM_QUERYOPEN",
86     "WM_ERASEBKGND",
87     "WM_SYSCOLORCHANGE",
88     "WM_ENDSESSION",
89     "wm_systemerror",
90     "WM_SHOWWINDOW",
91     "WM_CTLCOLOR",
92     "WM_WININICHANGE",
93     "WM_DEVMODECHANGE",
94     "WM_ACTIVATEAPP",
95     "WM_FONTCHANGE",
96     "WM_TIMECHANGE",
97     "WM_CANCELMODE",
98     "WM_SETCURSOR",             /* 0x20 */
99     "WM_MOUSEACTIVATE",
100     "WM_CHILDACTIVATE",
101     "WM_QUEUESYNC",
102     "WM_GETMINMAXINFO",
103     "wm_unused3",
104     "wm_painticon",
105     "WM_ICONERASEBKGND",
106     "WM_NEXTDLGCTL",
107     "wm_alttabactive",
108     "WM_SPOOLERSTATUS",
109     "WM_DRAWITEM",
110     "WM_MEASUREITEM",
111     "WM_DELETEITEM",
112     "WM_VKEYTOITEM",
113     "WM_CHARTOITEM",
114     "WM_SETFONT",               /* 0x30 */
115     "WM_GETFONT",
116     "WM_SETHOTKEY",
117     "WM_GETHOTKEY",
118     "wm_filesyschange",
119     "wm_isactiveicon",
120     "wm_queryparkicon",
121     "WM_QUERYDRAGICON",
122     "wm_querysavestate",
123     "WM_COMPAREITEM",
124     "wm_testing",
125     NULL,
126     NULL,
127     "WM_GETOBJECT",             /* 0x3d */
128     "wm_activateshellwindow",
129     NULL,
130
131     NULL,                       /* 0x40 */
132     "wm_compacting", NULL, NULL,
133     "WM_COMMNOTIFY", NULL,
134     "WM_WINDOWPOSCHANGING",     /* 0x0046 */
135     "WM_WINDOWPOSCHANGED",      /* 0x0047 */
136     "WM_POWER", NULL,
137     "WM_COPYDATA",
138     "WM_CANCELJOURNAL", NULL, NULL,
139     "WM_NOTIFY", NULL,
140
141     /* 0x0050 */
142     "WM_INPUTLANGCHANGEREQUEST",
143     "WM_INPUTLANGCHANGE",
144     "WM_TCARD",
145     "WM_HELP",
146     "WM_USERCHANGED",
147     "WM_NOTIFYFORMAT", NULL, NULL,
148     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
149
150     /* 0x0060 */
151     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
152     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
153
154     /* 0x0070 */
155     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
156     NULL, NULL, NULL,
157     "WM_CONTEXTMENU",
158     "WM_STYLECHANGING",
159     "WM_STYLECHANGED",
160     "WM_DISPLAYCHANGE",
161     "WM_GETICON",
162
163     "WM_SETICON",               /* 0x0080 */
164     "WM_NCCREATE",              /* 0x0081 */
165     "WM_NCDESTROY",             /* 0x0082 */
166     "WM_NCCALCSIZE",            /* 0x0083 */
167     "WM_NCHITTEST",             /* 0x0084 */
168     "WM_NCPAINT",               /* 0x0085 */
169     "WM_NCACTIVATE",            /* 0x0086 */
170     "WM_GETDLGCODE",            /* 0x0087 */
171     "WM_SYNCPAINT",
172     "WM_SYNCTASK", NULL, NULL, NULL, NULL, NULL, NULL,
173
174     /* 0x0090 */
175     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
176     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
177
178     /* 0x00A0 */
179     "WM_NCMOUSEMOVE",           /* 0x00a0 */
180     "WM_NCLBUTTONDOWN",         /* 0x00a1 */
181     "WM_NCLBUTTONUP",           /* 0x00a2 */
182     "WM_NCLBUTTONDBLCLK",       /* 0x00a3 */
183     "WM_NCRBUTTONDOWN",         /* 0x00a4 */
184     "WM_NCRBUTTONUP",           /* 0x00a5 */
185     "WM_NCRBUTTONDBLCLK",       /* 0x00a6 */
186     "WM_NCMBUTTONDOWN",         /* 0x00a7 */
187     "WM_NCMBUTTONUP",           /* 0x00a8 */
188     "WM_NCMBUTTONDBLCLK",       /* 0x00a9 */
189     NULL,                       /* 0x00aa */
190     "WM_NCXBUTTONDOWN",         /* 0x00ab */
191     "WM_NCXBUTTONUP",           /* 0x00ac */
192     "WM_NCXBUTTONDBLCLK",       /* 0x00ad */
193     NULL,                       /* 0x00ae */
194     NULL,                       /* 0x00af */
195
196     /* 0x00B0 - Win32 Edit controls */
197     "EM_GETSEL",                /* 0x00b0 */
198     "EM_SETSEL",                /* 0x00b1 */
199     "EM_GETRECT",               /* 0x00b2 */
200     "EM_SETRECT",               /* 0x00b3 */
201     "EM_SETRECTNP",             /* 0x00b4 */
202     "EM_SCROLL",                /* 0x00b5 */
203     "EM_LINESCROLL",            /* 0x00b6 */
204     "EM_SCROLLCARET",           /* 0x00b7 */
205     "EM_GETMODIFY",             /* 0x00b8 */
206     "EM_SETMODIFY",             /* 0x00b9 */
207     "EM_GETLINECOUNT",          /* 0x00ba */
208     "EM_LINEINDEX",             /* 0x00bb */
209     "EM_SETHANDLE",             /* 0x00bc */
210     "EM_GETHANDLE",             /* 0x00bd */
211     "EM_GETTHUMB",              /* 0x00be */
212     NULL,                       /* 0x00bf */
213
214     NULL,                       /* 0x00c0 */
215     "EM_LINELENGTH",            /* 0x00c1 */
216     "EM_REPLACESEL",            /* 0x00c2 */
217     NULL,                       /* 0x00c3 */
218     "EM_GETLINE",               /* 0x00c4 */
219     "EM_LIMITTEXT",             /* 0x00c5 */
220     "EM_CANUNDO",               /* 0x00c6 */
221     "EM_UNDO",                  /* 0x00c7 */
222     "EM_FMTLINES",              /* 0x00c8 */
223     "EM_LINEFROMCHAR",          /* 0x00c9 */
224     NULL,                       /* 0x00ca */
225     "EM_SETTABSTOPS",           /* 0x00cb */
226     "EM_SETPASSWORDCHAR",       /* 0x00cc */
227     "EM_EMPTYUNDOBUFFER",       /* 0x00cd */
228     "EM_GETFIRSTVISIBLELINE",   /* 0x00ce */
229     "EM_SETREADONLY",           /* 0x00cf */
230
231     "EM_SETWORDBREAKPROC",      /* 0x00d0 */
232     "EM_GETWORDBREAKPROC",      /* 0x00d1 */
233     "EM_GETPASSWORDCHAR",       /* 0x00d2 */
234     "EM_SETMARGINS",            /* 0x00d3 */
235     "EM_GETMARGINS",            /* 0x00d4 */
236     "EM_GETLIMITTEXT",          /* 0x00d5 */
237     "EM_POSFROMCHAR",           /* 0x00d6 */
238     "EM_CHARFROMPOS",           /* 0x00d7 */
239     "EM_SETIMESTATUS",          /* 0x00d8 */
240     "EM_GETIMESTATUS",          /* 0x00d9 */
241     NULL, NULL, NULL, NULL, NULL, NULL,
242
243     /* 0x00E0 - Win32 Scrollbars */
244     "SBM_SETPOS",               /* 0x00e0 */
245     "SBM_GETPOS",               /* 0x00e1 */
246     "SBM_SETRANGE",             /* 0x00e2 */
247     "SBM_GETRANGE",             /* 0x00e3 */
248     "SBM_ENABLE_ARROWS",        /* 0x00e4 */
249     NULL,
250     "SBM_SETRANGEREDRAW",       /* 0x00e6 */
251     NULL, NULL,
252     "SBM_SETSCROLLINFO",        /* 0x00e9 */
253     "SBM_GETSCROLLINFO",        /* 0x00ea */
254     NULL, NULL, NULL, NULL, NULL,
255
256     /* 0x00F0 - Win32 Buttons */
257     "BM_GETCHECK",              /* 0x00f0 */
258     "BM_SETCHECK",              /* 0x00f1 */
259     "BM_GETSTATE",              /* 0x00f2 */
260     "BM_SETSTATE",              /* 0x00f3 */
261     "BM_SETSTYLE",              /* 0x00f4 */
262     "BM_CLICK",                 /* 0x00f5 */
263     "BM_GETIMAGE",              /* 0x00f6 */
264     "BM_SETIMAGE",              /* 0x00f7 */
265     NULL, NULL, NULL, NULL, NULL, NULL,
266     "WM_INPUT_DEVICE_CHANGE",   /* 0x00fe */
267     "WM_INPUT",                 /* 0x00ff */
268
269     "WM_KEYDOWN",               /* 0x0100 */
270     "WM_KEYUP",                 /* 0x0101 */
271     "WM_CHAR",                  /* 0x0102 */
272     "WM_DEADCHAR",              /* 0x0103 */
273     "WM_SYSKEYDOWN",            /* 0x0104 */
274     "WM_SYSKEYUP",              /* 0x0105 */
275     "WM_SYSCHAR",               /* 0x0106 */
276     "WM_SYSDEADCHAR",           /* 0x0107 */
277     NULL,
278     "WM_UNICHAR",               /* 0x0109 */
279     "WM_CONVERTREQUEST",        /* 0x010a */
280     "WM_CONVERTRESULT",         /* 0x010b */
281     "WM_INTERIM",               /* 0x010c */
282     "WM_IME_STARTCOMPOSITION",  /* 0x010d */
283     "WM_IME_ENDCOMPOSITION",    /* 0x010e */
284     "WM_IME_COMPOSITION",       /* 0x010f */
285
286     "WM_INITDIALOG",            /* 0x0110 */
287     "WM_COMMAND",               /* 0x0111 */
288     "WM_SYSCOMMAND",            /* 0x0112 */
289     "WM_TIMER",                 /* 0x0113 */
290     "WM_HSCROLL",               /* 0x0114 */
291     "WM_VSCROLL",               /* 0x0115 */
292     "WM_INITMENU",              /* 0x0116 */
293     "WM_INITMENUPOPUP",         /* 0x0117 */
294     "WM_SYSTIMER",              /* 0x0118 */
295     NULL, NULL, NULL, NULL, NULL, NULL,
296     "WM_MENUSELECT",            /* 0x011f */
297
298     "WM_MENUCHAR",              /* 0x0120 */
299     "WM_ENTERIDLE",             /* 0x0121 */
300
301     "WM_MENURBUTTONUP",         /* 0x0122 */
302     "WM_MENUDRAG",              /* 0x0123 */
303     "WM_MENUGETOBJECT",         /* 0x0124 */
304     "WM_UNINITMENUPOPUP",       /* 0x0125 */
305     "WM_MENUCOMMAND",           /* 0x0126 */
306     "WM_CHANGEUISTATE",         /* 0x0127 */
307     "WM_UPDATEUISTATE",         /* 0x0128 */
308     "WM_QUERYUISTATE",          /* 0x0129 */
309
310     NULL, NULL, NULL, NULL, NULL, NULL,
311
312     /* 0x0130 */
313     NULL,
314     "WM_LBTRACKPOINT",          /* 0x0131 */
315     "WM_CTLCOLORMSGBOX",        /* 0x0132 */
316     "WM_CTLCOLOREDIT",          /* 0x0133 */
317     "WM_CTLCOLORLISTBOX",       /* 0x0134 */
318     "WM_CTLCOLORBTN",           /* 0x0135 */
319     "WM_CTLCOLORDLG",           /* 0x0136 */
320     "WM_CTLCOLORSCROLLBAR",     /* 0x0137 */
321     "WM_CTLCOLORSTATIC",        /* 0x0138 */
322     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
323
324     /* 0x0140 - Win32 Comboboxes */
325     "CB_GETEDITSEL",            /* 0x0140 */
326     "CB_LIMITTEXT",             /* 0x0141 */
327     "CB_SETEDITSEL",            /* 0x0142 */
328     "CB_ADDSTRING",             /* 0x0143 */
329     "CB_DELETESTRING",          /* 0x0144 */
330     "CB_DIR",                   /* 0x0145 */
331     "CB_GETCOUNT",              /* 0x0146 */
332     "CB_GETCURSEL",             /* 0x0147 */
333     "CB_GETLBTEXT",             /* 0x0148 */
334     "CB_GETLBTEXTLEN",          /* 0x0149 */
335     "CB_INSERTSTRING",          /* 0x014a */
336     "CB_RESETCONTENT",          /* 0x014b */
337     "CB_FINDSTRING",            /* 0x014c */
338     "CB_SELECTSTRING",          /* 0x014d */
339     "CB_SETCURSEL",             /* 0x014e */
340     "CB_SHOWDROPDOWN",          /* 0x014f */
341
342     "CB_GETITEMDATA",           /* 0x0150 */
343     "CB_SETITEMDATA",           /* 0x0151 */
344     "CB_GETDROPPEDCONTROLRECT", /* 0x0152 */
345     "CB_SETITEMHEIGHT",         /* 0x0153 */
346     "CB_GETITEMHEIGHT",         /* 0x0154 */
347     "CB_SETEXTENDEDUI",         /* 0x0155 */
348     "CB_GETEXTENDEDUI",         /* 0x0156 */
349     "CB_GETDROPPEDSTATE",       /* 0x0157 */
350     "CB_FINDSTRINGEXACT",       /* 0x0158 */
351     "CB_SETLOCALE",             /* 0x0159 */
352     "CB_GETLOCALE",             /* 0x015a */
353     "CB_GETTOPINDEX",           /* 0x015b */
354     "CB_SETTOPINDEX",           /* 0x015c */
355     "CB_GETHORIZONTALEXTENT",   /* 0x015d */
356     "CB_SETHORIZONTALEXTENT",   /* 0x015e */
357     "CB_GETDROPPEDWIDTH",       /* 0x015f */
358
359     "CB_SETDROPPEDWIDTH",       /* 0x0160 */
360     "CB_INITSTORAGE",           /* 0x0161 */
361     NULL, NULL, NULL, NULL, NULL, NULL,
362     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
363
364     /* 0x0170 - Win32 Static controls */
365     "STM_SETICON",              /* 0x0170 */
366     "STM_GETICON",              /* 0x0171 */
367     "STM_SETIMAGE",             /* 0x0172 */
368     "STM_GETIMAGE",             /* 0x0173 */
369     NULL, NULL, NULL, NULL,
370     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
371
372     /* 0x0180 - Win32 Listboxes */
373     "LB_ADDSTRING",             /* 0x0180 */
374     "LB_INSERTSTRING",          /* 0x0181 */
375     "LB_DELETESTRING",          /* 0x0182 */
376     "LB_SELITEMRANGEEX",        /* 0x0183 */
377     "LB_RESETCONTENT",          /* 0x0184 */
378     "LB_SETSEL",                /* 0x0185 */
379     "LB_SETCURSEL",             /* 0x0186 */
380     "LB_GETSEL",                /* 0x0187 */
381     "LB_GETCURSEL",             /* 0x0188 */
382     "LB_GETTEXT",               /* 0x0189 */
383     "LB_GETTEXTLEN",            /* 0x018a */
384     "LB_GETCOUNT",              /* 0x018b */
385     "LB_SELECTSTRING",          /* 0x018c */
386     "LB_DIR",                   /* 0x018d */
387     "LB_GETTOPINDEX",           /* 0x018e */
388     "LB_FINDSTRING",            /* 0x018f */
389
390     "LB_GETSELCOUNT",           /* 0x0190 */
391     "LB_GETSELITEMS",           /* 0x0191 */
392     "LB_SETTABSTOPS",           /* 0x0192 */
393     "LB_GETHORIZONTALEXTENT",   /* 0x0193 */
394     "LB_SETHORIZONTALEXTENT",   /* 0x0194 */
395     "LB_SETCOLUMNWIDTH",        /* 0x0195 */
396     "LB_ADDFILE",               /* 0x0196 */
397     "LB_SETTOPINDEX",           /* 0x0197 */
398     "LB_GETITEMRECT",           /* 0x0198 */
399     "LB_GETITEMDATA",           /* 0x0199 */
400     "LB_SETITEMDATA",           /* 0x019a */
401     "LB_SELITEMRANGE",          /* 0x019b */
402     "LB_SETANCHORINDEX",        /* 0x019c */
403     "LB_GETANCHORINDEX",        /* 0x019d */
404     "LB_SETCARETINDEX",         /* 0x019e */
405     "LB_GETCARETINDEX",         /* 0x019f */
406
407     "LB_SETITEMHEIGHT",         /* 0x01a0 */
408     "LB_GETITEMHEIGHT",         /* 0x01a1 */
409     "LB_FINDSTRINGEXACT",       /* 0x01a2 */
410     "LB_CARETON",               /* 0x01a3 */
411     "LB_CARETOFF",              /* 0x01a4 */
412     "LB_SETLOCALE",             /* 0x01a5 */
413     "LB_GETLOCALE",             /* 0x01a6 */
414     "LB_SETCOUNT",              /* 0x01a7 */
415     "LB_INITSTORAGE",           /* 0x01a8 */
416     "LB_ITEMFROMPOINT",         /* 0x01a9 */
417     NULL, NULL, NULL, NULL, NULL, NULL,
418
419     /* 0x01B0 */
420     NULL, NULL,
421     "LB_GETLISTBOXINFO",         /* 0x01b2 */
422     NULL, NULL, NULL, NULL, NULL,
423     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
424
425     /* 0x01C0 */
426     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
427     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
428
429     /* 0x01D0 */
430     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
431     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
432
433     /* 0x01E0 */
434     NULL,
435     "MN_GETHMENU",              /* 0x01E1 */
436     NULL, NULL, NULL, NULL, NULL, NULL,
437     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
438
439     /* 0x01F0 */
440     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
441     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
442
443     "WM_MOUSEMOVE",             /* 0x0200 */
444     "WM_LBUTTONDOWN",           /* 0x0201 */
445     "WM_LBUTTONUP",             /* 0x0202 */
446     "WM_LBUTTONDBLCLK",         /* 0x0203 */
447     "WM_RBUTTONDOWN",           /* 0x0204 */
448     "WM_RBUTTONUP",             /* 0x0205 */
449     "WM_RBUTTONDBLCLK",         /* 0x0206 */
450     "WM_MBUTTONDOWN",           /* 0x0207 */
451     "WM_MBUTTONUP",             /* 0x0208 */
452     "WM_MBUTTONDBLCLK",         /* 0x0209 */
453     "WM_MOUSEWHEEL",            /* 0x020A */
454     "WM_XBUTTONDOWN",           /* 0x020B */
455     "WM_XBUTTONUP",             /* 0x020C */
456     "WM_XBUTTONDBLCLK",         /* 0x020D */
457     "WM_MOUSEHWHEEL",           /* 0x020E */
458     NULL,
459
460     "WM_PARENTNOTIFY",          /* 0x0210 */
461     "WM_ENTERMENULOOP",         /* 0x0211 */
462     "WM_EXITMENULOOP",          /* 0x0212 */
463     "WM_NEXTMENU",              /* 0x0213 */
464     "WM_SIZING",
465     "WM_CAPTURECHANGED",
466     "WM_MOVING", NULL,
467     "WM_POWERBROADCAST",
468     "WM_DEVICECHANGE", NULL, NULL, NULL, NULL, NULL, NULL,
469
470     "WM_MDICREATE",             /* 0x0220 */
471     "WM_MDIDESTROY",            /* 0x0221 */
472     "WM_MDIACTIVATE",           /* 0x0222 */
473     "WM_MDIRESTORE",            /* 0x0223 */
474     "WM_MDINEXT",               /* 0x0224 */
475     "WM_MDIMAXIMIZE",           /* 0x0225 */
476     "WM_MDITILE",               /* 0x0226 */
477     "WM_MDICASCADE",            /* 0x0227 */
478     "WM_MDIICONARRANGE",        /* 0x0228 */
479     "WM_MDIGETACTIVE",          /* 0x0229 */
480
481     "WM_DROPOBJECT",
482     "WM_QUERYDROPOBJECT",
483     "WM_BEGINDRAG",
484     "WM_DRAGLOOP",
485     "WM_DRAGSELECT",
486     "WM_DRAGMOVE",
487
488     /* 0x0230*/
489     "WM_MDISETMENU",            /* 0x0230 */
490     "WM_ENTERSIZEMOVE",         /* 0x0231 */
491     "WM_EXITSIZEMOVE",          /* 0x0232 */
492     "WM_DROPFILES",             /* 0x0233 */
493     "WM_MDIREFRESHMENU", NULL, NULL, NULL,
494     /* 0x0238*/
495     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
496
497     /* 0x0240 */
498     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
499     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
500
501     /* 0x0250 */
502     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
503     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
504
505     /* 0x0260 */
506     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
507     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
508     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
509     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
510
511     /* 0x0280 */
512     NULL,
513     "WM_IME_SETCONTEXT",        /* 0x0281 */
514     "WM_IME_NOTIFY",            /* 0x0282 */
515     "WM_IME_CONTROL",           /* 0x0283 */
516     "WM_IME_COMPOSITIONFULL",   /* 0x0284 */
517     "WM_IME_SELECT",            /* 0x0285 */
518     "WM_IME_CHAR",              /* 0x0286 */
519     NULL,
520     "WM_IME_REQUEST",           /* 0x0288 */
521     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
522     "WM_IME_KEYDOWN",           /* 0x0290 */
523     "WM_IME_KEYUP",             /* 0x0291 */
524     NULL, NULL, NULL, NULL, NULL, NULL,
525     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
526
527     /* 0x02a0 */
528     "WM_NCMOUSEHOVER",          /* 0x02A0 */
529     "WM_MOUSEHOVER",            /* 0x02A1 */
530     "WM_NCMOUSELEAVE",          /* 0x02A2 */
531     "WM_MOUSELEAVE",            /* 0x02A3 */
532     NULL, NULL, NULL, NULL, NULL, NULL,
533     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
534     "WM_WTSSESSION_CHANGE",     /* 0x02B1 */
535     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
536     NULL, NULL, NULL, NULL, NULL, NULL,
537
538     /* 0x02c0 */
539     "WM_TABLET_FIRST",          /* 0x02c0 */
540     "WM_TABLET_FIRST+1",        /* 0x02c1 */
541     "WM_TABLET_FIRST+2",        /* 0x02c2 */
542     "WM_TABLET_FIRST+3",        /* 0x02c3 */
543     "WM_TABLET_FIRST+4",        /* 0x02c4 */
544     "WM_TABLET_FIRST+5",        /* 0x02c5 */
545     "WM_TABLET_FIRST+7",        /* 0x02c6 */
546     "WM_TABLET_FIRST+8",        /* 0x02c7 */
547     "WM_TABLET_FIRST+9",        /* 0x02c8 */
548     "WM_TABLET_FIRST+10",       /* 0x02c9 */
549     "WM_TABLET_FIRST+11",       /* 0x02ca */
550     "WM_TABLET_FIRST+12",       /* 0x02cb */
551     "WM_TABLET_FIRST+13",       /* 0x02cc */
552     "WM_TABLET_FIRST+14",       /* 0x02cd */
553     "WM_TABLET_FIRST+15",       /* 0x02ce */
554     "WM_TABLET_FIRST+16",       /* 0x02cf */
555     "WM_TABLET_FIRST+17",       /* 0x02d0 */
556     "WM_TABLET_FIRST+18",       /* 0x02d1 */
557     "WM_TABLET_FIRST+19",       /* 0x02d2 */
558     "WM_TABLET_FIRST+20",       /* 0x02d3 */
559     "WM_TABLET_FIRST+21",       /* 0x02d4 */
560     "WM_TABLET_FIRST+22",       /* 0x02d5 */
561     "WM_TABLET_FIRST+23",       /* 0x02d6 */
562     "WM_TABLET_FIRST+24",       /* 0x02d7 */
563     "WM_TABLET_FIRST+25",       /* 0x02d8 */
564     "WM_TABLET_FIRST+26",       /* 0x02d9 */
565     "WM_TABLET_FIRST+27",       /* 0x02da */
566     "WM_TABLET_FIRST+28",       /* 0x02db */
567     "WM_TABLET_FIRST+29",       /* 0x02dc */
568     "WM_TABLET_FIRST+30",       /* 0x02dd */
569     "WM_TABLET_FIRST+31",       /* 0x02de */
570     "WM_TABLET_LAST",           /* 0x02df */
571
572     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
573     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
574     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
575     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
576
577     "WM_CUT",                   /* 0x0300 */
578     "WM_COPY",
579     "WM_PASTE",
580     "WM_CLEAR",
581     "WM_UNDO",
582     "WM_RENDERFORMAT",
583     "WM_RENDERALLFORMATS",
584     "WM_DESTROYCLIPBOARD",
585     "WM_DRAWCLIPBOARD",
586     "WM_PAINTCLIPBOARD",
587     "WM_VSCROLLCLIPBOARD",
588     "WM_SIZECLIPBOARD",
589     "WM_ASKCBFORMATNAME",
590     "WM_CHANGECBCHAIN",
591     "WM_HSCROLLCLIPBOARD",
592     "WM_QUERYNEWPALETTE",       /* 0x030f*/
593
594     "WM_PALETTEISCHANGING",
595     "WM_PALETTECHANGED",
596     "WM_HOTKEY",                /* 0x0312 */
597     "WM_POPUPSYSTEMMENU",       /* 0x0313 */
598     NULL, NULL, NULL,
599     "WM_PRINT",                 /* 0x0317 */
600     "WM_PRINTCLIENT",           /* 0x0318 */
601     "WM_APPCOMMAND",            /* 0x0319 */
602     "WM_THEMECHANGED",          /* 0x031A */
603     NULL, NULL,
604     "WM_CLIPBOARDUPDATE",       /* 0x031D */
605     "WM_DWMCOMPOSITIONCHANGED", /* 0x031E */
606     "WM_DWMNCRENDERINGCHANGED", /* 0x031F */
607
608     "WM_DWMCOLORIZATIONCOLORCHANGED", /* 0x0320 */
609     "WM_DWMWINDOWMAXIMIZEDCHANGE", /* 0x0321 */
610     NULL, NULL, NULL, NULL, NULL, NULL,
611     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
612
613     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
614     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
615     "WM_GETTITLEBARINFOEX",     /* 0x033F */
616
617     /* 0x0340 */
618     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
619     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
620     /* 0x0350 */
621     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
622     "WM_HANDHELDFIRST",     /* 0x0358 */
623     "WM_HANDHELDFIRST+1",   /* 0x0359 */
624     "WM_HANDHELDFIRST+2",   /* 0x035A */
625     "WM_HANDHELDFIRST+3",   /* 0x035B */
626     "WM_HANDHELDFIRST+4",   /* 0x035C */
627     "WM_HANDHELDFIRST+5",   /* 0x035D */
628     "WM_HANDHELDFIRST+6",   /* 0x035E */
629     "WM_HANDHELDLAST",      /* 0x035F */
630
631     "WM_QUERYAFXWNDPROC",   /*  0x0360 WM_AFXFIRST */
632     "WM_SIZEPARENT",        /*  0x0361 */
633     "WM_SETMESSAGESTRING",  /*  0x0362 */
634     "WM_IDLEUPDATECMDUI",   /*  0x0363 */
635     "WM_INITIALUPDATE",     /*  0x0364 */
636     "WM_COMMANDHELP",       /*  0x0365 */
637     "WM_HELPHITTEST",       /*  0x0366 */
638     "WM_EXITHELPMODE",      /*  0x0367 */
639     "WM_RECALCPARENT",      /*  0x0368 */
640     "WM_SIZECHILD",         /*  0x0369 */
641     "WM_KICKIDLE",          /*  0x036A */
642     "WM_QUERYCENTERWND",    /*  0x036B */
643     "WM_DISABLEMODAL",      /*  0x036C */
644     "WM_FLOATSTATUS",       /*  0x036D */
645     "WM_ACTIVATETOPLEVEL",  /*  0x036E */
646     "WM_QUERY3DCONTROLS",   /*  0x036F */
647     NULL,NULL,NULL,
648     "WM_SOCKET_NOTIFY",     /*  0x0373 */
649     "WM_SOCKET_DEAD",       /*  0x0374 */
650     "WM_POPMESSAGESTRING",  /*  0x0375 */
651     "WM_OCC_LOADFROMSTREAM",     /* 0x0376 */
652     "WM_OCC_LOADFROMSTORAGE",    /* 0x0377 */
653     "WM_OCC_INITNEW",            /* 0x0378 */
654     "WM_QUEUE_SENTINEL",         /* 0x0379 */
655     "WM_OCC_LOADFROMSTREAM_EX",  /* 0x037A */
656     "WM_OCC_LOADFROMSTORAGE_EX", /* 0x037B */
657
658     NULL,NULL,NULL,
659     "WM_AFXLAST",               /* 0x037F */
660
661     "WM_PENWINFIRST",           /* 0x0380 */
662     "WM_RCRESULT",              /* 0x0381 */
663     "WM_HOOKRCRESULT",          /* 0x0382 */
664     "WM_GLOBALRCCHANGE",        /* 0x0383 */
665     "WM_SKB",                   /* 0x0384 */
666     "WM_HEDITCTL",              /* 0x0385 */
667     NULL, NULL,
668     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
669     "WM_PENWINLAST",            /* 0x038F */
670
671     "WM_COALESCE_FIRST",        /* 0x0390 */
672     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
673     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
674     "WM_COALESCE_LAST",         /* 0x039F */
675
676     /* 0x03a0 */
677     "MM_JOY1MOVE",
678     "MM_JOY2MOVE",
679     "MM_JOY1ZMOVE",
680     "MM_JOY2ZMOVE",
681                             NULL, NULL, NULL, NULL,
682     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
683
684     /* 0x03b0 */
685     NULL, NULL, NULL, NULL, NULL,
686     "MM_JOY1BUTTONDOWN",
687     "MM_JOY2BUTTONDOWN",
688     "MM_JOY1BUTTONUP",
689     "MM_JOY2BUTTONUP",
690     "MM_MCINOTIFY",       /* 0x03B9 */
691                 NULL,
692     "MM_WOM_OPEN",        /* 0x03BB */
693     "MM_WOM_CLOSE",       /* 0x03BC */
694     "MM_WOM_DONE",        /* 0x03BD */
695     "MM_WIM_OPEN",        /* 0x03BE */
696     "MM_WIM_CLOSE",       /* 0x03BF */
697
698     /* 0x03c0 */
699     "MM_WIM_DATA",        /* 0x03C0 */
700     "MM_MIM_OPEN",        /* 0x03C1 */
701     "MM_MIM_CLOSE",       /* 0x03C2 */
702     "MM_MIM_DATA",        /* 0x03C3 */
703     "MM_MIM_LONGDATA",    /* 0x03C4 */
704     "MM_MIM_ERROR",       /* 0x03C5 */
705     "MM_MIM_LONGERROR",   /* 0x03C6 */
706     "MM_MOM_OPEN",        /* 0x03C7 */
707     "MM_MOM_CLOSE",       /* 0x03C8 */
708     "MM_MOM_DONE",        /* 0x03C9 */
709     "MM_MOM_POSITIONCB",  /* 0x03CA */
710     "MM_MCISIGNAL",       /* 0x03CB */
711     "MM_MIM_MOREDATA",    /* 0x03CC */
712                                   NULL, NULL, NULL,
713
714     /* 0x03d0 */
715     "MM_MIXM_LINE_CHANGE",
716     "MM_MIXM_CONTROL_CHANGE",
717                 NULL, NULL, NULL, NULL, NULL, NULL,
718     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
719
720     /* 0x03e0 */
721     "WM_DDE_INITIATE",  /* 0x3E0 */
722     "WM_DDE_TERMINATE", /* 0x3E1 */
723     "WM_DDE_ADVISE",    /* 0x3E2 */
724     "WM_DDE_UNADVISE",  /* 0x3E3 */
725     "WM_DDE_ACK",       /* 0x3E4 */
726     "WM_DDE_DATA",      /* 0x3E5 */
727     "WM_DDE_REQUEST",   /* 0x3E6 */
728     "WM_DDE_POKE",      /* 0x3E7 */
729     "WM_DDE_EXECUTE",   /* 0x3E8 */
730     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
731
732
733     /* 0x03f0 */
734     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
735     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
736
737     "WM_USER"                   /* 0x0400 */
738 };
739
740
741 #define SPY_MAX_LVMMSGNUM   182
742 static const char * const LVMMessageTypeNames[SPY_MAX_LVMMSGNUM + 1] =
743 {
744     "LVM_GETBKCOLOR",           /* 1000 */
745     "LVM_SETBKCOLOR",
746     "LVM_GETIMAGELIST",
747     "LVM_SETIMAGELIST",
748     "LVM_GETITEMCOUNT",
749     "LVM_GETITEMA",
750     "LVM_SETITEMA",
751     "LVM_INSERTITEMA",
752     "LVM_DELETEITEM",
753     "LVM_DELETEALLITEMS",
754     "LVM_GETCALLBACKMASK",
755     "LVM_SETCALLBACKMASK",
756     "LVM_GETNEXTITEM",
757     "LVM_FINDITEMA",
758     "LVM_GETITEMRECT",
759     "LVM_SETITEMPOSITION",
760     "LVM_GETITEMPOSITION",
761     "LVM_GETSTRINGWIDTHA",
762     "LVM_HITTEST",
763     "LVM_ENSUREVISIBLE",
764     "LVM_SCROLL",
765     "LVM_REDRAWITEMS",
766     "LVM_ARRANGE",
767     "LVM_EDITLABELA",
768     "LVM_GETEDITCONTROL",
769     "LVM_GETCOLUMNA",
770     "LVM_SETCOLUMNA",
771     "LVM_INSERTCOLUMNA",
772     "LVM_DELETECOLUMN",
773     "LVM_GETCOLUMNWIDTH",
774     "LVM_SETCOLUMNWIDTH",
775     "LVM_GETHEADER",
776     NULL,
777     "LVM_CREATEDRAGIMAGE",
778     "LVM_GETVIEWRECT",
779     "LVM_GETTEXTCOLOR",
780     "LVM_SETTEXTCOLOR",
781     "LVM_GETTEXTBKCOLOR",
782     "LVM_SETTEXTBKCOLOR",
783     "LVM_GETTOPINDEX",
784     "LVM_GETCOUNTPERPAGE",
785     "LVM_GETORIGIN",
786     "LVM_UPDATE",
787     "LVM_SETITEMSTATE",
788     "LVM_GETITEMSTATE",
789     "LVM_GETITEMTEXTA",
790     "LVM_SETITEMTEXTA",
791     "LVM_SETITEMCOUNT",
792     "LVM_SORTITEMS",
793     "LVM_SETITEMPOSITION32",
794     "LVM_GETSELECTEDCOUNT",
795     "LVM_GETITEMSPACING",
796     "LVM_GETISEARCHSTRINGA",
797     "LVM_SETICONSPACING",
798     "LVM_SETEXTENDEDLISTVIEWSTYLE",
799     "LVM_GETEXTENDEDLISTVIEWSTYLE",
800     "LVM_GETSUBITEMRECT",
801     "LVM_SUBITEMHITTEST",
802     "LVM_SETCOLUMNORDERARRAY",
803     "LVM_GETCOLUMNORDERARRAY",
804     "LVM_SETHOTITEM",
805     "LVM_GETHOTITEM",
806     "LVM_SETHOTCURSOR",
807     "LVM_GETHOTCURSOR",
808     "LVM_APPROXIMATEVIEWRECT",
809     "LVM_SETWORKAREAS",
810     "LVM_GETSELECTIONMARK",
811     "LVM_SETSELECTIONMARK",
812     "LVM_SETBKIMAGEA",
813     "LVM_GETBKIMAGEA",
814     "LVM_GETWORKAREAS",
815     "LVM_SETHOVERTIME",
816     "LVM_GETHOVERTIME",
817     "LVM_GETNUMBEROFWORKAREAS",
818     "LVM_SETTOOLTIPS",
819     "LVM_GETITEMW",
820     "LVM_SETITEMW",
821     "LVM_INSERTITEMW",
822     "LVM_GETTOOLTIPS",
823     NULL,
824     NULL,
825     NULL,
826     NULL,
827     "LVM_FINDITEMW",
828     NULL,
829     NULL,
830     NULL,
831     "LVM_GETSTRINGWIDTHW",
832     NULL,
833     NULL,
834     NULL,
835     NULL,
836     NULL,
837     NULL,
838     NULL,
839     "LVM_GETCOLUMNW",
840     "LVM_SETCOLUMNW",
841     "LVM_INSERTCOLUMNW",
842     NULL,
843     NULL,
844     NULL,
845     NULL,
846     NULL,
847     NULL,
848     NULL,
849     NULL,
850     NULL,
851     NULL,
852     NULL,
853     NULL,
854     NULL,
855     NULL,
856     NULL,
857     NULL,
858     NULL,
859     "LVM_GETITEMTEXTW",
860     "LVM_SETITEMTEXTW",
861     "LVM_GETISEARCHSTRINGW",
862     "LVM_EDITLABELW",
863     NULL,
864     NULL,
865     NULL,
866     NULL,
867     NULL,
868     NULL,
869     NULL,
870     NULL,
871     NULL,
872     NULL,
873     NULL,
874     NULL,
875     NULL,
876     NULL,
877     NULL,
878     NULL,
879     NULL,
880     NULL,
881     NULL,
882     "LVM_SETBKIMAGEW",
883     "LVM_GETBKIMAGEW",   /* 0x108B */
884     "LVM_SETSELECTEDCOLUMN",
885     "LVM_SETTILEWIDTH",
886     "LVM_SETVIEW",
887     "LVM_GETVIEW",
888     NULL,
889     "LVM_INSERTGROUP",
890     NULL,
891     "LVM_SETGROUPINFO",
892     NULL,
893     "LVM_GETGROUPINFO",
894     "LVM_REMOVEGROUP",
895     "LVM_MOVEGROUP",
896     NULL,
897     NULL,
898     "LVM_MOVEITEMTOGROUP",
899     "LVM_SETGROUPMETRICS",
900     "LVM_GETGROUPMETRICS",
901     "LVM_ENABLEGROUPVIEW",
902     "LVM_SORTGROUPS",
903     "LVM_INSERTGROUPSORTED",
904     "LVM_REMOVEALLGROUPS",
905     "LVM_HASGROUP",
906     "LVM_SETTILEVIEWINFO",
907     "LVM_GETTILEVIEWINFO",
908     "LVM_SETTILEINFO",
909     "LVM_GETTILEINFO",
910     "LVM_SETINSERTMARK",
911     "LVM_GETINSERTMARK",
912     "LVM_INSERTMARKHITTEST",
913     "LVM_GETINSERTMARKRECT",
914     "LVM_SETINSERTMARKCOLOR",
915     "LVM_GETINSERTMARKCOLOR",
916     NULL,
917     "LVM_SETINFOTIP",
918     "LVM_GETSELECTEDCOLUMN",
919     "LVM_ISGROUPVIEWENABLED",
920     "LVM_GETOUTLINECOLOR",
921     "LVM_SETOUTLINECOLOR",
922     NULL,
923     "LVM_CANCELEDITLABEL",
924     "LVM_MAPINDEXTOID",
925     "LVM_MAPIDTOINDEX",
926     "LVM_ISITEMVISIBLE"
927 };
928
929
930 #define SPY_MAX_TVMSGNUM   65
931 static const char * const TVMessageTypeNames[SPY_MAX_TVMSGNUM + 1] =
932 {
933     "TVM_INSERTITEMA",          /* 1100 */
934     "TVM_DELETEITEM",
935     "TVM_EXPAND",
936     NULL,
937     "TVM_GETITEMRECT",
938     "TVM_GETCOUNT",
939     "TVM_GETINDENT",
940     "TVM_SETINDENT",
941     "TVM_GETIMAGELIST",
942     "TVM_SETIMAGELIST",
943     "TVM_GETNEXTITEM",
944     "TVM_SELECTITEM",
945     "TVM_GETITEMA",
946     "TVM_SETITEMA",
947     "TVM_EDITLABELA",
948     "TVM_GETEDITCONTROL",
949     "TVM_GETVISIBLECOUNT",
950     "TVM_HITTEST",
951     "TVM_CREATEDRAGIMAGE",
952     "TVM_SORTCHILDREN",
953     "TVM_ENSUREVISIBLE",
954     "TVM_SORTCHILDRENCB",
955     "TVM_ENDEDITLABELNOW",
956     "TVM_GETISEARCHSTRINGA",
957     "TVM_SETTOOLTIPS",
958     "TVM_GETTOOLTIPS",
959     "TVM_SETINSERTMARK",
960     "TVM_SETITEMHEIGHT",
961     "TVM_GETITEMHEIGHT",
962     "TVM_SETBKCOLOR",
963     "TVM_SETTEXTCOLOR",
964     "TVM_GETBKCOLOR",
965     "TVM_GETTEXTCOLOR",
966     "TVM_SETSCROLLTIME",
967     "TVM_GETSCROLLTIME",
968     "TVM_UNKNOWN35",
969     "TVM_UNKNOWN36",
970     "TVM_SETINSERTMARKCOLOR",
971     "TVM_GETINSERTMARKCOLOR",
972     "TVM_GETITEMSTATE",
973     "TVM_SETLINECOLOR",
974     "TVM_GETLINECOLOR",
975     NULL,
976     NULL,
977     NULL,
978     NULL,
979     NULL,
980     NULL,
981     NULL,
982     NULL,
983     "TVM_INSERTITEMW",
984     NULL,
985     NULL,
986     NULL,
987     NULL,
988     NULL,
989     NULL,
990     NULL,
991     NULL,
992     NULL,
993     NULL,
994     NULL,
995     "TVM_GETITEMW",
996     "TVM_SETITEMW",
997     "TVM_GETISEARCHSTRINGW",
998     "TVM_EDITLABELW"
999 };
1000
1001
1002 #define SPY_MAX_HDMMSGNUM   19
1003 static const char * const HDMMessageTypeNames[SPY_MAX_HDMMSGNUM + 1] =
1004 {
1005     "HDM_GETITEMCOUNT",         /* 1200 */
1006     "HDM_INSERTITEMA",
1007     "HDM_DELETEITEM",
1008     "HDM_GETITEMA",
1009     "HDM_SETITEMA",
1010     "HDM_LAYOUT",
1011     "HDM_HITTEST",
1012     "HDM_GETITEMRECT",
1013     "HDM_SETIMAGELIST",
1014     "HDM_GETIMAGELIST",
1015     "HDM_INSERTITEMW",
1016     "HDM_GETITEMW",
1017     "HDM_SETITEMW",
1018     NULL,
1019     NULL,
1020     "HDM_ORDERTOINDEX",
1021     "HDM_CREATEDRAGIMAGE",
1022     "GETORDERARRAYINDEX",
1023     "SETORDERARRAYINDEX",
1024     "SETHOTDIVIDER"
1025 };
1026
1027
1028 #define SPY_MAX_TCMMSGNUM   62
1029 static const char * const TCMMessageTypeNames[SPY_MAX_TCMMSGNUM + 1] =
1030 {
1031     NULL,               /* 1300 */
1032     NULL,
1033     "TCM_SETIMAGELIST",
1034     "TCM_GETIMAGELIST",
1035     "TCM_GETITEMCOUNT",
1036     "TCM_GETITEMA",
1037     "TCM_SETITEMA",
1038     "TCM_INSERTITEMA",
1039     "TCM_DELETEITEM",
1040     "TCM_DELETEALLITEMS",
1041     "TCM_GETITEMRECT",
1042     "TCM_GETCURSEL",
1043     "TCM_SETCURSEL",
1044     "TCM_HITTEST",
1045     "TCM_SETITEMEXTRA",
1046     NULL,
1047     NULL,
1048     NULL,
1049     NULL,
1050     NULL,
1051     NULL,
1052     NULL,
1053     NULL,
1054     NULL,
1055     NULL,
1056     NULL,
1057     NULL,
1058     NULL,
1059     NULL,
1060     NULL,
1061     NULL,
1062     NULL,
1063     NULL,
1064     NULL,
1065     NULL,
1066     NULL,
1067     NULL,
1068     NULL,
1069     NULL,
1070     NULL,
1071     "TCM_ADJUSTRECT",
1072     "TCM_SETITEMSIZE",
1073     "TCM_REMOVEIMAGE",
1074     "TCM_SETPADDING",
1075     "TCM_GETROWCOUNT",
1076     "TCM_GETTOOLTIPS",
1077     "TCM_SETTOOLTIPS",
1078     "TCM_GETCURFOCUS",
1079     "TCM_SETCURFOCUS",
1080     "TCM_SETMINTABWIDTH",
1081     "TCM_DESELECTALL",
1082     "TCM_HIGHLIGHTITEM",
1083     "TCM_SETEXTENDEDSTYLE",
1084     "TCM_GETEXTENDEDSTYLE",
1085     NULL,
1086     NULL,
1087     NULL,
1088     NULL,
1089     NULL,
1090     NULL,
1091     "TCM_GETITEMW",
1092     "TCM_SETITEMW",
1093     "TCM_INSERTITEMW"
1094 };
1095
1096 #define SPY_MAX_PGMMSGNUM   13
1097 static const char * const PGMMessageTypeNames[SPY_MAX_PGMMSGNUM + 1] =
1098 {
1099     NULL,               /* 1400 */
1100     "PGM_SETCHILD",
1101     "PGM_RECALCSIZE",
1102     "PGM_FORWARDMOUSE",
1103     "PGM_SETBKCOLOR",
1104     "PGM_GETBKCOLOR",
1105     "PGM_SETBORDER",
1106     "PGM_GETBORDER",
1107     "PGM_SETPOS",
1108     "PGM_GETPOS",
1109     "PGM_SETBUTTONSIZE",
1110     "PGM_GETBUTTONSIZE",
1111     "PGM_GETBUTTONSTATE",
1112     "PGM_GETDROPTARGET"
1113 };
1114
1115
1116 #define SPY_MAX_CCMMSGNUM   9
1117 static const char * const CCMMessageTypeNames[SPY_MAX_CCMMSGNUM + 1] =
1118 {
1119     NULL,               /* 0x2000 */
1120     "CCM_SETBKCOLOR",
1121     "CCM_SETCOLORSCHEME",
1122     "CCM_GETCOLORSCHEME",
1123     "CCM_GETDROPTARGET",
1124     "CCM_SETUNICODEFORMAT",
1125     "CCM_GETUNICODEFORMAT",
1126     "CCM_SETVERSION",
1127     "CCM_GETVERSION",
1128     "CCM_SETNOTIFYWINDOW"
1129 };
1130
1131 #define SPY_MAX_WINEMSGNUM   (WM_WINE_MOUSE_LL_HOOK - WM_WINE_DESTROYWINDOW)
1132 static const char * const WINEMessageTypeNames[SPY_MAX_WINEMSGNUM + 1] =
1133 {
1134     "WM_WINE_DESTROYWINDOW",
1135     "WM_WINE_SETWINDOWPOS",
1136     "WM_WINE_SHOWWINDOW",
1137     "WM_WINE_SETPARENT",
1138     "WM_WINE_SETWINDOWLONG",
1139     "WM_WINE_ENABLEWINDOW",
1140     "WM_WINE_SETACTIVEWINDOW",
1141     "WM_WINE_KEYBOARD_LL_HOOK",
1142     "WM_WINE_MOUSE_LL_HOOK",
1143 };
1144
1145 /* Virtual key names */
1146 #define SPY_MAX_VKKEYSNUM 255
1147 static const char * const VK_KeyNames[SPY_MAX_VKKEYSNUM + 1] =
1148 {
1149     NULL,               /* 0x00 */
1150     "VK_LBUTTON",       /* 0x01 */
1151     "VK_RBUTTON",       /* 0x02 */
1152     "VK_CANCEL",        /* 0x03 */
1153     "VK_MBUTTON",       /* 0x04 */
1154     "VK_XBUTTON1",      /* 0x05 */
1155     "VK_XBUTTON2",      /* 0x06 */
1156     NULL,               /* 0x07 */
1157     "VK_BACK",          /* 0x08 */
1158     "VK_TAB",           /* 0x09 */
1159     NULL,               /* 0x0A */
1160     NULL,               /* 0x0B */
1161     "VK_CLEAR",         /* 0x0C */
1162     "VK_RETURN",        /* 0x0D */
1163     NULL,               /* 0x0E */
1164     NULL,               /* 0x0F */
1165     "VK_SHIFT",         /* 0x10 */
1166     "VK_CONTROL",       /* 0x11 */
1167     "VK_MENU",          /* 0x12 */
1168     "VK_PAUSE",         /* 0x13 */
1169     "VK_CAPITAL",       /* 0x14 */
1170     NULL,               /* 0x15 */
1171     NULL,               /* 0x16 */
1172     NULL,               /* 0x17 */
1173     NULL,               /* 0x18 */
1174     NULL,               /* 0x19 */
1175     NULL,               /* 0x1A */
1176     "VK_ESCAPE",        /* 0x1B */
1177     "VK_CONVERT",       /* 0x1C */
1178     "VK_NONCONVERT",    /* 0x1D */
1179     "VK_ACCEPT",        /* 0x1E */
1180     "VK_MODECHANGE",    /* 0x1F */
1181     "VK_SPACE",         /* 0x20 */
1182     "VK_PRIOR",         /* 0x21 */
1183     "VK_NEXT",          /* 0x22 */
1184     "VK_END",           /* 0x23 */
1185     "VK_HOME",          /* 0x24 */
1186     "VK_LEFT",          /* 0x25 */
1187     "VK_UP",            /* 0x26 */
1188     "VK_RIGHT",         /* 0x27 */
1189     "VK_DOWN",          /* 0x28 */
1190     "VK_SELECT",        /* 0x29 */
1191     "VK_PRINT",         /* 0x2A */
1192     "VK_EXECUTE",       /* 0x2B */
1193     "VK_SNAPSHOT",      /* 0x2C */
1194     "VK_INSERT",        /* 0x2D */
1195     "VK_DELETE",        /* 0x2E */
1196     "VK_HELP",          /* 0x2F */
1197     "VK_0",             /* 0x30 */
1198     "VK_1",             /* 0x31 */
1199     "VK_2",             /* 0x32 */
1200     "VK_3",             /* 0x33 */
1201     "VK_4",             /* 0x34 */
1202     "VK_5",             /* 0x35 */
1203     "VK_6",             /* 0x36 */
1204     "VK_7",             /* 0x37 */
1205     "VK_8",             /* 0x38 */
1206     "VK_9",             /* 0x39 */
1207     NULL,               /* 0x3A */
1208     NULL,               /* 0x3B */
1209     NULL,               /* 0x3C */
1210     NULL,               /* 0x3D */
1211     NULL,               /* 0x3E */
1212     NULL,               /* 0x3F */
1213     NULL,               /* 0x40 */
1214     "VK_A",             /* 0x41 */
1215     "VK_B",             /* 0x42 */
1216     "VK_C",             /* 0x43 */
1217     "VK_D",             /* 0x44 */
1218     "VK_E",             /* 0x45 */
1219     "VK_F",             /* 0x46 */
1220     "VK_G",             /* 0x47 */
1221     "VK_H",             /* 0x48 */
1222     "VK_I",             /* 0x49 */
1223     "VK_J",             /* 0x4A */
1224     "VK_K",             /* 0x4B */
1225     "VK_L",             /* 0x4C */
1226     "VK_M",             /* 0x4D */
1227     "VK_N",             /* 0x4E */
1228     "VK_O",             /* 0x4F */
1229     "VK_P",             /* 0x50 */
1230     "VK_Q",             /* 0x51 */
1231     "VK_R",             /* 0x52 */
1232     "VK_S",             /* 0x53 */
1233     "VK_T",             /* 0x54 */
1234     "VK_U",             /* 0x55 */
1235     "VK_V",             /* 0x56 */
1236     "VK_W",             /* 0x57 */
1237     "VK_X",             /* 0x58 */
1238     "VK_Y",             /* 0x59 */
1239     "VK_Z",             /* 0x5A */
1240     "VK_LWIN",          /* 0x5B */
1241     "VK_RWIN",          /* 0x5C */
1242     "VK_APPS",          /* 0x5D */
1243     NULL,               /* 0x5E */
1244     "VK_SLEEP",         /* 0x5F */
1245     "VK_NUMPAD0",       /* 0x60 */
1246     "VK_NUMPAD1",       /* 0x61 */
1247     "VK_NUMPAD2",       /* 0x62 */
1248     "VK_NUMPAD3",       /* 0x63 */
1249     "VK_NUMPAD4",       /* 0x64 */
1250     "VK_NUMPAD5",       /* 0x65 */
1251     "VK_NUMPAD6",       /* 0x66 */
1252     "VK_NUMPAD7",       /* 0x67 */
1253     "VK_NUMPAD8",       /* 0x68 */
1254     "VK_NUMPAD9",       /* 0x69 */
1255     "VK_MULTIPLY",      /* 0x6A */
1256     "VK_ADD",           /* 0x6B */
1257     "VK_SEPARATOR",     /* 0x6C */
1258     "VK_SUBTRACT",      /* 0x6D */
1259     "VK_DECIMAL",       /* 0x6E */
1260     "VK_DIVIDE",        /* 0x6F */
1261     "VK_F1",            /* 0x70 */
1262     "VK_F2",            /* 0x71 */
1263     "VK_F3",            /* 0x72 */
1264     "VK_F4",            /* 0x73 */
1265     "VK_F5",            /* 0x74 */
1266     "VK_F6",            /* 0x75 */
1267     "VK_F7",            /* 0x76 */
1268     "VK_F8",            /* 0x77 */
1269     "VK_F9",            /* 0x78 */
1270     "VK_F10",           /* 0x79 */
1271     "VK_F11",           /* 0x7A */
1272     "VK_F12",           /* 0x7B */
1273     "VK_F13",           /* 0x7C */
1274     "VK_F14",           /* 0x7D */
1275     "VK_F15",           /* 0x7E */
1276     "VK_F16",           /* 0x7F */
1277     "VK_F17",           /* 0x80 */
1278     "VK_F18",           /* 0x81 */
1279     "VK_F19",           /* 0x82 */
1280     "VK_F20",           /* 0x83 */
1281     "VK_F21",           /* 0x84 */
1282     "VK_F22",           /* 0x85 */
1283     "VK_F23",           /* 0x86 */
1284     "VK_F24",           /* 0x87 */
1285     NULL,               /* 0x88 */
1286     NULL,               /* 0x89 */
1287     NULL,               /* 0x8A */
1288     NULL,               /* 0x8B */
1289     NULL,               /* 0x8C */
1290     NULL,               /* 0x8D */
1291     NULL,               /* 0x8E */
1292     NULL,               /* 0x8F */
1293     "VK_NUMLOCK",       /* 0x90 */
1294     "VK_SCROLL",        /* 0x91 */
1295     "VK_OEM_NEC_EQUAL",       /* 0x92 aka. VK_OEM_FJ_JISHO */
1296     "VK_OEM_FJ_MASSHOU",      /* 0x93 */
1297     "VK_OEM_FJ_TOUROKU",      /* 0x94 */
1298     "VK_OEM_FJ_LOYA",         /* 0x95 */
1299     "VK_OEM_FJ_ROYA",         /* 0x96 */
1300     NULL,               /* 0x97 */
1301     NULL,               /* 0x98 */
1302     NULL,               /* 0x99 */
1303     NULL,               /* 0x9A */
1304     NULL,               /* 0x9B */
1305     NULL,               /* 0x9C */
1306     NULL,               /* 0x9D */
1307     NULL,               /* 0x9E */
1308     NULL,               /* 0x9F */
1309     "VK_LSHIFT",        /* 0xA0 */
1310     "VK_RSHIFT",        /* 0xA1 */
1311     "VK_LCONTROL",      /* 0xA2 */
1312     "VK_RCONTROL",      /* 0xA3 */
1313     "VK_LMENU",         /* 0xA4 */
1314     "VK_RMENU",         /* 0xA5 */
1315     "VK_BROWSER_BACK",        /* 0xA6 */
1316     "VK_BROWSER_FORWARD",     /* 0xA7 */
1317     "VK_BROWSER_REFRESH",     /* 0xA8 */
1318     "VK_BROWSER_STOP",        /* 0xA9 */
1319     "VK_BROWSER_SEARCH",      /* 0xAA */
1320     "VK_BROWSER_FAVORITES",   /* 0xAB */
1321     "VK_BROWSER_HOME",        /* 0xAC */
1322     "VK_VOLUME_MUTE",         /* 0xAD */
1323     "VK_VOLUME_DOWN",         /* 0xAE */
1324     "VK_VOLUME_UP",           /* 0xAF */
1325     "VK_MEDIA_NEXT_TRACK",    /* 0xB0 */
1326     "VK_MEDIA_PREV_TRACK",    /* 0xB1 */
1327     "VK_MEDIA_STOP",          /* 0xB2 */
1328     "VK_MEDIA_PLAY_PAUSE",    /* 0xB3 */
1329     "VK_LAUNCH_MAIL",         /* 0xB4 */
1330     "VK_LAUNCH_MEDIA_SELECT", /* 0xB5 */
1331     "VK_LAUNCH_APP1",         /* 0xB6 */
1332     "VK_LAUNCH_APP2",         /* 0xB7 */
1333     NULL,               /* 0xB8 */
1334     NULL,               /* 0xB9 */
1335     "VK_OEM_1",         /* 0xBA */
1336     "VK_OEM_PLUS",      /* 0xBB */
1337     "VK_OEM_COMMA",     /* 0xBC */
1338     "VK_OEM_MINUS",     /* 0xBD */
1339     "VK_OEM_PERIOD",    /* 0xBE */
1340     "VK_OEM_2",         /* 0xBF */
1341     "VK_OEM_3",         /* 0xC0 */
1342     NULL,               /* 0xC1 */
1343     NULL,               /* 0xC2 */
1344     NULL,               /* 0xC3 */
1345     NULL,               /* 0xC4 */
1346     NULL,               /* 0xC5 */
1347     NULL,               /* 0xC6 */
1348     NULL,               /* 0xC7 */
1349     NULL,               /* 0xC8 */
1350     NULL,               /* 0xC9 */
1351     NULL,               /* 0xCA */
1352     NULL,               /* 0xCB */
1353     NULL,               /* 0xCC */
1354     NULL,               /* 0xCD */
1355     NULL,               /* 0xCE */
1356     NULL,               /* 0xCF */
1357     NULL,               /* 0xD0 */
1358     NULL,               /* 0xD1 */
1359     NULL,               /* 0xD2 */
1360     NULL,               /* 0xD3 */
1361     NULL,               /* 0xD4 */
1362     NULL,               /* 0xD5 */
1363     NULL,               /* 0xD6 */
1364     NULL,               /* 0xD7 */
1365     NULL,               /* 0xD8 */
1366     NULL,               /* 0xD9 */
1367     NULL,               /* 0xDA */
1368     "VK_OEM_4",         /* 0xDB */
1369     "VK_OEM_5",         /* 0xDC */
1370     "VK_OEM_6",         /* 0xDD */
1371     "VK_OEM_7",         /* 0xDE */
1372     "VK_OEM_8",         /* 0xDF */
1373     NULL,               /* 0xE0 */
1374     "VK_OEM_AX",        /* 0xE1 */
1375     "VK_OEM_102",       /* 0xE2 */
1376     "VK_ICO_HELP",      /* 0xE3 */
1377     "VK_ICO_00",        /* 0xE4 */
1378     "VK_PROCESSKEY",    /* 0xE5 */
1379     NULL,               /* 0xE6 */
1380     "VK_PACKET",        /* 0xE7 */
1381     NULL,               /* 0xE8 */
1382     NULL,               /* 0xE9 */
1383     NULL,               /* 0xEA */
1384     NULL,               /* 0xEB */
1385     NULL,               /* 0xEC */
1386     NULL,               /* 0xED */
1387     NULL,               /* 0xEE */
1388     NULL,               /* 0xEF */
1389     NULL,               /* 0xF0 */
1390     NULL,               /* 0xF1 */
1391     NULL,               /* 0xF2 */
1392     NULL,               /* 0xF3 */
1393     NULL,               /* 0xF4 */
1394     NULL,               /* 0xF5 */
1395     "VK_ATTN",          /* 0xF6 */
1396     "VK_CRSEL",         /* 0xF7 */
1397     "VK_EXSEL",         /* 0xF8 */
1398     "VK_EREOF",         /* 0xF9 */
1399     "VK_PLAY",          /* 0xFA */
1400     "VK_ZOOM",          /* 0xFB */
1401     "VK_NONAME",        /* 0xFC */
1402     "VK_PA1",           /* 0xFD */
1403     "VK_OEM_CLEAR",     /* 0xFE */
1404     NULL                /* 0xFF */
1405 };
1406
1407
1408 /************************************************************************/
1409
1410
1411 /* WM_USER+n message values for "common controls" */
1412
1413 typedef struct
1414 {
1415     const char *name;      /* name of control message           */
1416     UINT        value;     /* message number (0x0401-0x0fff     */
1417     UINT        len;       /* length of space at lParam to dump */
1418 } USER_MSG;
1419
1420
1421 typedef struct
1422 {
1423     const WCHAR      *classname;  /* class name to match */
1424     const USER_MSG   *classmsg;   /* pointer to first USER_MSG for class */
1425     UINT              count;      /* number of entries */
1426 } CONTROL_CLASS;
1427
1428 #define USM(a,b) { #a ,a,b}
1429 #define SZOF(a)  sizeof(a)
1430
1431 /* To dump memory at the lParam for any of these messages,  */
1432 /* replace the "0" with a "SZOF(structure)", or with a      */
1433 /* number. (First method preferred.)                         */
1434
1435 #define RB_GETBANDINFO_OLD (WM_USER+5) /* obsoleted after IE3, but we have to support it anyway */
1436
1437 static const USER_MSG rebar_array[] = {
1438           USM(RB_INSERTBANDA,          0),
1439           USM(RB_DELETEBAND,           0),
1440           USM(RB_GETBARINFO,           0),
1441           USM(RB_SETBARINFO,           0),
1442           USM(RB_GETBANDINFO_OLD,      0),
1443           USM(RB_SETBANDINFOA,         0),
1444           USM(RB_SETPARENT,            0),
1445           USM(RB_HITTEST,              0),
1446           USM(RB_GETRECT,              0),
1447           USM(RB_INSERTBANDW,          0),
1448           USM(RB_SETBANDINFOW,         0),
1449           USM(RB_GETBANDCOUNT,         0),
1450           USM(RB_GETROWCOUNT,          0),
1451           USM(RB_GETROWHEIGHT,         0),
1452           USM(RB_IDTOINDEX,            0),
1453           USM(RB_GETTOOLTIPS,          0),
1454           USM(RB_SETTOOLTIPS,          0),
1455           USM(RB_SETBKCOLOR,           0),
1456           USM(RB_GETBKCOLOR,           0),
1457           USM(RB_SETTEXTCOLOR,         0),
1458           USM(RB_GETTEXTCOLOR,         0),
1459           USM(RB_SIZETORECT,           0),
1460           USM(RB_BEGINDRAG,            0),
1461           USM(RB_ENDDRAG,              0),
1462           USM(RB_DRAGMOVE,             0),
1463           USM(RB_GETBARHEIGHT,         0),
1464           USM(RB_GETBANDINFOW,         0),
1465           USM(RB_GETBANDINFOA,         0),
1466           USM(RB_MINIMIZEBAND,         0),
1467           USM(RB_MAXIMIZEBAND,         0),
1468           USM(RB_GETBANDBORDERS,       0),
1469           USM(RB_SHOWBAND,             0),
1470           USM(RB_SETPALETTE,           0),
1471           USM(RB_GETPALETTE,           0),
1472           USM(RB_MOVEBAND,             0),
1473 };
1474
1475 static const USER_MSG toolbar_array[] = {
1476           USM(TB_ENABLEBUTTON          ,0),
1477           USM(TB_CHECKBUTTON           ,0),
1478           USM(TB_PRESSBUTTON           ,0),
1479           USM(TB_HIDEBUTTON            ,0),
1480           USM(TB_INDETERMINATE         ,0),
1481           USM(TB_MARKBUTTON            ,0),
1482           USM(TB_ISBUTTONENABLED       ,0),
1483           USM(TB_ISBUTTONCHECKED       ,0),
1484           USM(TB_ISBUTTONPRESSED       ,0),
1485           USM(TB_ISBUTTONHIDDEN        ,0),
1486           USM(TB_ISBUTTONINDETERMINATE ,0),
1487           USM(TB_ISBUTTONHIGHLIGHTED   ,0),
1488           USM(TB_SETSTATE              ,0),
1489           USM(TB_GETSTATE              ,0),
1490           USM(TB_ADDBITMAP             ,0),
1491           USM(TB_ADDBUTTONSA           ,0),
1492           USM(TB_INSERTBUTTONA         ,0),
1493           USM(TB_DELETEBUTTON          ,0),
1494           USM(TB_GETBUTTON             ,0),
1495           USM(TB_BUTTONCOUNT           ,0),
1496           USM(TB_COMMANDTOINDEX        ,0),
1497           USM(TB_SAVERESTOREA          ,0),
1498           USM(TB_CUSTOMIZE             ,0),
1499           USM(TB_ADDSTRINGA            ,0),
1500           USM(TB_GETITEMRECT           ,0),
1501           USM(TB_BUTTONSTRUCTSIZE      ,0),
1502           USM(TB_SETBUTTONSIZE         ,0),
1503           USM(TB_SETBITMAPSIZE         ,0),
1504           USM(TB_AUTOSIZE              ,0),
1505           USM(TB_GETTOOLTIPS           ,0),
1506           USM(TB_SETTOOLTIPS           ,0),
1507           USM(TB_SETPARENT             ,0),
1508           USM(TB_SETROWS               ,0),
1509           USM(TB_GETROWS               ,0),
1510           USM(TB_GETBITMAPFLAGS        ,0),
1511           USM(TB_SETCMDID              ,0),
1512           USM(TB_CHANGEBITMAP          ,0),
1513           USM(TB_GETBITMAP             ,0),
1514           USM(TB_GETBUTTONTEXTA        ,0),
1515           USM(TB_REPLACEBITMAP         ,0),
1516           USM(TB_SETINDENT             ,0),
1517           USM(TB_SETIMAGELIST          ,0),
1518           USM(TB_GETIMAGELIST          ,0),
1519           USM(TB_LOADIMAGES            ,0),
1520           USM(TB_GETRECT               ,0),
1521           USM(TB_SETHOTIMAGELIST       ,0),
1522           USM(TB_GETHOTIMAGELIST       ,0),
1523           USM(TB_SETDISABLEDIMAGELIST  ,0),
1524           USM(TB_GETDISABLEDIMAGELIST  ,0),
1525           USM(TB_SETSTYLE              ,0),
1526           USM(TB_GETSTYLE              ,0),
1527           USM(TB_GETBUTTONSIZE         ,0),
1528           USM(TB_SETBUTTONWIDTH        ,0),
1529           USM(TB_SETMAXTEXTROWS        ,0),
1530           USM(TB_GETTEXTROWS           ,0),
1531           USM(TB_GETOBJECT             ,0),
1532           USM(TB_GETBUTTONINFOW        ,0),
1533           USM(TB_SETBUTTONINFOW        ,0),
1534           USM(TB_GETBUTTONINFOA        ,0),
1535           USM(TB_SETBUTTONINFOA        ,0),
1536           USM(TB_INSERTBUTTONW         ,0),
1537           USM(TB_ADDBUTTONSW           ,0),
1538           USM(TB_HITTEST               ,0),
1539           USM(TB_SETDRAWTEXTFLAGS      ,0),
1540           USM(TB_GETHOTITEM            ,0),
1541           USM(TB_SETHOTITEM            ,0),
1542           USM(TB_SETANCHORHIGHLIGHT    ,0),
1543           USM(TB_GETANCHORHIGHLIGHT    ,0),
1544           USM(TB_GETBUTTONTEXTW        ,0),
1545           USM(TB_SAVERESTOREW          ,0),
1546           USM(TB_ADDSTRINGW            ,0),
1547           USM(TB_MAPACCELERATORA       ,0),
1548           USM(TB_GETINSERTMARK         ,0),
1549           USM(TB_SETINSERTMARK         ,0),
1550           USM(TB_INSERTMARKHITTEST     ,0),
1551           USM(TB_MOVEBUTTON            ,0),
1552           USM(TB_GETMAXSIZE            ,0),
1553           USM(TB_SETEXTENDEDSTYLE      ,0),
1554           USM(TB_GETEXTENDEDSTYLE      ,0),
1555           USM(TB_GETPADDING            ,0),
1556           USM(TB_SETPADDING            ,0),
1557           USM(TB_SETINSERTMARKCOLOR    ,0),
1558           USM(TB_GETINSERTMARKCOLOR    ,0),
1559           USM(TB_MAPACCELERATORW       ,0),
1560           USM(TB_GETSTRINGW            ,0),
1561           USM(TB_GETSTRINGA            ,0),
1562           USM(TB_UNKWN45D              ,8),
1563           USM(TB_SETHOTITEM2           ,0),
1564           USM(TB_SETLISTGAP            ,0),
1565           USM(TB_GETIMAGELISTCOUNT     ,0),
1566           USM(TB_GETIDEALSIZE          ,8),
1567           USM(TB_UNKWN464              ,0),
1568 };
1569
1570 static const USER_MSG tooltips_array[] = {
1571           USM(TTM_ACTIVATE             ,0),
1572           USM(TTM_SETDELAYTIME         ,0),
1573           USM(TTM_ADDTOOLA             ,0),
1574           USM(TTM_DELTOOLA             ,0),
1575           USM(TTM_NEWTOOLRECTA         ,0),
1576           USM(TTM_RELAYEVENT           ,0),
1577           USM(TTM_GETTOOLINFOA         ,0),
1578           USM(TTM_HITTESTA             ,0),
1579           USM(TTM_GETTEXTA             ,0),
1580           USM(TTM_UPDATETIPTEXTA       ,0),
1581           USM(TTM_GETTOOLCOUNT         ,0),
1582           USM(TTM_ENUMTOOLSA           ,0),
1583           USM(TTM_GETCURRENTTOOLA      ,0),
1584           USM(TTM_WINDOWFROMPOINT      ,0),
1585           USM(TTM_TRACKACTIVATE        ,0),
1586           USM(TTM_TRACKPOSITION        ,0),
1587           USM(TTM_SETTIPBKCOLOR        ,0),
1588           USM(TTM_SETTIPTEXTCOLOR      ,0),
1589           USM(TTM_GETDELAYTIME         ,0),
1590           USM(TTM_GETTIPBKCOLOR        ,0),
1591           USM(TTM_GETTIPTEXTCOLOR      ,0),
1592           USM(TTM_SETMAXTIPWIDTH       ,0),
1593           USM(TTM_GETMAXTIPWIDTH       ,0),
1594           USM(TTM_SETMARGIN            ,0),
1595           USM(TTM_GETMARGIN            ,0),
1596           USM(TTM_POP                  ,0),
1597           USM(TTM_UPDATE               ,0),
1598           USM(TTM_GETBUBBLESIZE        ,0),
1599           USM(TTM_ADDTOOLW             ,0),
1600           USM(TTM_DELTOOLW             ,0),
1601           USM(TTM_NEWTOOLRECTW         ,0),
1602           USM(TTM_GETTOOLINFOW         ,0),
1603           USM(TTM_SETTOOLINFOW         ,0),
1604           USM(TTM_HITTESTW             ,0),
1605           USM(TTM_GETTEXTW             ,0),
1606           USM(TTM_UPDATETIPTEXTW       ,0),
1607           USM(TTM_ENUMTOOLSW           ,0),
1608           USM(TTM_GETCURRENTTOOLW      ,0),
1609 };
1610
1611 static const USER_MSG comboex_array[] = {
1612           USM(CBEM_INSERTITEMA        ,0),
1613           USM(CBEM_SETIMAGELIST       ,0),
1614           USM(CBEM_GETIMAGELIST       ,0),
1615           USM(CBEM_GETITEMA           ,0),
1616           USM(CBEM_SETITEMA           ,0),
1617           USM(CBEM_GETCOMBOCONTROL    ,0),
1618           USM(CBEM_GETEDITCONTROL     ,0),
1619           USM(CBEM_SETEXSTYLE         ,0),
1620           USM(CBEM_GETEXTENDEDSTYLE   ,0),
1621           USM(CBEM_HASEDITCHANGED     ,0),
1622           USM(CBEM_INSERTITEMW        ,0),
1623           USM(CBEM_SETITEMW           ,0),
1624           USM(CBEM_GETITEMW           ,0),
1625           USM(CBEM_SETEXTENDEDSTYLE   ,0),
1626 };
1627
1628 static const USER_MSG propsht_array[] = {
1629           USM(PSM_SETCURSEL           ,0),
1630           USM(PSM_REMOVEPAGE          ,0),
1631           USM(PSM_ADDPAGE             ,0),
1632           USM(PSM_CHANGED             ,0),
1633           USM(PSM_RESTARTWINDOWS      ,0),
1634           USM(PSM_REBOOTSYSTEM        ,0),
1635           USM(PSM_CANCELTOCLOSE       ,0),
1636           USM(PSM_QUERYSIBLINGS       ,0),
1637           USM(PSM_UNCHANGED           ,0),
1638           USM(PSM_APPLY               ,0),
1639           USM(PSM_SETTITLEA           ,0),
1640           USM(PSM_SETWIZBUTTONS       ,0),
1641           USM(PSM_PRESSBUTTON         ,0),
1642           USM(PSM_SETCURSELID         ,0),
1643           USM(PSM_SETFINISHTEXTA      ,0),
1644           USM(PSM_GETTABCONTROL       ,0),
1645           USM(PSM_ISDIALOGMESSAGE     ,0),
1646           USM(PSM_GETCURRENTPAGEHWND  ,0),
1647           USM(PSM_SETTITLEW           ,0),
1648           USM(PSM_SETFINISHTEXTW      ,0),
1649 };
1650 static const WCHAR PropSheetInfoStr[] =
1651     {'P','r','o','p','e','r','t','y','S','h','e','e','t','I','n','f','o',0 };
1652
1653 static const USER_MSG updown_array[] = {
1654           USM(UDM_SETRANGE            ,0),
1655           USM(UDM_GETRANGE            ,0),
1656           USM(UDM_SETPOS              ,0),
1657           USM(UDM_GETPOS              ,0),
1658           USM(UDM_SETBUDDY            ,0),
1659           USM(UDM_GETBUDDY            ,0),
1660           USM(UDM_SETACCEL            ,0),
1661           USM(UDM_GETACCEL            ,0),
1662           USM(UDM_SETBASE             ,0),
1663           USM(UDM_GETBASE             ,0),
1664           USM(UDM_SETRANGE32          ,0),
1665           USM(UDM_GETRANGE32          ,0),
1666           USM(UDM_SETPOS32            ,0),
1667           USM(UDM_GETPOS32            ,0),
1668 };
1669
1670 /* generated from:
1671  * $ for i in `grep EM_ include/richedit.h | cut -d' ' -f2 | cut -f1`; do echo -e "          USM($i\t\t,0),"; done
1672  */
1673 static const USER_MSG richedit_array[] = {
1674           {"EM_SCROLLCARET", WM_USER+49 ,0},
1675           USM(EM_CANPASTE               ,0),
1676           USM(EM_DISPLAYBAND            ,0),
1677           USM(EM_EXGETSEL               ,0),
1678           USM(EM_EXLIMITTEXT            ,0),
1679           USM(EM_EXLINEFROMCHAR         ,0),
1680           USM(EM_EXSETSEL               ,0),
1681           USM(EM_FINDTEXT               ,0),
1682           USM(EM_FORMATRANGE            ,0),
1683           USM(EM_GETCHARFORMAT          ,0),
1684           USM(EM_GETEVENTMASK           ,0),
1685           USM(EM_GETOLEINTERFACE        ,0),
1686           USM(EM_GETPARAFORMAT          ,0),
1687           USM(EM_GETSELTEXT             ,0),
1688           USM(EM_HIDESELECTION          ,0),
1689           USM(EM_PASTESPECIAL           ,0),
1690           USM(EM_REQUESTRESIZE          ,0),
1691           USM(EM_SELECTIONTYPE          ,0),
1692           USM(EM_SETBKGNDCOLOR          ,0),
1693           USM(EM_SETCHARFORMAT          ,0),
1694           USM(EM_SETEVENTMASK           ,0),
1695           USM(EM_SETOLECALLBACK         ,0),
1696           USM(EM_SETPARAFORMAT          ,0),
1697           USM(EM_SETTARGETDEVICE        ,0),
1698           USM(EM_STREAMIN               ,0),
1699           USM(EM_STREAMOUT              ,0),
1700           USM(EM_GETTEXTRANGE           ,0),
1701           USM(EM_FINDWORDBREAK          ,0),
1702           USM(EM_SETOPTIONS             ,0),
1703           USM(EM_GETOPTIONS             ,0),
1704           USM(EM_FINDTEXTEX             ,0),
1705           USM(EM_GETWORDBREAKPROCEX     ,0),
1706           USM(EM_SETWORDBREAKPROCEX     ,0),
1707           USM(EM_SETUNDOLIMIT           ,0),
1708           USM(EM_REDO                   ,0),
1709           USM(EM_CANREDO                ,0),
1710           USM(EM_GETUNDONAME            ,0),
1711           USM(EM_GETREDONAME            ,0),
1712           USM(EM_STOPGROUPTYPING        ,0),
1713           USM(EM_SETTEXTMODE            ,0),
1714           USM(EM_GETTEXTMODE            ,0),
1715           USM(EM_AUTOURLDETECT          ,0),
1716           USM(EM_GETAUTOURLDETECT       ,0),
1717           USM(EM_SETPALETTE             ,0),
1718           USM(EM_GETTEXTEX              ,0),
1719           USM(EM_GETTEXTLENGTHEX        ,0),
1720           USM(EM_SHOWSCROLLBAR          ,0),
1721           USM(EM_SETTEXTEX              ,0),
1722           USM(EM_SETPUNCTUATION         ,0),
1723           USM(EM_GETPUNCTUATION         ,0),
1724           USM(EM_SETWORDWRAPMODE        ,0),
1725           USM(EM_GETWORDWRAPMODE        ,0),
1726           USM(EM_SETIMECOLOR            ,0),
1727           USM(EM_GETIMECOLOR            ,0),
1728           USM(EM_SETIMEOPTIONS          ,0),
1729           USM(EM_GETIMEOPTIONS          ,0),
1730           USM(EM_CONVPOSITION           ,0),
1731           USM(EM_SETLANGOPTIONS         ,0),
1732           USM(EM_GETLANGOPTIONS         ,0),
1733           USM(EM_GETIMECOMPMODE         ,0),
1734           USM(EM_FINDTEXTW              ,0),
1735           USM(EM_FINDTEXTEXW            ,0),
1736           USM(EM_RECONVERSION           ,0),
1737           USM(EM_SETIMEMODEBIAS         ,0),
1738           USM(EM_GETIMEMODEBIAS         ,0),
1739           USM(EM_SETBIDIOPTIONS         ,0),
1740           USM(EM_GETBIDIOPTIONS         ,0),
1741           USM(EM_SETTYPOGRAPHYOPTIONS   ,0),
1742           USM(EM_GETTYPOGRAPHYOPTIONS   ,0),
1743           USM(EM_SETEDITSTYLE           ,0),
1744           USM(EM_GETEDITSTYLE           ,0),
1745           USM(EM_OUTLINE                ,0),
1746           USM(EM_GETSCROLLPOS           ,0),
1747           USM(EM_SETSCROLLPOS           ,0),
1748           USM(EM_SETFONTSIZE            ,0),
1749           USM(EM_GETZOOM                ,0),
1750           USM(EM_SETZOOM                ,0),
1751 };
1752
1753 #undef SZOF
1754 #undef USM
1755
1756 static const CONTROL_CLASS cc_array[] = {
1757     {WC_COMBOBOXEXW,    comboex_array,  ARRAYSIZE(comboex_array) },
1758     {WC_PROPSHEETW,     propsht_array,  ARRAYSIZE(propsht_array) },
1759     {REBARCLASSNAMEW,   rebar_array,    ARRAYSIZE(rebar_array) },
1760     {TOOLBARCLASSNAMEW, toolbar_array,  ARRAYSIZE(toolbar_array) },
1761     {TOOLTIPS_CLASSW,   tooltips_array, ARRAYSIZE(tooltips_array) },
1762     {UPDOWN_CLASSW,     updown_array,   ARRAYSIZE(updown_array) },
1763     {RICHEDIT_CLASS20W, richedit_array, ARRAYSIZE(richedit_array) },
1764     {0, 0, 0} };
1765
1766
1767 /************************************************************************/
1768
1769
1770 /* WM_NOTIFY function codes display */
1771
1772 typedef struct
1773 {
1774     const char *name;     /* name of notify message        */
1775     UINT        value;     /* notify code value             */
1776     UINT        len;       /* length of extra space to dump */
1777 } SPY_NOTIFY;
1778
1779 #define SPNFY(a,b) { #a ,a,sizeof(b)-sizeof(NMHDR)}
1780
1781 /* Array MUST be in descending order by the 'value' field  */
1782 /* (since value is UNSIGNED, 0xffffffff is largest and     */
1783 /*  0xfffffffe is smaller). A binary search is used to     */
1784 /* locate the correct 'value'.                             */
1785 static const SPY_NOTIFY spnfy_array[] = {
1786     /*  common        0U       to  0U-99U  */
1787     SPNFY(NM_OUTOFMEMORY,        NMHDR),
1788     SPNFY(NM_CLICK,              NMHDR),
1789     SPNFY(NM_DBLCLK,             NMHDR),
1790     SPNFY(NM_RETURN,             NMHDR),
1791     SPNFY(NM_RCLICK,             NMHDR),
1792     SPNFY(NM_RDBLCLK,            NMHDR),
1793     SPNFY(NM_SETFOCUS,           NMHDR),
1794     SPNFY(NM_KILLFOCUS,          NMHDR),
1795     SPNFY(NM_CUSTOMDRAW,         NMCUSTOMDRAW),
1796     SPNFY(NM_HOVER,              NMHDR),
1797     SPNFY(NM_NCHITTEST,          NMMOUSE),
1798     SPNFY(NM_KEYDOWN,            NMKEY),
1799     SPNFY(NM_RELEASEDCAPTURE,    NMHDR),
1800     SPNFY(NM_SETCURSOR,          NMMOUSE),
1801     SPNFY(NM_CHAR,               NMCHAR),
1802     SPNFY(NM_TOOLTIPSCREATED,    NMTOOLTIPSCREATED),
1803     /* Listview       0U-100U  to  0U-199U  */
1804     SPNFY(LVN_ITEMCHANGING,      NMLISTVIEW),
1805     SPNFY(LVN_ITEMCHANGED,       NMLISTVIEW),
1806     SPNFY(LVN_INSERTITEM,        NMLISTVIEW),
1807     SPNFY(LVN_DELETEITEM,        NMLISTVIEW),
1808     SPNFY(LVN_DELETEALLITEMS,    NMLISTVIEW),
1809     SPNFY(LVN_BEGINLABELEDITA,   NMLVDISPINFOA),
1810     SPNFY(LVN_ENDLABELEDITA,     NMLVDISPINFOA),
1811     SPNFY(LVN_COLUMNCLICK,       NMLISTVIEW),
1812     SPNFY(LVN_BEGINDRAG,         NMLISTVIEW),
1813     SPNFY(LVN_BEGINRDRAG,        NMLISTVIEW),
1814     SPNFY(LVN_ODCACHEHINT,       NMLVCACHEHINT),
1815     SPNFY(LVN_ITEMACTIVATE,      NMITEMACTIVATE),
1816     SPNFY(LVN_ODSTATECHANGED,    NMLVODSTATECHANGE),
1817     SPNFY(LVN_HOTTRACK,          NMLISTVIEW),
1818     SPNFY(LVN_GETDISPINFOA,      NMLVDISPINFOA),
1819     SPNFY(LVN_SETDISPINFOA,      NMLVDISPINFOA),
1820     SPNFY(LVN_ODFINDITEMA,       NMLVFINDITEMA),
1821     SPNFY(LVN_KEYDOWN,           NMLVKEYDOWN),
1822     SPNFY(LVN_MARQUEEBEGIN,      NMLISTVIEW),
1823     SPNFY(LVN_GETINFOTIPA,       NMLVGETINFOTIPA),
1824     SPNFY(LVN_GETINFOTIPW,       NMLVGETINFOTIPW),
1825     SPNFY(LVN_BEGINLABELEDITW,   NMLVDISPINFOW),
1826     SPNFY(LVN_ENDLABELEDITW,     NMLVDISPINFOW),
1827     SPNFY(LVN_GETDISPINFOW,      NMLVDISPINFOW),
1828     SPNFY(LVN_SETDISPINFOW,      NMLVDISPINFOW),
1829     SPNFY(LVN_ODFINDITEMW,       NMLVFINDITEMW),
1830     /* PropertySheet  0U-200U  to  0U-299U  */
1831     SPNFY(PSN_SETACTIVE,         PSHNOTIFY),
1832     SPNFY(PSN_KILLACTIVE,        PSHNOTIFY),
1833     SPNFY(PSN_APPLY,             PSHNOTIFY),
1834     SPNFY(PSN_RESET,             PSHNOTIFY),
1835     SPNFY(PSN_HELP,              PSHNOTIFY),
1836     SPNFY(PSN_WIZBACK,           PSHNOTIFY),
1837     SPNFY(PSN_WIZNEXT,           PSHNOTIFY),
1838     SPNFY(PSN_WIZFINISH,         PSHNOTIFY),
1839     SPNFY(PSN_QUERYCANCEL,       PSHNOTIFY),
1840     SPNFY(PSN_GETOBJECT,         NMOBJECTNOTIFY),
1841     SPNFY(PSN_TRANSLATEACCELERATOR, PSHNOTIFY),
1842     SPNFY(PSN_QUERYINITIALFOCUS, PSHNOTIFY),
1843     /* Header         0U-300U  to  0U-399U  */
1844     SPNFY(HDN_ITEMCHANGINGA,     NMHEADERA),
1845     SPNFY(HDN_ITEMCHANGEDA,      NMHEADERA),
1846     SPNFY(HDN_ITEMCLICKA,        NMHEADERA),
1847     SPNFY(HDN_ITEMDBLCLICKA,     NMHEADERA),
1848     SPNFY(HDN_DIVIDERDBLCLICKA,  NMHEADERA),
1849     SPNFY(HDN_BEGINTRACKA,       NMHEADERA),
1850     SPNFY(HDN_ENDTRACKA,         NMHEADERA),
1851     SPNFY(HDN_TRACKA,            NMHEADERA),
1852     SPNFY(HDN_GETDISPINFOA,      NMHEADERA),
1853     SPNFY(HDN_BEGINDRAG,         NMHDR),
1854     SPNFY(HDN_ENDDRAG,           NMHDR),
1855     SPNFY(HDN_ITEMCHANGINGW,     NMHDR),
1856     SPNFY(HDN_ITEMCHANGEDW,      NMHDR),
1857     SPNFY(HDN_ITEMCLICKW,        NMHDR),
1858     SPNFY(HDN_ITEMDBLCLICKW,     NMHDR),
1859     SPNFY(HDN_DIVIDERDBLCLICKW,  NMHDR),
1860     SPNFY(HDN_BEGINTRACKW,       NMHDR),
1861     SPNFY(HDN_ENDTRACKW,         NMHDR),
1862     SPNFY(HDN_TRACKW,            NMHDR),
1863     SPNFY(HDN_GETDISPINFOW,      NMHDR),
1864     /* Treeview       0U-400U  to  0U-499U  */
1865     SPNFY(TVN_SELCHANGINGA,      NMTREEVIEWA),
1866     SPNFY(TVN_SELCHANGEDA,       NMTREEVIEWA),
1867     SPNFY(TVN_GETDISPINFOA,      NMTVDISPINFOA),
1868     SPNFY(TVN_SETDISPINFOA,      NMTVDISPINFOA),
1869     SPNFY(TVN_ITEMEXPANDINGA,    NMTREEVIEWA),
1870     SPNFY(TVN_ITEMEXPANDEDA,     NMTREEVIEWA),
1871     SPNFY(TVN_BEGINDRAGA,        NMTREEVIEWA),
1872     SPNFY(TVN_BEGINRDRAGA,       NMTREEVIEWA),
1873     SPNFY(TVN_DELETEITEMA,       NMTREEVIEWA),
1874     SPNFY(TVN_BEGINLABELEDITA,   NMTVDISPINFOA),
1875     SPNFY(TVN_ENDLABELEDITA,     NMTVDISPINFOA),
1876     SPNFY(TVN_KEYDOWN,           NMTVKEYDOWN),
1877     SPNFY(TVN_SELCHANGINGW,      NMTREEVIEWW),
1878     SPNFY(TVN_SELCHANGEDW,       NMTREEVIEWW),
1879     SPNFY(TVN_GETDISPINFOW,      NMTVDISPINFOW),
1880     SPNFY(TVN_SETDISPINFOW,      NMTVDISPINFOW),
1881     SPNFY(TVN_ITEMEXPANDINGW,    NMTREEVIEWW),
1882     SPNFY(TVN_ITEMEXPANDEDW,     NMTREEVIEWW),
1883     SPNFY(TVN_BEGINDRAGW,        NMTREEVIEWW),
1884     SPNFY(TVN_BEGINRDRAGW,       NMTREEVIEWW),
1885     SPNFY(TVN_DELETEITEMW,       NMTREEVIEWW),
1886     SPNFY(TVN_BEGINLABELEDITW,   NMTVDISPINFOW),
1887     SPNFY(TVN_ENDLABELEDITW,     NMTVDISPINFOW),
1888     /* Tooltips       0U-520U  to  0U-549U  */
1889     SPNFY(TTN_GETDISPINFOA,      NMHDR),
1890     SPNFY(TTN_SHOW,              NMHDR),
1891     SPNFY(TTN_POP,               NMHDR),
1892     SPNFY(TTN_GETDISPINFOW,      NMHDR),
1893     /* Tab            0U-550U  to  0U-580U  */
1894     SPNFY(TCN_KEYDOWN,           NMHDR),
1895     SPNFY(TCN_SELCHANGE,         NMHDR),
1896     SPNFY(TCN_SELCHANGING,       NMHDR),
1897     SPNFY(TCN_GETOBJECT,         NMHDR),
1898     /* Common Dialog  0U-601U  to  0U-699U  */
1899     SPNFY(CDN_INITDONE,          OFNOTIFYA),
1900     SPNFY(CDN_SELCHANGE,         OFNOTIFYA),
1901     SPNFY(CDN_FOLDERCHANGE,      OFNOTIFYA),
1902     SPNFY(CDN_SHAREVIOLATION,    OFNOTIFYA),
1903     SPNFY(CDN_HELP,              OFNOTIFYA),
1904     SPNFY(CDN_FILEOK,            OFNOTIFYA),
1905     SPNFY(CDN_TYPECHANGE,        OFNOTIFYA),
1906     /* Toolbar        0U-700U  to  0U-720U  */
1907     SPNFY(TBN_GETBUTTONINFOA,    NMTOOLBARA),
1908     SPNFY(TBN_BEGINDRAG,         NMTOOLBARA),
1909     SPNFY(TBN_ENDDRAG,           NMTOOLBARA),
1910     SPNFY(TBN_BEGINADJUST,       NMHDR),
1911     SPNFY(TBN_ENDADJUST,         NMHDR),
1912     SPNFY(TBN_RESET,             NMHDR),
1913     SPNFY(TBN_QUERYINSERT,       NMTOOLBARA),
1914     SPNFY(TBN_QUERYDELETE,       NMTOOLBARA),
1915     SPNFY(TBN_TOOLBARCHANGE,     NMHDR),
1916     SPNFY(TBN_CUSTHELP,          NMHDR),
1917     SPNFY(TBN_DROPDOWN,          NMTOOLBARA),
1918     SPNFY(TBN_GETOBJECT,         NMOBJECTNOTIFY),
1919     SPNFY(TBN_HOTITEMCHANGE,     NMTBHOTITEM),
1920     SPNFY(TBN_DRAGOUT,           NMTOOLBARA),
1921     SPNFY(TBN_DELETINGBUTTON,    NMTOOLBARA),
1922     SPNFY(TBN_GETDISPINFOA,      NMTBDISPINFOA),
1923     SPNFY(TBN_GETDISPINFOW,      NMTBDISPINFOW),
1924     SPNFY(TBN_GETINFOTIPA,       NMTBGETINFOTIPA),
1925     SPNFY(TBN_GETINFOTIPW,       NMTBGETINFOTIPW),
1926     SPNFY(TBN_GETBUTTONINFOW,    NMTOOLBARW),
1927     /* Up/Down        0U-721U  to  0U-740U  */
1928     SPNFY(UDN_DELTAPOS,          NM_UPDOWN),
1929     /* Month Calendar 0U-750U  to  0U-759U  */
1930     /* ******************* WARNING ***************************** */
1931     /* The following appear backwards but needs to be this way.  */
1932     /* The reason is that MS (and us) define the MCNs as         */
1933     /*         MCN_FIRST + n                                     */
1934     /* instead of the way ALL other notifications are            */
1935     /*         TBN_FIRST - n                                     */
1936     /* The only place that this is important is in this list     */
1937     /*                                                           */
1938     /* Also since the same error was made with the DTN_ items,   */
1939     /* they overlay the MCN_ and need to be inserted in the      */
1940     /* other section of the table so that it is in order for     */
1941     /* the binary search.                                        */
1942     /*                                                           */
1943     /* Thank you MS for your obvious quality control!!           */
1944     /* ******************* WARNING ***************************** */
1945     /* Date/Time      0U-760U  to  0U-799U  */
1946     /* SPNFY(MCN_SELECT,            NMHDR), */
1947     /* SPNFY(MCN_GETDAYSTATE,       NMHDR), */
1948     /* SPNFY(MCN_SELCHANGE,         NMHDR), */
1949     /* ******************* WARNING ***************************** */
1950     /* The following appear backwards but needs to be this way.  */
1951     /* The reason is that MS (and us) define the MCNs as         */
1952     /*         DTN_FIRST + n                                     */
1953     /* instead of the way ALL other notifications are            */
1954     /*         TBN_FIRST - n                                     */
1955     /* The only place that this is important is in this list     */
1956     /* ******************* WARNING ***************************** */
1957     SPNFY(DTN_FORMATQUERYW,      NMHDR),
1958     SPNFY(DTN_FORMATW,           NMHDR),
1959     SPNFY(DTN_WMKEYDOWNW,        NMHDR),
1960     SPNFY(DTN_USERSTRINGW,       NMHDR),
1961     SPNFY(MCN_SELECT,            NMHDR),
1962     SPNFY(MCN_GETDAYSTATE,       NMHDR),
1963     SPNFY(MCN_SELCHANGE,         NMHDR),
1964     SPNFY(DTN_CLOSEUP,           NMHDR),
1965     SPNFY(DTN_DROPDOWN,          NMHDR),
1966     SPNFY(DTN_FORMATQUERYA,      NMHDR),
1967     SPNFY(DTN_FORMATA,           NMHDR),
1968     SPNFY(DTN_WMKEYDOWNA,        NMHDR),
1969     SPNFY(DTN_USERSTRINGA,       NMHDR),
1970     SPNFY(DTN_DATETIMECHANGE,    NMHDR),
1971     /* ComboBoxEx     0U-800U  to  0U-830U  */
1972     SPNFY(CBEN_GETDISPINFOA,     NMCOMBOBOXEXA),
1973     SPNFY(CBEN_INSERTITEM,       NMCOMBOBOXEXA),
1974     SPNFY(CBEN_DELETEITEM,       NMCOMBOBOXEXA),
1975     SPNFY(CBEN_BEGINEDIT,        NMHDR),
1976     SPNFY(CBEN_ENDEDITA,         NMCBEENDEDITA),
1977     SPNFY(CBEN_ENDEDITW,         NMCBEENDEDITW),
1978     SPNFY(CBEN_GETDISPINFOW,     NMCOMBOBOXEXW),
1979     SPNFY(CBEN_DRAGBEGINA,       NMCBEDRAGBEGINA),
1980     SPNFY(CBEN_DRAGBEGINW,       NMCBEDRAGBEGINW),
1981     /* Rebar          0U-831U  to  0U-859U  */
1982     SPNFY(RBN_HEIGHTCHANGE,      NMHDR),
1983     SPNFY(RBN_GETOBJECT,         NMOBJECTNOTIFY),
1984     SPNFY(RBN_LAYOUTCHANGED,     NMHDR),
1985     SPNFY(RBN_AUTOSIZE,          NMRBAUTOSIZE),
1986     SPNFY(RBN_BEGINDRAG,         NMREBAR),
1987     SPNFY(RBN_ENDDRAG,           NMREBAR),
1988     SPNFY(RBN_DELETINGBAND,      NMREBAR),
1989     SPNFY(RBN_DELETEDBAND,       NMREBAR),
1990     SPNFY(RBN_CHILDSIZE,         NMREBARCHILDSIZE),
1991     /* IP address     0U-860U  to  0U-879U  */
1992     SPNFY(IPN_FIELDCHANGED,      NMHDR),
1993     /* Status bar     0U-880U  to  0U-899U  */
1994     SPNFY(SBN_SIMPLEMODECHANGE,  NMHDR),
1995     /* Pager          0U-900U  to  0U-950U  */
1996     SPNFY(PGN_SCROLL,            NMPGSCROLL),
1997     SPNFY(PGN_CALCSIZE,          NMPGCALCSIZE),
1998 };
1999 #undef SPNFY
2000
2001 static unsigned char *spy_exclude;
2002
2003 static inline BOOL exclude_msg( UINT msg )
2004 {
2005     return spy_exclude[ min( msg, SPY_MAX_MSGNUM ) ];
2006 }
2007
2008 static inline BOOL exclude_dwp(void)
2009 {
2010     return spy_exclude[SPY_MAX_MSGNUM + 1];
2011 }
2012
2013
2014 typedef struct
2015 {
2016     UINT       msgnum;           /* message number */
2017     HWND       msg_hwnd;         /* window handle for message          */
2018     WPARAM     wParam;           /* message parameter                  */
2019     LPARAM     lParam;           /* message parameter                  */
2020     INT        data_len;         /* length of data to dump             */
2021     char       msg_name[60];     /* message name (see SPY_GetMsgName)  */
2022     WCHAR      wnd_class[60];    /* window class name (full)           */
2023     WCHAR      wnd_name[16];     /* window name for message            */
2024 } SPY_INSTANCE;
2025
2026 static int indent_tls_index = TLS_OUT_OF_INDEXES;
2027
2028 /***********************************************************************
2029  *           get_indent_level
2030  */
2031 static inline INT_PTR get_indent_level(void)
2032 {
2033     return (INT_PTR)TlsGetValue( indent_tls_index );
2034 }
2035
2036
2037 /***********************************************************************
2038  *           set_indent_level
2039  */
2040 static inline void set_indent_level( INT_PTR level )
2041 {
2042     TlsSetValue( indent_tls_index, (void *)level );
2043 }
2044
2045
2046 /***********************************************************************
2047  *           SPY_GetMsgInternal
2048  */
2049 static const char *SPY_GetMsgInternal( UINT msg )
2050 {
2051     if (msg <= SPY_MAX_MSGNUM)
2052         return MessageTypeNames[msg];
2053
2054     if (msg >= LVM_FIRST && msg <= LVM_FIRST + SPY_MAX_LVMMSGNUM)
2055         return LVMMessageTypeNames[msg-LVM_FIRST];
2056
2057     if (msg >= TV_FIRST && msg <= TV_FIRST + SPY_MAX_TVMSGNUM)
2058         return TVMessageTypeNames[msg-TV_FIRST];
2059
2060     if (msg >= HDM_FIRST && msg <= HDM_FIRST + SPY_MAX_HDMMSGNUM)
2061         return HDMMessageTypeNames[msg-HDM_FIRST];
2062
2063     if (msg >= TCM_FIRST && msg <= TCM_FIRST + SPY_MAX_TCMMSGNUM)
2064         return TCMMessageTypeNames[msg-TCM_FIRST];
2065
2066     if (msg >= PGM_FIRST && msg <= PGM_FIRST + SPY_MAX_PGMMSGNUM)
2067         return PGMMessageTypeNames[msg-PGM_FIRST];
2068
2069     if (msg >= CCM_FIRST && msg <= CCM_FIRST + SPY_MAX_CCMMSGNUM)
2070         return CCMMessageTypeNames[msg-CCM_FIRST];
2071
2072     if (msg >= WM_WINE_DESTROYWINDOW && msg <= WM_WINE_DESTROYWINDOW + SPY_MAX_WINEMSGNUM)
2073         return WINEMessageTypeNames[msg-WM_WINE_DESTROYWINDOW];
2074
2075     return NULL;
2076 }
2077
2078 /***********************************************************************
2079  *           SPY_Bsearch_Msg
2080  */
2081 static const USER_MSG *SPY_Bsearch_Msg( const USER_MSG *msgs, UINT count, UINT code)
2082 {
2083     int low = 0, high = count - 1;
2084
2085     while (low <= high)
2086     {
2087         int idx = (low + high) / 2;
2088         if (msgs[idx].value == code) return msgs + idx;
2089         if (msgs[idx].value > code)
2090             high = idx - 1;
2091         else
2092             low = idx + 1;
2093     }
2094     return NULL;
2095 }
2096
2097 /***********************************************************************
2098  *           SPY_GetClassLongOffsetName
2099  *
2100  * Gets the name of a class long offset.
2101  */
2102 const char *SPY_GetClassLongOffsetName( INT offset )
2103 {
2104     INT index;
2105     if (offset < 0 && offset % 2 == 0 && ((index = -(offset + 8) / 2) <
2106         sizeof(ClassLongOffsetNames) / sizeof(*ClassLongOffsetNames)))
2107     {
2108         return ClassLongOffsetNames[index];
2109     }
2110
2111     return "?";
2112 }
2113
2114 /***********************************************************************
2115  *           SPY_GetClassName
2116  *
2117  *  Sets the value of "wnd_class" member of the instance structure.
2118  */
2119 static void SPY_GetClassName( SPY_INSTANCE *sp_e )
2120 {
2121     /* special code to detect a property sheet dialog   */
2122     if ((GetClassLongW(sp_e->msg_hwnd, GCW_ATOM) == WC_DIALOG) &&
2123         (GetPropW(sp_e->msg_hwnd, PropSheetInfoStr))) {
2124         strcpyW(sp_e->wnd_class, WC_PROPSHEETW);
2125     }
2126     else {
2127         GetClassNameW(sp_e->msg_hwnd, sp_e->wnd_class, sizeof(sp_e->wnd_class)/sizeof(WCHAR));
2128     }
2129 }
2130
2131 /***********************************************************************
2132  *           SPY_GetMsgStuff
2133  *
2134  *  Get message name and other information for dumping
2135  */
2136 static void SPY_GetMsgStuff( SPY_INSTANCE *sp_e )
2137 {
2138     const USER_MSG *p;
2139     const char *msg_name = SPY_GetMsgInternal( sp_e->msgnum );
2140
2141     sp_e->data_len = 0;
2142     if (!msg_name)
2143     {
2144         INT i = 0;
2145
2146         if (sp_e->msgnum >= 0xc000)
2147         {
2148             if (GlobalGetAtomNameA( sp_e->msgnum, sp_e->msg_name+1, sizeof(sp_e->msg_name)-2 ))
2149             {
2150                 sp_e->msg_name[0] = '\"';
2151                 strcat( sp_e->msg_name, "\"" );
2152                 return;
2153             }
2154         }
2155         if (!sp_e->wnd_class[0]) SPY_GetClassName(sp_e);
2156
2157 #if DEBUG_SPY
2158         TRACE("looking class %s\n", debugstr_w(sp_e->wnd_class));
2159 #endif
2160
2161         while (cc_array[i].classname &&
2162                strcmpiW(cc_array[i].classname, sp_e->wnd_class) != 0) i++;
2163
2164         if (cc_array[i].classname)
2165         {
2166 #if DEBUG_SPY
2167             TRACE("process class %s, first %p, last %p\n",
2168                   debugstr_w(cc_array[i].classname), cc_array[i].classmsg,
2169                   cc_array[i].lastmsg);
2170 #endif
2171             p = SPY_Bsearch_Msg (cc_array[i].classmsg, cc_array[i].count, sp_e->msgnum);
2172             if (p) {
2173                 lstrcpynA (sp_e->msg_name, p->name, sizeof(sp_e->msg_name));
2174                 sp_e->data_len = p->len;
2175                 return;
2176             }
2177         }
2178         if (sp_e->msgnum >= WM_USER && sp_e->msgnum <= WM_APP)
2179             sprintf( sp_e->msg_name, "WM_USER+%d", sp_e->msgnum - WM_USER );
2180         else
2181             sprintf( sp_e->msg_name, "%04x", sp_e->msgnum );
2182     }
2183     else
2184     {
2185         lstrcpynA(sp_e->msg_name, msg_name, sizeof(sp_e->msg_name));
2186     }
2187 }
2188
2189 /***********************************************************************
2190  *           SPY_GetWndName
2191  *
2192  *  Sets the value of "wnd_name" and "wnd_class" members of the
2193  *  instance structure.
2194  *
2195  */
2196 static void SPY_GetWndName( SPY_INSTANCE *sp_e )
2197 {
2198     INT len;
2199
2200     SPY_GetClassName( sp_e );
2201
2202     len = InternalGetWindowText(sp_e->msg_hwnd, sp_e->wnd_name, sizeof(sp_e->wnd_name)/sizeof(WCHAR));
2203     if(!len) /* get class name */
2204     {
2205         LPWSTR dst = sp_e->wnd_name;
2206         LPWSTR src = sp_e->wnd_class;
2207         int n = sizeof(sp_e->wnd_name)/sizeof(WCHAR) - 3;
2208         *dst++ = '{';
2209         while ((n-- > 0) && *src) *dst++ = *src++;
2210         *dst++ = '}';
2211         *dst = 0;
2212     }
2213 }
2214
2215 /***********************************************************************
2216  *           SPY_GetMsgName
2217  *
2218  *  ****  External function  ****
2219  *
2220  *  Get message name
2221  */
2222 const char *SPY_GetMsgName( UINT msg, HWND hWnd )
2223 {
2224     SPY_INSTANCE ext_sp_e;
2225     DWORD save_error = GetLastError();
2226
2227     ext_sp_e.msgnum = msg;
2228     ext_sp_e.msg_hwnd   = hWnd;
2229     ext_sp_e.lParam = 0;
2230     ext_sp_e.wParam = 0;
2231     ext_sp_e.wnd_class[0] = 0;
2232     SPY_GetMsgStuff(&ext_sp_e);
2233     SetLastError( save_error );
2234     return wine_dbg_sprintf("%s", ext_sp_e.msg_name);
2235 }
2236
2237 /***********************************************************************
2238  *           SPY_GetVKeyName
2239  */
2240 const char *SPY_GetVKeyName(WPARAM wParam)
2241 {
2242     const char *vk_key_name;
2243
2244     if(wParam <= SPY_MAX_VKKEYSNUM && VK_KeyNames[wParam])
2245         vk_key_name = VK_KeyNames[wParam];
2246     else
2247         vk_key_name = "VK_???";
2248
2249     return vk_key_name;
2250 }
2251
2252 /***********************************************************************
2253  *           SPY_Bsearch_Notify
2254  */
2255 static const SPY_NOTIFY *SPY_Bsearch_Notify( UINT code)
2256 {
2257     int low = 0, high = ARRAYSIZE(spnfy_array) - 1;
2258
2259     while (low <= high)
2260     {
2261         int idx = (low + high) / 2;
2262         if (spnfy_array[idx].value == code) return spnfy_array + idx;
2263         if (spnfy_array[idx].value < code)
2264             high = idx - 1;
2265         else
2266             low = idx + 1;
2267     }
2268     return NULL;
2269 }
2270
2271 /***********************************************************************
2272  *           SPY_DumpMem
2273  */
2274 static void SPY_DumpMem (LPCSTR header, const UINT *q, INT len)
2275 {
2276     int i;
2277
2278     for(i=0; i<len-12; i+=16) {
2279         TRACE("%s [%04x] %08x %08x %08x %08x\n",
2280               header, i, *q, *(q+1), *(q+2), *(q+3));
2281         q += 4;
2282     }
2283     switch ((len - i + 3) & (~3)) {
2284     case 16:
2285         TRACE("%s [%04x] %08x %08x %08x %08x\n",
2286               header, i, *q, *(q+1), *(q+2), *(q+3));
2287         break;
2288     case 12:
2289         TRACE("%s [%04x] %08x %08x %08x\n",
2290               header, i, *q, *(q+1), *(q+2));
2291         break;
2292     case 8:
2293         TRACE("%s [%04x] %08x %08x\n",
2294               header, i, *q, *(q+1));
2295         break;
2296     case 4:
2297         TRACE("%s [%04x] %08x\n",
2298               header, i, *q);
2299         break;
2300     default:
2301         break;
2302     }
2303 }
2304
2305 /***********************************************************************
2306  *           SPY_DumpStructure
2307  */
2308 static void SPY_DumpStructure(const SPY_INSTANCE *sp_e, BOOL enter)
2309 {
2310     switch (sp_e->msgnum)
2311         {
2312         case LVM_INSERTITEMW:
2313         case LVM_SETITEMW:
2314             if (!enter) break;
2315             /* fall through */
2316         case LVM_GETITEMW:
2317             {
2318                 LPLVITEMA item = (LPLVITEMA) sp_e->lParam;
2319                 if (item) {
2320                     SPY_DumpMem ("LVITEM", (UINT*)item, sizeof(LVITEMA));
2321                 }
2322                 break;
2323             }
2324         case TCM_INSERTITEMW:
2325         case TCM_INSERTITEMA:
2326         case TCM_SETITEMW:
2327         case TCM_SETITEMA:
2328             if (!enter) break;
2329             /* fall through */
2330         case TCM_GETITEMW:
2331         case TCM_GETITEMA:
2332             {
2333                 TCITEMA *item = (TCITEMA *) sp_e->lParam;
2334                 if (item) {
2335                     SPY_DumpMem ("TCITEM", (UINT*)item, sizeof(TCITEMA));
2336                 }
2337                 break;
2338             }
2339         case TCM_ADJUSTRECT:
2340         case LVM_GETITEMRECT:
2341         case LVM_GETSUBITEMRECT:
2342             {
2343                 LPRECT rc = (LPRECT) sp_e->lParam;
2344                 if (rc)
2345                     TRACE("lParam rect (%s)\n", wine_dbgstr_rect(rc));
2346                 break;
2347             }
2348         case LVM_SETITEMPOSITION32:
2349             if (!enter) break;
2350             /* fall through */
2351         case LVM_GETITEMPOSITION:
2352         case LVM_GETORIGIN:
2353             {
2354                 LPPOINT point = (LPPOINT) sp_e->lParam;
2355                 if (point) {
2356                     TRACE("lParam point x=%d, y=%d\n", point->x, point->y);
2357                 }
2358                 break;
2359             }
2360         case SBM_SETRANGE:
2361             if (!enter && (sp_e->msgnum == SBM_SETRANGE)) break;
2362             TRACE("min=%d max=%d\n", (INT)sp_e->wParam, (INT)sp_e->lParam);
2363             break;
2364         case SBM_GETRANGE:
2365             if ((enter && (sp_e->msgnum == SBM_GETRANGE)) ||
2366                 (!enter && (sp_e->msgnum == SBM_SETRANGE))) break;
2367             {
2368                 LPINT ptmin = (LPINT) sp_e->wParam;
2369                 LPINT ptmax = (LPINT) sp_e->lParam;
2370                 if (ptmin && ptmax)
2371                     TRACE("min=%d max=%d\n", *ptmin, *ptmax);
2372                 else if (ptmin)
2373                     TRACE("min=%d max=n/a\n", *ptmin);
2374                 else if (ptmax)
2375                     TRACE("min=n/a max=%d\n", *ptmax);
2376                 break;
2377             }
2378         case EM_EXSETSEL:
2379             if (enter && sp_e->lParam)
2380             {
2381                 CHARRANGE *cr = (CHARRANGE *) sp_e->lParam;
2382                 TRACE("CHARRANGE: cpMin=%d cpMax=%d\n", cr->cpMin, cr->cpMax);
2383             }
2384             break;
2385         case EM_SETCHARFORMAT:
2386             if (enter && sp_e->lParam)
2387             {
2388                 CHARFORMATW *cf = (CHARFORMATW *) sp_e->lParam;
2389                 TRACE("CHARFORMAT: dwMask=0x%08x dwEffects=", cf->dwMask);
2390                 if ((cf->dwMask & CFM_BOLD) && (cf->dwEffects & CFE_BOLD))
2391                     TRACE(" CFE_BOLD");
2392                 if ((cf->dwMask & CFM_COLOR) && (cf->dwEffects & CFE_AUTOCOLOR))
2393                     TRACE(" CFE_AUTOCOLOR");
2394                 if ((cf->dwMask & CFM_ITALIC) && (cf->dwEffects & CFE_ITALIC))
2395                     TRACE(" CFE_ITALIC");
2396                 if ((cf->dwMask & CFM_PROTECTED) && (cf->dwEffects & CFE_PROTECTED))
2397                     TRACE(" CFE_PROTECTED");
2398                 if ((cf->dwMask & CFM_STRIKEOUT) && (cf->dwEffects & CFE_STRIKEOUT))
2399                     TRACE(" CFE_STRIKEOUT");
2400                 if ((cf->dwMask & CFM_UNDERLINE) && (cf->dwEffects & CFE_UNDERLINE))
2401                     TRACE(" CFE_UNDERLINE");
2402                 TRACE("\n");
2403                 if (cf->dwMask & CFM_SIZE)
2404                     TRACE("yHeight=%d\n", cf->yHeight);
2405                 if (cf->dwMask & CFM_OFFSET)
2406                     TRACE("yOffset=%d\n", cf->yOffset);
2407                 if ((cf->dwMask & CFM_COLOR) && !(cf->dwEffects & CFE_AUTOCOLOR))
2408                     TRACE("crTextColor=%x\n", cf->crTextColor);
2409                 TRACE("bCharSet=%x bPitchAndFamily=%x\n", cf->bCharSet, cf->bPitchAndFamily);
2410                 /* FIXME: we should try to be a bit more intelligent about
2411                  * whether this is in ANSI or Unicode (it could be either) */
2412                 if (cf->dwMask & CFM_FACE)
2413                     TRACE("szFaceName=%s\n", debugstr_wn(cf->szFaceName, LF_FACESIZE));
2414                 /* FIXME: handle CHARFORMAT2 too */
2415             }
2416             break;
2417         case WM_DRAWITEM:
2418             if (!enter) break;
2419             {
2420                 DRAWITEMSTRUCT *lpdis = (DRAWITEMSTRUCT*) sp_e->lParam;
2421                 TRACE("DRAWITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n",
2422                       lpdis->CtlType, lpdis->CtlID);
2423                 TRACE("itemID=0x%08x itemAction=0x%08x itemState=0x%08x\n",
2424                       lpdis->itemID, lpdis->itemAction, lpdis->itemState);
2425                 TRACE("hWnd=%p hDC=%p (%s) itemData=0x%08lx\n",
2426                       lpdis->hwndItem, lpdis->hDC,
2427                       wine_dbgstr_rect(&lpdis->rcItem), lpdis->itemData);
2428             }
2429             break;
2430         case WM_MEASUREITEM:
2431             {
2432                 MEASUREITEMSTRUCT *lpmis = (MEASUREITEMSTRUCT*) sp_e->lParam;
2433                 TRACE("MEASUREITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n",
2434                       lpmis->CtlType, lpmis->CtlID);
2435                 TRACE("itemID=0x%08x itemWidth=0x%08x itemHeight=0x%08x\n",
2436                       lpmis->itemID, lpmis->itemWidth, lpmis->itemHeight);
2437                 TRACE("itemData=0x%08lx\n", lpmis->itemData);
2438             }
2439             break;
2440         case WM_NCCREATE:
2441         case WM_CREATE:
2442         {
2443             BOOL unicode;
2444             CREATESTRUCTA *cs;
2445
2446             if (!enter) break;
2447
2448             unicode = IsWindowUnicode(sp_e->msg_hwnd);
2449             cs = (CREATESTRUCTA *)sp_e->lParam;
2450             TRACE("%s %s ex=%08x style=%08x %d,%d %dx%d parent=%p menu=%p inst=%p params=%p\n",
2451                   unicode ? debugstr_w((LPCWSTR)cs->lpszName) : debugstr_a(cs->lpszName),
2452                   unicode ? debugstr_w((LPCWSTR)cs->lpszClass) : debugstr_a(cs->lpszClass),
2453                   cs->dwExStyle, cs->style, cs->x, cs->y, cs->cx, cs->cy,
2454                   cs->hwndParent, cs->hMenu, cs->hInstance, cs->lpCreateParams);
2455             break;
2456         }
2457         case WM_SIZE:
2458             if (!enter) break;
2459             TRACE("cx=%d cy=%d\n", LOWORD(sp_e->lParam), HIWORD(sp_e->lParam));
2460             break;
2461         case WM_WINDOWPOSCHANGED:
2462             if (!enter) break;
2463         case WM_WINDOWPOSCHANGING:
2464             {
2465                 WINDOWPOS *lpwp = (WINDOWPOS *)sp_e->lParam;
2466                 TRACE("WINDOWPOS hwnd=%p, after=%p, at (%d,%d) w=%d h=%d, flags=0x%08x\n",
2467                       lpwp->hwnd, lpwp->hwndInsertAfter, lpwp->x, lpwp->y,
2468                       lpwp->cx, lpwp->cy, lpwp->flags);
2469             }
2470             break;
2471         case WM_STYLECHANGED:
2472             if (!enter) break;
2473         case WM_STYLECHANGING:
2474             {
2475                 LPSTYLESTRUCT ss = (LPSTYLESTRUCT) sp_e->lParam;
2476                 TRACE("STYLESTRUCT: StyleOld=0x%08x, StyleNew=0x%08x\n",
2477                       ss->styleOld, ss->styleNew);
2478             }
2479             break;
2480         case WM_NCCALCSIZE:
2481             {
2482                 RECT *rc = (RECT *)sp_e->lParam;
2483                 TRACE("Rect (%s)\n", wine_dbgstr_rect(rc));
2484             }
2485             break;
2486         case WM_NOTIFY:
2487             /* if (!enter) break; */
2488             {
2489                 NMHDR * pnmh = (NMHDR*) sp_e->lParam;
2490                 UINT *q, dumplen;
2491                 const SPY_NOTIFY *p;
2492                 WCHAR from_class[60];
2493                 DWORD save_error;
2494
2495                 p = SPY_Bsearch_Notify( pnmh->code );
2496                 if (p) {
2497                     TRACE("NMHDR hwndFrom=%p idFrom=0x%08lx code=%s<0x%08x>, extra=0x%x\n",
2498                           pnmh->hwndFrom, pnmh->idFrom, p->name, pnmh->code, p->len);
2499                     dumplen = p->len;
2500
2501                     /* for CUSTOMDRAW, dump all the data for TOOLBARs */
2502                     if (pnmh->code == NM_CUSTOMDRAW) {
2503                         /* save and restore error code over the next call */
2504                         save_error = GetLastError();
2505                         GetClassNameW(pnmh->hwndFrom, from_class,
2506                                       sizeof(from_class)/sizeof(WCHAR));
2507                         SetLastError(save_error);
2508                         if (strcmpW(TOOLBARCLASSNAMEW, from_class) == 0)
2509                             dumplen = sizeof(NMTBCUSTOMDRAW)-sizeof(NMHDR);
2510                     } else if ( pnmh->code >= HDN_ENDDRAG
2511                                 && pnmh->code <= HDN_ITEMCHANGINGA ) {
2512                         dumplen = sizeof(NMHEADERA)-sizeof(NMHDR);
2513                     }
2514                     if (dumplen > 0) {
2515                         q = (UINT *)(pnmh + 1);
2516                         SPY_DumpMem ("NM extra", q, (INT)dumplen);
2517                     }
2518                 }
2519                 else
2520                     TRACE("NMHDR hwndFrom=%p idFrom=0x%08lx code=0x%08x\n",
2521                           pnmh->hwndFrom, pnmh->idFrom, pnmh->code);
2522             }
2523         default:
2524             if (sp_e->data_len > 0)
2525                 SPY_DumpMem ("MSG lParam", (UINT *)sp_e->lParam, sp_e->data_len);
2526             break;
2527         }
2528
2529 }
2530
2531
2532 /***********************************************************************
2533  *           spy_init
2534  */
2535 static BOOL spy_init(void)
2536 {
2537     int i;
2538     char buffer[1024];
2539     HKEY hkey;
2540     char *exclude;
2541
2542     if (!TRACE_ON(message)) return FALSE;
2543
2544     if (indent_tls_index == TLS_OUT_OF_INDEXES)
2545     {
2546         DWORD index = TlsAlloc();
2547         if (InterlockedCompareExchange( &indent_tls_index, index, TLS_OUT_OF_INDEXES ) != TLS_OUT_OF_INDEXES)
2548             TlsFree( index );
2549     }
2550
2551     if (spy_exclude) return TRUE;
2552     exclude = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, SPY_MAX_MSGNUM + 2 );
2553
2554     /* @@ Wine registry key: HKCU\Software\Wine\Debug */
2555     if(!RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Wine\\Debug", &hkey))
2556     {
2557         DWORD type, count = sizeof(buffer);
2558
2559         buffer[0] = 0;
2560         if (!RegQueryValueExA(hkey, "SpyInclude", 0, &type, (LPBYTE) buffer, &count) &&
2561             strcmp( buffer, "INCLUDEALL" ))
2562         {
2563             TRACE("Include=%s\n", buffer );
2564             for (i = 0; i <= SPY_MAX_MSGNUM; i++)
2565                 exclude[i] = (MessageTypeNames[i] && !strstr(buffer,MessageTypeNames[i]));
2566         }
2567
2568         count = sizeof(buffer);
2569         buffer[0] = 0;
2570         if (!RegQueryValueExA(hkey, "SpyExclude", 0, &type, (LPBYTE) buffer, &count))
2571         {
2572             TRACE("Exclude=%s\n", buffer );
2573             if (!strcmp( buffer, "EXCLUDEALL" ))
2574                 for (i = 0; i <= SPY_MAX_MSGNUM; i++) exclude[i] = TRUE;
2575             else
2576                 for (i = 0; i <= SPY_MAX_MSGNUM; i++)
2577                     exclude[i] = (MessageTypeNames[i] && strstr(buffer,MessageTypeNames[i]));
2578         }
2579
2580         count = sizeof(buffer);
2581         if(!RegQueryValueExA(hkey, "SpyExcludeDWP", 0, &type, (LPBYTE) buffer, &count))
2582             exclude[SPY_MAX_MSGNUM + 1] = atoi(buffer);
2583
2584         RegCloseKey(hkey);
2585     }
2586
2587     if (InterlockedCompareExchangePointer( (void **)&spy_exclude, exclude, NULL ))
2588         HeapFree( GetProcessHeap(), 0, exclude );
2589
2590     return TRUE;
2591 }
2592
2593
2594 /***********************************************************************
2595  *           SPY_EnterMessage
2596  */
2597 void SPY_EnterMessage( INT iFlag, HWND hWnd, UINT msg,
2598                        WPARAM wParam, LPARAM lParam )
2599 {
2600     SPY_INSTANCE sp_e;
2601     int indent;
2602     DWORD save_error = GetLastError();
2603
2604     if (!spy_init() || exclude_msg(msg)) return;
2605
2606     sp_e.msgnum = msg;
2607     sp_e.msg_hwnd = hWnd;
2608     sp_e.lParam = lParam;
2609     sp_e.wParam = wParam;
2610     SPY_GetWndName(&sp_e);
2611     SPY_GetMsgStuff(&sp_e);
2612     indent = get_indent_level();
2613
2614     /* each SPY_SENDMESSAGE must be complemented by call to SPY_ExitMessage */
2615     switch(iFlag)
2616     {
2617     case SPY_DISPATCHMESSAGE:
2618         TRACE("%*s(%p) %-16s [%04x] %s dispatched  wp=%08lx lp=%08lx\n",
2619                         indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
2620                         sp_e.msg_name, wParam, lParam);
2621         break;
2622
2623     case SPY_SENDMESSAGE:
2624         {
2625             char taskName[20];
2626             DWORD tid = GetWindowThreadProcessId( hWnd, NULL );
2627
2628             if (tid == GetCurrentThreadId()) strcpy( taskName, "self" );
2629             else sprintf( taskName, "tid %04x", GetCurrentThreadId() );
2630
2631             TRACE("%*s(%p) %-16s [%04x] %s sent from %s wp=%08lx lp=%08lx\n",
2632                   indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
2633                   sp_e.msg_name, taskName, wParam, lParam );
2634             SPY_DumpStructure(&sp_e, TRUE);
2635         }
2636         break;
2637
2638     case SPY_DEFWNDPROC:
2639         if (exclude_dwp()) return;
2640         TRACE("%*s(%p)  DefWindowProc:[%04x] %s  wp=%08lx lp=%08lx\n",
2641               indent, "", hWnd, msg, sp_e.msg_name, wParam, lParam );
2642         break;
2643     }
2644     set_indent_level( indent + SPY_INDENT_UNIT );
2645     SetLastError( save_error );
2646 }
2647
2648
2649 /***********************************************************************
2650  *           SPY_ExitMessage
2651  */
2652 void SPY_ExitMessage( INT iFlag, HWND hWnd, UINT msg, LRESULT lReturn,
2653                        WPARAM wParam, LPARAM lParam )
2654 {
2655     SPY_INSTANCE sp_e;
2656     int indent;
2657     DWORD save_error = GetLastError();
2658
2659     if (!TRACE_ON(message) || exclude_msg(msg) ||
2660         (exclude_dwp() && iFlag == SPY_RESULT_DEFWND))
2661         return;
2662
2663     sp_e.msgnum = msg;
2664     sp_e.msg_hwnd   = hWnd;
2665     sp_e.lParam = lParam;
2666     sp_e.wParam = wParam;
2667     SPY_GetWndName(&sp_e);
2668     SPY_GetMsgStuff(&sp_e);
2669
2670     if ((indent = get_indent_level()))
2671     {
2672         indent -= SPY_INDENT_UNIT;
2673         set_indent_level( indent );
2674     }
2675
2676     switch(iFlag)
2677     {
2678     case SPY_RESULT_DEFWND:
2679         TRACE(" %*s(%p)  DefWindowProc: [%04x] %s returned %08lx\n",
2680               indent, "", hWnd, msg, sp_e.msg_name, lReturn );
2681         break;
2682
2683     case SPY_RESULT_OK:
2684         TRACE(" %*s(%p) %-16s [%04x] %s returned %08lx\n",
2685                         indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
2686                         sp_e.msg_name, lReturn );
2687         SPY_DumpStructure(&sp_e, FALSE);
2688         break;
2689     }
2690     SetLastError( save_error );
2691 }