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