secur32: Remove some unused variables.
[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[SPY_MAX_MSGNUM+1];
2002 static unsigned char SPY_ExcludeDWP = 0;
2003
2004 #define SPY_EXCLUDE(msg) \
2005     (SPY_Exclude[(msg) > SPY_MAX_MSGNUM ? SPY_MAX_MSGNUM : (msg)])
2006
2007
2008 typedef struct
2009 {
2010     UINT       msgnum;           /* message number */
2011     HWND       msg_hwnd;         /* window handle for message          */
2012     WPARAM     wParam;           /* message parameter                  */
2013     LPARAM     lParam;           /* message parameter                  */
2014     INT        data_len;         /* length of data to dump             */
2015     char       msg_name[60];     /* message name (see SPY_GetMsgName)  */
2016     WCHAR      wnd_class[60];    /* window class name (full)           */
2017     WCHAR      wnd_name[16];     /* window name for message            */
2018 } SPY_INSTANCE;
2019
2020 static int indent_tls_index;
2021
2022 /***********************************************************************
2023  *           get_indent_level
2024  */
2025 static inline INT_PTR get_indent_level(void)
2026 {
2027     return (INT_PTR)TlsGetValue( indent_tls_index );
2028 }
2029
2030
2031 /***********************************************************************
2032  *           set_indent_level
2033  */
2034 static inline void set_indent_level( INT_PTR level )
2035 {
2036     TlsSetValue( indent_tls_index, (void *)level );
2037 }
2038
2039
2040 /***********************************************************************
2041  *           SPY_GetMsgInternal
2042  */
2043 static const char *SPY_GetMsgInternal( UINT msg )
2044 {
2045     if (msg <= SPY_MAX_MSGNUM)
2046         return MessageTypeNames[msg];
2047
2048     if (msg >= LVM_FIRST && msg <= LVM_FIRST + SPY_MAX_LVMMSGNUM)
2049         return LVMMessageTypeNames[msg-LVM_FIRST];
2050
2051     if (msg >= TV_FIRST && msg <= TV_FIRST + SPY_MAX_TVMSGNUM)
2052         return TVMessageTypeNames[msg-TV_FIRST];
2053
2054     if (msg >= HDM_FIRST && msg <= HDM_FIRST + SPY_MAX_HDMMSGNUM)
2055         return HDMMessageTypeNames[msg-HDM_FIRST];
2056
2057     if (msg >= TCM_FIRST && msg <= TCM_FIRST + SPY_MAX_TCMMSGNUM)
2058         return TCMMessageTypeNames[msg-TCM_FIRST];
2059
2060     if (msg >= PGM_FIRST && msg <= PGM_FIRST + SPY_MAX_PGMMSGNUM)
2061         return PGMMessageTypeNames[msg-PGM_FIRST];
2062
2063     if (msg >= CCM_FIRST && msg <= CCM_FIRST + SPY_MAX_CCMMSGNUM)
2064         return CCMMessageTypeNames[msg-CCM_FIRST];
2065
2066     if (msg >= WM_WINE_DESTROYWINDOW && msg <= WM_WINE_DESTROYWINDOW + SPY_MAX_WINEMSGNUM)
2067         return WINEMessageTypeNames[msg-WM_WINE_DESTROYWINDOW];
2068
2069     return NULL;
2070 }
2071
2072 /***********************************************************************
2073  *           SPY_Bsearch_Msg
2074  */
2075 static const USER_MSG *SPY_Bsearch_Msg( const USER_MSG *msgs, UINT count, UINT code)
2076 {
2077     int low = 0, high = count - 1;
2078
2079     while (low <= high)
2080     {
2081         int idx = (low + high) / 2;
2082         if (msgs[idx].value == code) return msgs + idx;
2083         if (msgs[idx].value > code)
2084             high = idx - 1;
2085         else
2086             low = idx + 1;
2087     }
2088     return NULL;
2089 }
2090
2091 /***********************************************************************
2092  *           SPY_GetClassLongOffsetName
2093  *
2094  * Gets the name of a class long offset.
2095  */
2096 const char *SPY_GetClassLongOffsetName( INT offset )
2097 {
2098     INT index;
2099     if (offset < 0 && offset % 2 == 0 && ((index = -(offset + 8) / 2) <
2100         sizeof(ClassLongOffsetNames) / sizeof(*ClassLongOffsetNames)))
2101     {
2102         return ClassLongOffsetNames[index];
2103     }
2104
2105     return "?";
2106 }
2107
2108 /***********************************************************************
2109  *           SPY_GetClassName
2110  *
2111  *  Sets the value of "wnd_class" member of the instance structure.
2112  */
2113 static void SPY_GetClassName( SPY_INSTANCE *sp_e )
2114 {
2115     /* special code to detect a property sheet dialog   */
2116     if ((GetClassLongW(sp_e->msg_hwnd, GCW_ATOM) == WC_DIALOG) &&
2117         (GetPropW(sp_e->msg_hwnd, PropSheetInfoStr))) {
2118         strcpyW(sp_e->wnd_class, WC_PROPSHEETW);
2119     }
2120     else {
2121         GetClassNameW(sp_e->msg_hwnd, sp_e->wnd_class, sizeof(sp_e->wnd_class)/sizeof(WCHAR));
2122     }
2123 }
2124
2125 /***********************************************************************
2126  *           SPY_GetMsgStuff
2127  *
2128  *  Get message name and other information for dumping
2129  */
2130 static void SPY_GetMsgStuff( SPY_INSTANCE *sp_e )
2131 {
2132     const USER_MSG *p;
2133     const char *msg_name = SPY_GetMsgInternal( sp_e->msgnum );
2134
2135     sp_e->data_len = 0;
2136     if (!msg_name)
2137     {
2138         INT i = 0;
2139
2140         if (sp_e->msgnum >= 0xc000)
2141         {
2142             if (GlobalGetAtomNameA( sp_e->msgnum, sp_e->msg_name+1, sizeof(sp_e->msg_name)-2 ))
2143             {
2144                 sp_e->msg_name[0] = '\"';
2145                 strcat( sp_e->msg_name, "\"" );
2146                 return;
2147             }
2148         }
2149         if (!sp_e->wnd_class[0]) SPY_GetClassName(sp_e);
2150
2151 #if DEBUG_SPY
2152         TRACE("looking class %s\n", debugstr_w(sp_e->wnd_class));
2153 #endif
2154
2155         while (cc_array[i].classname &&
2156                strcmpiW(cc_array[i].classname, sp_e->wnd_class) != 0) i++;
2157
2158         if (cc_array[i].classname)
2159         {
2160 #if DEBUG_SPY
2161             TRACE("process class %s, first %p, last %p\n",
2162                   debugstr_w(cc_array[i].classname), cc_array[i].classmsg,
2163                   cc_array[i].lastmsg);
2164 #endif
2165             p = SPY_Bsearch_Msg (cc_array[i].classmsg, cc_array[i].count, sp_e->msgnum);
2166             if (p) {
2167                 lstrcpynA (sp_e->msg_name, p->name, sizeof(sp_e->msg_name));
2168                 sp_e->data_len = p->len;
2169                 return;
2170             }
2171         }
2172         if (sp_e->msgnum >= WM_USER && sp_e->msgnum <= WM_APP)
2173             sprintf( sp_e->msg_name, "WM_USER+%d", sp_e->msgnum - WM_USER );
2174         else
2175             sprintf( sp_e->msg_name, "%04x", sp_e->msgnum );
2176     }
2177     else
2178     {
2179         lstrcpynA(sp_e->msg_name, msg_name, sizeof(sp_e->msg_name));
2180     }
2181 }
2182
2183 /***********************************************************************
2184  *           SPY_GetWndName
2185  *
2186  *  Sets the value of "wnd_name" and "wnd_class" members of the
2187  *  instance structure.
2188  *
2189  */
2190 static void SPY_GetWndName( SPY_INSTANCE *sp_e )
2191 {
2192     INT len;
2193
2194     SPY_GetClassName( sp_e );
2195
2196     len = InternalGetWindowText(sp_e->msg_hwnd, sp_e->wnd_name, sizeof(sp_e->wnd_name)/sizeof(WCHAR));
2197     if(!len) /* get class name */
2198     {
2199         LPWSTR dst = sp_e->wnd_name;
2200         LPWSTR src = sp_e->wnd_class;
2201         int n = sizeof(sp_e->wnd_name)/sizeof(WCHAR) - 3;
2202         *dst++ = '{';
2203         while ((n-- > 0) && *src) *dst++ = *src++;
2204         *dst++ = '}';
2205         *dst = 0;
2206     }
2207 }
2208
2209 /***********************************************************************
2210  *           SPY_GetMsgName
2211  *
2212  *  ****  External function  ****
2213  *
2214  *  Get message name
2215  */
2216 const char *SPY_GetMsgName( UINT msg, HWND hWnd )
2217 {
2218     SPY_INSTANCE ext_sp_e;
2219     DWORD save_error = GetLastError();
2220
2221     ext_sp_e.msgnum = msg;
2222     ext_sp_e.msg_hwnd   = hWnd;
2223     ext_sp_e.lParam = 0;
2224     ext_sp_e.wParam = 0;
2225     ext_sp_e.wnd_class[0] = 0;
2226     SPY_GetMsgStuff(&ext_sp_e);
2227     SetLastError( save_error );
2228     return wine_dbg_sprintf("%s", ext_sp_e.msg_name);
2229 }
2230
2231 /***********************************************************************
2232  *           SPY_GetVKeyName
2233  */
2234 const char *SPY_GetVKeyName(WPARAM wParam)
2235 {
2236     const char *vk_key_name;
2237
2238     if(wParam <= SPY_MAX_VKKEYSNUM && VK_KeyNames[wParam])
2239         vk_key_name = VK_KeyNames[wParam];
2240     else
2241         vk_key_name = "VK_???";
2242
2243     return vk_key_name;
2244 }
2245
2246 /***********************************************************************
2247  *           SPY_Bsearch_Notify
2248  */
2249 static const SPY_NOTIFY *SPY_Bsearch_Notify( UINT code)
2250 {
2251     int low = 0, high = ARRAYSIZE(spnfy_array) - 1;
2252
2253     while (low <= high)
2254     {
2255         int idx = (low + high) / 2;
2256         if (spnfy_array[idx].value == code) return spnfy_array + idx;
2257         if (spnfy_array[idx].value < code)
2258             high = idx - 1;
2259         else
2260             low = idx + 1;
2261     }
2262     return NULL;
2263 }
2264
2265 /***********************************************************************
2266  *           SPY_DumpMem
2267  */
2268 static void SPY_DumpMem (LPCSTR header, const UINT *q, INT len)
2269 {
2270     int i;
2271
2272     for(i=0; i<len-12; i+=16) {
2273         TRACE("%s [%04x] %08x %08x %08x %08x\n",
2274               header, i, *q, *(q+1), *(q+2), *(q+3));
2275         q += 4;
2276     }
2277     switch ((len - i + 3) & (~3)) {
2278     case 16:
2279         TRACE("%s [%04x] %08x %08x %08x %08x\n",
2280               header, i, *q, *(q+1), *(q+2), *(q+3));
2281         break;
2282     case 12:
2283         TRACE("%s [%04x] %08x %08x %08x\n",
2284               header, i, *q, *(q+1), *(q+2));
2285         break;
2286     case 8:
2287         TRACE("%s [%04x] %08x %08x\n",
2288               header, i, *q, *(q+1));
2289         break;
2290     case 4:
2291         TRACE("%s [%04x] %08x\n",
2292               header, i, *q);
2293         break;
2294     default:
2295         break;
2296     }
2297 }
2298
2299 /***********************************************************************
2300  *           SPY_DumpStructure
2301  */
2302 static void SPY_DumpStructure(const SPY_INSTANCE *sp_e, BOOL enter)
2303 {
2304     switch (sp_e->msgnum)
2305         {
2306         case LVM_INSERTITEMW:
2307         case LVM_SETITEMW:
2308             if (!enter) break;
2309             /* fall through */
2310         case LVM_GETITEMW:
2311             {
2312                 LPLVITEMA item = (LPLVITEMA) sp_e->lParam;
2313                 if (item) {
2314                     SPY_DumpMem ("LVITEM", (UINT*)item, sizeof(LVITEMA));
2315                 }
2316                 break;
2317             }
2318         case TCM_INSERTITEMW:
2319         case TCM_INSERTITEMA:
2320         case TCM_SETITEMW:
2321         case TCM_SETITEMA:
2322             if (!enter) break;
2323             /* fall through */
2324         case TCM_GETITEMW:
2325         case TCM_GETITEMA:
2326             {
2327                 TCITEMA *item = (TCITEMA *) sp_e->lParam;
2328                 if (item) {
2329                     SPY_DumpMem ("TCITEM", (UINT*)item, sizeof(TCITEMA));
2330                 }
2331                 break;
2332             }
2333         case TCM_ADJUSTRECT:
2334         case LVM_GETITEMRECT:
2335         case LVM_GETSUBITEMRECT:
2336             {
2337                 LPRECT rc = (LPRECT) sp_e->lParam;
2338                 if (rc)
2339                     TRACE("lParam rect (%s)\n", wine_dbgstr_rect(rc));
2340                 break;
2341             }
2342         case LVM_SETITEMPOSITION32:
2343             if (!enter) break;
2344             /* fall through */
2345         case LVM_GETITEMPOSITION:
2346         case LVM_GETORIGIN:
2347             {
2348                 LPPOINT point = (LPPOINT) sp_e->lParam;
2349                 if (point) {
2350                     TRACE("lParam point x=%d, y=%d\n", point->x, point->y);
2351                 }
2352                 break;
2353             }
2354         case SBM_SETRANGE:
2355             if (!enter && (sp_e->msgnum == SBM_SETRANGE)) break;
2356             TRACE("min=%d max=%d\n", (INT)sp_e->wParam, (INT)sp_e->lParam);
2357             break;
2358         case SBM_GETRANGE:
2359             if ((enter && (sp_e->msgnum == SBM_GETRANGE)) ||
2360                 (!enter && (sp_e->msgnum == SBM_SETRANGE))) break;
2361             {
2362                 LPINT ptmin = (LPINT) sp_e->wParam;
2363                 LPINT ptmax = (LPINT) sp_e->lParam;
2364                 if (ptmin && ptmax)
2365                     TRACE("min=%d max=%d\n", *ptmin, *ptmax);
2366                 else if (ptmin)
2367                     TRACE("min=%d max=n/a\n", *ptmin);
2368                 else if (ptmax)
2369                     TRACE("min=n/a max=%d\n", *ptmax);
2370                 break;
2371             }
2372         case EM_EXSETSEL:
2373             if (enter && sp_e->lParam)
2374             {
2375                 CHARRANGE *cr = (CHARRANGE *) sp_e->lParam;
2376                 TRACE("CHARRANGE: cpMin=%d cpMax=%d\n", cr->cpMin, cr->cpMax);
2377             }
2378             break;
2379         case EM_SETCHARFORMAT:
2380             if (enter && sp_e->lParam)
2381             {
2382                 CHARFORMATW *cf = (CHARFORMATW *) sp_e->lParam;
2383                 TRACE("CHARFORMAT: dwMask=0x%08x dwEffects=", cf->dwMask);
2384                 if ((cf->dwMask & CFM_BOLD) && (cf->dwEffects & CFE_BOLD))
2385                     TRACE(" CFE_BOLD");
2386                 if ((cf->dwMask & CFM_COLOR) && (cf->dwEffects & CFE_AUTOCOLOR))
2387                     TRACE(" CFE_AUTOCOLOR");
2388                 if ((cf->dwMask & CFM_ITALIC) && (cf->dwEffects & CFE_ITALIC))
2389                     TRACE(" CFE_ITALIC");
2390                 if ((cf->dwMask & CFM_PROTECTED) && (cf->dwEffects & CFE_PROTECTED))
2391                     TRACE(" CFE_PROTECTED");
2392                 if ((cf->dwMask & CFM_STRIKEOUT) && (cf->dwEffects & CFE_STRIKEOUT))
2393                     TRACE(" CFE_STRIKEOUT");
2394                 if ((cf->dwMask & CFM_UNDERLINE) && (cf->dwEffects & CFE_UNDERLINE))
2395                     TRACE(" CFE_UNDERLINE");
2396                 TRACE("\n");
2397                 if (cf->dwMask & CFM_SIZE)
2398                     TRACE("yHeight=%d\n", cf->yHeight);
2399                 if (cf->dwMask & CFM_OFFSET)
2400                     TRACE("yOffset=%d\n", cf->yOffset);
2401                 if ((cf->dwMask & CFM_COLOR) && !(cf->dwEffects & CFE_AUTOCOLOR))
2402                     TRACE("crTextColor=%x\n", cf->crTextColor);
2403                 TRACE("bCharSet=%x bPitchAndFamily=%x\n", cf->bCharSet, cf->bPitchAndFamily);
2404                 /* FIXME: we should try to be a bit more intelligent about
2405                  * whether this is in ANSI or Unicode (it could be either) */
2406                 if (cf->dwMask & CFM_FACE)
2407                     TRACE("szFaceName=%s\n", debugstr_wn(cf->szFaceName, LF_FACESIZE));
2408                 /* FIXME: handle CHARFORMAT2 too */
2409             }
2410             break;
2411         case WM_DRAWITEM:
2412             if (!enter) break;
2413             {
2414                 DRAWITEMSTRUCT *lpdis = (DRAWITEMSTRUCT*) sp_e->lParam;
2415                 TRACE("DRAWITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n",
2416                       lpdis->CtlType, lpdis->CtlID);
2417                 TRACE("itemID=0x%08x itemAction=0x%08x itemState=0x%08x\n",
2418                       lpdis->itemID, lpdis->itemAction, lpdis->itemState);
2419                 TRACE("hWnd=%p hDC=%p (%s) itemData=0x%08lx\n",
2420                       lpdis->hwndItem, lpdis->hDC,
2421                       wine_dbgstr_rect(&lpdis->rcItem), lpdis->itemData);
2422             }
2423             break;
2424         case WM_MEASUREITEM:
2425             {
2426                 MEASUREITEMSTRUCT *lpmis = (MEASUREITEMSTRUCT*) sp_e->lParam;
2427                 TRACE("MEASUREITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n",
2428                       lpmis->CtlType, lpmis->CtlID);
2429                 TRACE("itemID=0x%08x itemWidth=0x%08x itemHeight=0x%08x\n",
2430                       lpmis->itemID, lpmis->itemWidth, lpmis->itemHeight);
2431                 TRACE("itemData=0x%08lx\n", lpmis->itemData);
2432             }
2433             break;
2434         case WM_NCCREATE:
2435         case WM_CREATE:
2436         {
2437             BOOL unicode;
2438             CREATESTRUCTA *cs;
2439
2440             if (!enter) break;
2441
2442             unicode = IsWindowUnicode(sp_e->msg_hwnd);
2443             cs = (CREATESTRUCTA *)sp_e->lParam;
2444             TRACE("%s %s ex=%08x style=%08x %d,%d %dx%d parent=%p menu=%p inst=%p params=%p\n",
2445                   unicode ? debugstr_w((LPCWSTR)cs->lpszName) : debugstr_a(cs->lpszName),
2446                   unicode ? debugstr_w((LPCWSTR)cs->lpszClass) : debugstr_a(cs->lpszClass),
2447                   cs->dwExStyle, cs->style, cs->x, cs->y, cs->cx, cs->cy,
2448                   cs->hwndParent, cs->hMenu, cs->hInstance, cs->lpCreateParams);
2449             break;
2450         }
2451         case WM_SIZE:
2452             if (!enter) break;
2453             TRACE("cx=%d cy=%d\n", LOWORD(sp_e->lParam), HIWORD(sp_e->lParam));
2454             break;
2455         case WM_WINDOWPOSCHANGED:
2456             if (!enter) break;
2457         case WM_WINDOWPOSCHANGING:
2458             {
2459                 WINDOWPOS *lpwp = (WINDOWPOS *)sp_e->lParam;
2460                 TRACE("WINDOWPOS hwnd=%p, after=%p, at (%d,%d) w=%d h=%d, flags=0x%08x\n",
2461                       lpwp->hwnd, lpwp->hwndInsertAfter, lpwp->x, lpwp->y,
2462                       lpwp->cx, lpwp->cy, lpwp->flags);
2463             }
2464             break;
2465         case WM_STYLECHANGED:
2466             if (!enter) break;
2467         case WM_STYLECHANGING:
2468             {
2469                 LPSTYLESTRUCT ss = (LPSTYLESTRUCT) sp_e->lParam;
2470                 TRACE("STYLESTRUCT: StyleOld=0x%08x, StyleNew=0x%08x\n",
2471                       ss->styleOld, ss->styleNew);
2472             }
2473             break;
2474         case WM_NCCALCSIZE:
2475             {
2476                 RECT *rc = (RECT *)sp_e->lParam;
2477                 TRACE("Rect (%s)\n", wine_dbgstr_rect(rc));
2478             }
2479             break;
2480         case WM_NOTIFY:
2481             /* if (!enter) break; */
2482             {
2483                 NMHDR * pnmh = (NMHDR*) sp_e->lParam;
2484                 UINT *q, dumplen;
2485                 const SPY_NOTIFY *p;
2486                 WCHAR from_class[60];
2487                 DWORD save_error;
2488
2489                 p = SPY_Bsearch_Notify( pnmh->code );
2490                 if (p) {
2491                     TRACE("NMHDR hwndFrom=%p idFrom=0x%08lx code=%s<0x%08x>, extra=0x%x\n",
2492                           pnmh->hwndFrom, pnmh->idFrom, p->name, pnmh->code, p->len);
2493                     dumplen = p->len;
2494
2495                     /* for CUSTOMDRAW, dump all the data for TOOLBARs */
2496                     if (pnmh->code == NM_CUSTOMDRAW) {
2497                         /* save and restore error code over the next call */
2498                         save_error = GetLastError();
2499                         GetClassNameW(pnmh->hwndFrom, from_class,
2500                                       sizeof(from_class)/sizeof(WCHAR));
2501                         SetLastError(save_error);
2502                         if (strcmpW(TOOLBARCLASSNAMEW, from_class) == 0)
2503                             dumplen = sizeof(NMTBCUSTOMDRAW)-sizeof(NMHDR);
2504                     } else if ( pnmh->code >= HDN_ENDDRAG
2505                                 && pnmh->code <= HDN_ITEMCHANGINGA ) {
2506                         dumplen = sizeof(NMHEADERA)-sizeof(NMHDR);
2507                     }
2508                     if (dumplen > 0) {
2509                         q = (UINT *)(pnmh + 1);
2510                         SPY_DumpMem ("NM extra", q, (INT)dumplen);
2511                     }
2512                 }
2513                 else
2514                     TRACE("NMHDR hwndFrom=%p idFrom=0x%08lx code=0x%08x\n",
2515                           pnmh->hwndFrom, pnmh->idFrom, pnmh->code);
2516             }
2517         default:
2518             if (sp_e->data_len > 0)
2519                 SPY_DumpMem ("MSG lParam", (UINT *)sp_e->lParam, sp_e->data_len);
2520             break;
2521         }
2522
2523 }
2524 /***********************************************************************
2525  *           SPY_EnterMessage
2526  */
2527 void SPY_EnterMessage( INT iFlag, HWND hWnd, UINT msg,
2528                        WPARAM wParam, LPARAM lParam )
2529 {
2530     SPY_INSTANCE sp_e;
2531     int indent;
2532     DWORD save_error = GetLastError();
2533
2534     if (!TRACE_ON(message) || SPY_EXCLUDE(msg)) return;
2535
2536     sp_e.msgnum = msg;
2537     sp_e.msg_hwnd = hWnd;
2538     sp_e.lParam = lParam;
2539     sp_e.wParam = wParam;
2540     SPY_GetWndName(&sp_e);
2541     SPY_GetMsgStuff(&sp_e);
2542     indent = get_indent_level();
2543
2544     /* each SPY_SENDMESSAGE must be complemented by call to SPY_ExitMessage */
2545     switch(iFlag)
2546     {
2547     case SPY_DISPATCHMESSAGE:
2548         TRACE("%*s(%p) %-16s [%04x] %s dispatched  wp=%08lx lp=%08lx\n",
2549                         indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
2550                         sp_e.msg_name, wParam, lParam);
2551         break;
2552
2553     case SPY_SENDMESSAGE:
2554         {
2555             char taskName[20];
2556             DWORD tid = GetWindowThreadProcessId( hWnd, NULL );
2557
2558             if (tid == GetCurrentThreadId()) strcpy( taskName, "self" );
2559             else sprintf( taskName, "tid %04x", GetCurrentThreadId() );
2560
2561             TRACE("%*s(%p) %-16s [%04x] %s sent from %s wp=%08lx lp=%08lx\n",
2562                   indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
2563                   sp_e.msg_name, taskName, wParam, lParam );
2564             SPY_DumpStructure(&sp_e, TRUE);
2565         }
2566         break;
2567
2568     case SPY_DEFWNDPROC:
2569         if( SPY_ExcludeDWP ) return;
2570         TRACE("%*s(%p)  DefWindowProc:[%04x] %s  wp=%08lx lp=%08lx\n",
2571               indent, "", hWnd, msg, sp_e.msg_name, wParam, lParam );
2572         break;
2573     }
2574     set_indent_level( indent + SPY_INDENT_UNIT );
2575     SetLastError( save_error );
2576 }
2577
2578
2579 /***********************************************************************
2580  *           SPY_ExitMessage
2581  */
2582 void SPY_ExitMessage( INT iFlag, HWND hWnd, UINT msg, LRESULT lReturn,
2583                        WPARAM wParam, LPARAM lParam )
2584 {
2585     SPY_INSTANCE sp_e;
2586     int indent;
2587     DWORD save_error = GetLastError();
2588
2589     if (!TRACE_ON(message) || SPY_EXCLUDE(msg) ||
2590         (SPY_ExcludeDWP && iFlag == SPY_RESULT_DEFWND))
2591         return;
2592
2593     sp_e.msgnum = msg;
2594     sp_e.msg_hwnd   = hWnd;
2595     sp_e.lParam = lParam;
2596     sp_e.wParam = wParam;
2597     SPY_GetWndName(&sp_e);
2598     SPY_GetMsgStuff(&sp_e);
2599
2600     if ((indent = get_indent_level()))
2601     {
2602         indent -= SPY_INDENT_UNIT;
2603         set_indent_level( indent );
2604     }
2605
2606     switch(iFlag)
2607     {
2608     case SPY_RESULT_DEFWND:
2609         TRACE(" %*s(%p)  DefWindowProc: [%04x] %s returned %08lx\n",
2610               indent, "", hWnd, msg, sp_e.msg_name, lReturn );
2611         break;
2612
2613     case SPY_RESULT_OK:
2614         TRACE(" %*s(%p) %-16s [%04x] %s returned %08lx\n",
2615                         indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
2616                         sp_e.msg_name, lReturn );
2617         SPY_DumpStructure(&sp_e, FALSE);
2618         break;
2619     }
2620     SetLastError( save_error );
2621 }
2622
2623
2624 /***********************************************************************
2625  *           SPY_Init
2626  */
2627 int SPY_Init(void)
2628 {
2629     int i;
2630     char buffer[1024];
2631     HKEY hkey;
2632
2633     if (!TRACE_ON(message)) return TRUE;
2634
2635     indent_tls_index = TlsAlloc();
2636     /* @@ Wine registry key: HKCU\Software\Wine\Debug */
2637     if(!RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Wine\\Debug", &hkey))
2638     {
2639         DWORD type, count = sizeof(buffer);
2640
2641         buffer[0] = 0;
2642         if (!RegQueryValueExA(hkey, "SpyInclude", 0, &type, (LPBYTE) buffer, &count) &&
2643             strcmp( buffer, "INCLUDEALL" ))
2644         {
2645             TRACE("Include=%s\n", buffer );
2646             for (i = 0; i <= SPY_MAX_MSGNUM; i++)
2647                 SPY_Exclude[i] = (MessageTypeNames[i] && !strstr(buffer,MessageTypeNames[i]));
2648         }
2649
2650         count = sizeof(buffer);
2651         buffer[0] = 0;
2652         if (!RegQueryValueExA(hkey, "SpyExclude", 0, &type, (LPBYTE) buffer, &count))
2653         {
2654             TRACE("Exclude=%s\n", buffer );
2655             if (!strcmp( buffer, "EXCLUDEALL" ))
2656                 for (i = 0; i <= SPY_MAX_MSGNUM; i++) SPY_Exclude[i] = TRUE;
2657             else
2658                 for (i = 0; i <= SPY_MAX_MSGNUM; i++)
2659                     SPY_Exclude[i] = (MessageTypeNames[i] && strstr(buffer,MessageTypeNames[i]));
2660         }
2661
2662         SPY_ExcludeDWP = 0;
2663         count = sizeof(buffer);
2664         if(!RegQueryValueExA(hkey, "SpyExcludeDWP", 0, &type, (LPBYTE) buffer, &count))
2665             SPY_ExcludeDWP = atoi(buffer);
2666
2667         RegCloseKey(hkey);
2668     }
2669
2670     return 1;
2671 }