d3d10: COM cleanup for the ID3D10EffectType iface.
[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",       /* 0x03B9 */
690                 NULL,
691     "MM_WOM_OPEN",        /* 0x03BB */
692     "MM_WOM_CLOSE",       /* 0x03BC */
693     "MM_WOM_DONE",        /* 0x03BD */
694     "MM_WIM_OPEN",        /* 0x03BE */
695     "MM_WIM_CLOSE",       /* 0x03BF */
696
697     /* 0x03c0 */
698     "MM_WIM_DATA",        /* 0x03C0 */
699     "MM_MIM_OPEN",        /* 0x03C1 */
700     "MM_MIM_CLOSE",       /* 0x03C2 */
701     "MM_MIM_DATA",        /* 0x03C3 */
702     "MM_MIM_LONGDATA",    /* 0x03C4 */
703     "MM_MIM_ERROR",       /* 0x03C5 */
704     "MM_MIM_LONGERROR",   /* 0x03C6 */
705     "MM_MOM_OPEN",        /* 0x03C7 */
706     "MM_MOM_CLOSE",       /* 0x03C8 */
707     "MM_MOM_DONE",        /* 0x03C9 */
708     "MM_MOM_POSITIONCB",  /* 0x03CA */
709     "MM_MCISIGNAL",       /* 0x03CB */
710     "MM_MIM_MOREDATA",    /* 0x03CC */
711                                   NULL, NULL, NULL,
712
713     /* 0x03d0 */
714     "MM_MIXM_LINE_CHANGE",
715     "MM_MIXM_CONTROL_CHANGE",
716                 NULL, NULL, NULL, NULL, NULL, NULL,
717     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
718
719     /* 0x03e0 */
720     "WM_DDE_INITIATE",  /* 0x3E0 */
721     "WM_DDE_TERMINATE", /* 0x3E1 */
722     "WM_DDE_ADVISE",    /* 0x3E2 */
723     "WM_DDE_UNADVISE",  /* 0x3E3 */
724     "WM_DDE_ACK",       /* 0x3E4 */
725     "WM_DDE_DATA",      /* 0x3E5 */
726     "WM_DDE_REQUEST",   /* 0x3E6 */
727     "WM_DDE_POKE",      /* 0x3E7 */
728     "WM_DDE_EXECUTE",   /* 0x3E8 */
729     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
730
731
732     /* 0x03f0 */
733     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
734     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
735
736     "WM_USER"                   /* 0x0400 */
737 };
738
739
740 #define SPY_MAX_LVMMSGNUM   182
741 static const char * const LVMMessageTypeNames[SPY_MAX_LVMMSGNUM + 1] =
742 {
743     "LVM_GETBKCOLOR",           /* 1000 */
744     "LVM_SETBKCOLOR",
745     "LVM_GETIMAGELIST",
746     "LVM_SETIMAGELIST",
747     "LVM_GETITEMCOUNT",
748     "LVM_GETITEMA",
749     "LVM_SETITEMA",
750     "LVM_INSERTITEMA",
751     "LVM_DELETEITEM",
752     "LVM_DELETEALLITEMS",
753     "LVM_GETCALLBACKMASK",
754     "LVM_SETCALLBACKMASK",
755     "LVM_GETNEXTITEM",
756     "LVM_FINDITEMA",
757     "LVM_GETITEMRECT",
758     "LVM_SETITEMPOSITION",
759     "LVM_GETITEMPOSITION",
760     "LVM_GETSTRINGWIDTHA",
761     "LVM_HITTEST",
762     "LVM_ENSUREVISIBLE",
763     "LVM_SCROLL",
764     "LVM_REDRAWITEMS",
765     "LVM_ARRANGE",
766     "LVM_EDITLABELA",
767     "LVM_GETEDITCONTROL",
768     "LVM_GETCOLUMNA",
769     "LVM_SETCOLUMNA",
770     "LVM_INSERTCOLUMNA",
771     "LVM_DELETECOLUMN",
772     "LVM_GETCOLUMNWIDTH",
773     "LVM_SETCOLUMNWIDTH",
774     "LVM_GETHEADER",
775     NULL,
776     "LVM_CREATEDRAGIMAGE",
777     "LVM_GETVIEWRECT",
778     "LVM_GETTEXTCOLOR",
779     "LVM_SETTEXTCOLOR",
780     "LVM_GETTEXTBKCOLOR",
781     "LVM_SETTEXTBKCOLOR",
782     "LVM_GETTOPINDEX",
783     "LVM_GETCOUNTPERPAGE",
784     "LVM_GETORIGIN",
785     "LVM_UPDATE",
786     "LVM_SETITEMSTATE",
787     "LVM_GETITEMSTATE",
788     "LVM_GETITEMTEXTA",
789     "LVM_SETITEMTEXTA",
790     "LVM_SETITEMCOUNT",
791     "LVM_SORTITEMS",
792     "LVM_SETITEMPOSITION32",
793     "LVM_GETSELECTEDCOUNT",
794     "LVM_GETITEMSPACING",
795     "LVM_GETISEARCHSTRINGA",
796     "LVM_SETICONSPACING",
797     "LVM_SETEXTENDEDLISTVIEWSTYLE",
798     "LVM_GETEXTENDEDLISTVIEWSTYLE",
799     "LVM_GETSUBITEMRECT",
800     "LVM_SUBITEMHITTEST",
801     "LVM_SETCOLUMNORDERARRAY",
802     "LVM_GETCOLUMNORDERARRAY",
803     "LVM_SETHOTITEM",
804     "LVM_GETHOTITEM",
805     "LVM_SETHOTCURSOR",
806     "LVM_GETHOTCURSOR",
807     "LVM_APPROXIMATEVIEWRECT",
808     "LVM_SETWORKAREAS",
809     "LVM_GETSELECTIONMARK",
810     "LVM_SETSELECTIONMARK",
811     "LVM_SETBKIMAGEA",
812     "LVM_GETBKIMAGEA",
813     "LVM_GETWORKAREAS",
814     "LVM_SETHOVERTIME",
815     "LVM_GETHOVERTIME",
816     "LVM_GETNUMBEROFWORKAREAS",
817     "LVM_SETTOOLTIPS",
818     "LVM_GETITEMW",
819     "LVM_SETITEMW",
820     "LVM_INSERTITEMW",
821     "LVM_GETTOOLTIPS",
822     NULL,
823     NULL,
824     NULL,
825     NULL,
826     "LVM_FINDITEMW",
827     NULL,
828     NULL,
829     NULL,
830     "LVM_GETSTRINGWIDTHW",
831     NULL,
832     NULL,
833     NULL,
834     NULL,
835     NULL,
836     NULL,
837     NULL,
838     "LVM_GETCOLUMNW",
839     "LVM_SETCOLUMNW",
840     "LVM_INSERTCOLUMNW",
841     NULL,
842     NULL,
843     NULL,
844     NULL,
845     NULL,
846     NULL,
847     NULL,
848     NULL,
849     NULL,
850     NULL,
851     NULL,
852     NULL,
853     NULL,
854     NULL,
855     NULL,
856     NULL,
857     NULL,
858     "LVM_GETITEMTEXTW",
859     "LVM_SETITEMTEXTW",
860     "LVM_GETISEARCHSTRINGW",
861     "LVM_EDITLABELW",
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     NULL,
875     NULL,
876     NULL,
877     NULL,
878     NULL,
879     NULL,
880     NULL,
881     "LVM_SETBKIMAGEW",
882     "LVM_GETBKIMAGEW",   /* 0x108B */
883     "LVM_SETSELECTEDCOLUMN",
884     "LVM_SETTILEWIDTH",
885     "LVM_SETVIEW",
886     "LVM_GETVIEW",
887     NULL,
888     "LVM_INSERTGROUP",
889     NULL,
890     "LVM_SETGROUPINFO",
891     NULL,
892     "LVM_GETGROUPINFO",
893     "LVM_REMOVEGROUP",
894     "LVM_MOVEGROUP",
895     NULL,
896     NULL,
897     "LVM_MOVEITEMTOGROUP",
898     "LVM_SETGROUPMETRICS",
899     "LVM_GETGROUPMETRICS",
900     "LVM_ENABLEGROUPVIEW",
901     "LVM_SORTGROUPS",
902     "LVM_INSERTGROUPSORTED",
903     "LVM_REMOVEALLGROUPS",
904     "LVM_HASGROUP",
905     "LVM_SETTILEVIEWINFO",
906     "LVM_GETTILEVIEWINFO",
907     "LVM_SETTILEINFO",
908     "LVM_GETTILEINFO",
909     "LVM_SETINSERTMARK",
910     "LVM_GETINSERTMARK",
911     "LVM_INSERTMARKHITTEST",
912     "LVM_GETINSERTMARKRECT",
913     "LVM_SETINSERTMARKCOLOR",
914     "LVM_GETINSERTMARKCOLOR",
915     NULL,
916     "LVM_SETINFOTIP",
917     "LVM_GETSELECTEDCOLUMN",
918     "LVM_ISGROUPVIEWENABLED",
919     "LVM_GETOUTLINECOLOR",
920     "LVM_SETOUTLINECOLOR",
921     NULL,
922     "LVM_CANCELEDITLABEL",
923     "LVM_MAPINDEXTOID",
924     "LVM_MAPIDTOINDEX",
925     "LVM_ISITEMVISIBLE"
926 };
927
928
929 #define SPY_MAX_TVMSGNUM   65
930 static const char * const TVMessageTypeNames[SPY_MAX_TVMSGNUM + 1] =
931 {
932     "TVM_INSERTITEMA",          /* 1100 */
933     "TVM_DELETEITEM",
934     "TVM_EXPAND",
935     NULL,
936     "TVM_GETITEMRECT",
937     "TVM_GETCOUNT",
938     "TVM_GETINDENT",
939     "TVM_SETINDENT",
940     "TVM_GETIMAGELIST",
941     "TVM_SETIMAGELIST",
942     "TVM_GETNEXTITEM",
943     "TVM_SELECTITEM",
944     "TVM_GETITEMA",
945     "TVM_SETITEMA",
946     "TVM_EDITLABELA",
947     "TVM_GETEDITCONTROL",
948     "TVM_GETVISIBLECOUNT",
949     "TVM_HITTEST",
950     "TVM_CREATEDRAGIMAGE",
951     "TVM_SORTCHILDREN",
952     "TVM_ENSUREVISIBLE",
953     "TVM_SORTCHILDRENCB",
954     "TVM_ENDEDITLABELNOW",
955     "TVM_GETISEARCHSTRINGA",
956     "TVM_SETTOOLTIPS",
957     "TVM_GETTOOLTIPS",
958     "TVM_SETINSERTMARK",
959     "TVM_SETITEMHEIGHT",
960     "TVM_GETITEMHEIGHT",
961     "TVM_SETBKCOLOR",
962     "TVM_SETTEXTCOLOR",
963     "TVM_GETBKCOLOR",
964     "TVM_GETTEXTCOLOR",
965     "TVM_SETSCROLLTIME",
966     "TVM_GETSCROLLTIME",
967     "TVM_UNKNOWN35",
968     "TVM_UNKNOWN36",
969     "TVM_SETINSERTMARKCOLOR",
970     "TVM_GETINSERTMARKCOLOR",
971     "TVM_GETITEMSTATE",
972     "TVM_SETLINECOLOR",
973     "TVM_GETLINECOLOR",
974     NULL,
975     NULL,
976     NULL,
977     NULL,
978     NULL,
979     NULL,
980     NULL,
981     NULL,
982     "TVM_INSERTITEMW",
983     NULL,
984     NULL,
985     NULL,
986     NULL,
987     NULL,
988     NULL,
989     NULL,
990     NULL,
991     NULL,
992     NULL,
993     NULL,
994     "TVM_GETITEMW",
995     "TVM_SETITEMW",
996     "TVM_GETISEARCHSTRINGW",
997     "TVM_EDITLABELW"
998 };
999
1000
1001 #define SPY_MAX_HDMMSGNUM   19
1002 static const char * const HDMMessageTypeNames[SPY_MAX_HDMMSGNUM + 1] =
1003 {
1004     "HDM_GETITEMCOUNT",         /* 1200 */
1005     "HDM_INSERTITEMA",
1006     "HDM_DELETEITEM",
1007     "HDM_GETITEMA",
1008     "HDM_SETITEMA",
1009     "HDM_LAYOUT",
1010     "HDM_HITTEST",
1011     "HDM_GETITEMRECT",
1012     "HDM_SETIMAGELIST",
1013     "HDM_GETIMAGELIST",
1014     "HDM_INSERTITEMW",
1015     "HDM_GETITEMW",
1016     "HDM_SETITEMW",
1017     NULL,
1018     NULL,
1019     "HDM_ORDERTOINDEX",
1020     "HDM_CREATEDRAGIMAGE",
1021     "GETORDERARRAYINDEX",
1022     "SETORDERARRAYINDEX",
1023     "SETHOTDIVIDER"
1024 };
1025
1026
1027 #define SPY_MAX_TCMMSGNUM   62
1028 static const char * const TCMMessageTypeNames[SPY_MAX_TCMMSGNUM + 1] =
1029 {
1030     NULL,               /* 1300 */
1031     NULL,
1032     "TCM_SETIMAGELIST",
1033     "TCM_GETIMAGELIST",
1034     "TCM_GETITEMCOUNT",
1035     "TCM_GETITEMA",
1036     "TCM_SETITEMA",
1037     "TCM_INSERTITEMA",
1038     "TCM_DELETEITEM",
1039     "TCM_DELETEALLITEMS",
1040     "TCM_GETITEMRECT",
1041     "TCM_GETCURSEL",
1042     "TCM_SETCURSEL",
1043     "TCM_HITTEST",
1044     "TCM_SETITEMEXTRA",
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     NULL,
1064     NULL,
1065     NULL,
1066     NULL,
1067     NULL,
1068     NULL,
1069     NULL,
1070     "TCM_ADJUSTRECT",
1071     "TCM_SETITEMSIZE",
1072     "TCM_REMOVEIMAGE",
1073     "TCM_SETPADDING",
1074     "TCM_GETROWCOUNT",
1075     "TCM_GETTOOLTIPS",
1076     "TCM_SETTOOLTIPS",
1077     "TCM_GETCURFOCUS",
1078     "TCM_SETCURFOCUS",
1079     "TCM_SETMINTABWIDTH",
1080     "TCM_DESELECTALL",
1081     "TCM_HIGHLIGHTITEM",
1082     "TCM_SETEXTENDEDSTYLE",
1083     "TCM_GETEXTENDEDSTYLE",
1084     NULL,
1085     NULL,
1086     NULL,
1087     NULL,
1088     NULL,
1089     NULL,
1090     "TCM_GETITEMW",
1091     "TCM_SETITEMW",
1092     "TCM_INSERTITEMW"
1093 };
1094
1095 #define SPY_MAX_PGMMSGNUM   13
1096 static const char * const PGMMessageTypeNames[SPY_MAX_PGMMSGNUM + 1] =
1097 {
1098     NULL,               /* 1400 */
1099     "PGM_SETCHILD",
1100     "PGM_RECALCSIZE",
1101     "PGM_FORWARDMOUSE",
1102     "PGM_SETBKCOLOR",
1103     "PGM_GETBKCOLOR",
1104     "PGM_SETBORDER",
1105     "PGM_GETBORDER",
1106     "PGM_SETPOS",
1107     "PGM_GETPOS",
1108     "PGM_SETBUTTONSIZE",
1109     "PGM_GETBUTTONSIZE",
1110     "PGM_GETBUTTONSTATE",
1111     "PGM_GETDROPTARGET"
1112 };
1113
1114
1115 #define SPY_MAX_CCMMSGNUM   9
1116 static const char * const CCMMessageTypeNames[SPY_MAX_CCMMSGNUM + 1] =
1117 {
1118     NULL,               /* 0x2000 */
1119     "CCM_SETBKCOLOR",
1120     "CCM_SETCOLORSCHEME",
1121     "CCM_GETCOLORSCHEME",
1122     "CCM_GETDROPTARGET",
1123     "CCM_SETUNICODEFORMAT",
1124     "CCM_GETUNICODEFORMAT",
1125     "CCM_SETVERSION",
1126     "CCM_GETVERSION",
1127     "CCM_SETNOTIFYWINDOW"
1128 };
1129
1130 #define SPY_MAX_WINEMSGNUM   (WM_WINE_MOUSE_LL_HOOK - WM_WINE_DESTROYWINDOW)
1131 static const char * const WINEMessageTypeNames[SPY_MAX_WINEMSGNUM + 1] =
1132 {
1133     "WM_WINE_DESTROYWINDOW",
1134     "WM_WINE_SETWINDOWPOS",
1135     "WM_WINE_SHOWWINDOW",
1136     "WM_WINE_SETPARENT",
1137     "WM_WINE_SETWINDOWLONG",
1138     "WM_WINE_ENABLEWINDOW",
1139     "WM_WINE_SETACTIVEWINDOW",
1140     "WM_WINE_KEYBOARD_LL_HOOK",
1141     "WM_WINE_MOUSE_LL_HOOK",
1142 };
1143
1144 /* Virtual key names */
1145 #define SPY_MAX_VKKEYSNUM 255
1146 static const char * const VK_KeyNames[SPY_MAX_VKKEYSNUM + 1] =
1147 {
1148     NULL,               /* 0x00 */
1149     "VK_LBUTTON",       /* 0x01 */
1150     "VK_RBUTTON",       /* 0x02 */
1151     "VK_CANCEL",        /* 0x03 */
1152     "VK_MBUTTON",       /* 0x04 */
1153     "VK_XBUTTON1",      /* 0x05 */
1154     "VK_XBUTTON2",      /* 0x06 */
1155     NULL,               /* 0x07 */
1156     "VK_BACK",          /* 0x08 */
1157     "VK_TAB",           /* 0x09 */
1158     NULL,               /* 0x0A */
1159     NULL,               /* 0x0B */
1160     "VK_CLEAR",         /* 0x0C */
1161     "VK_RETURN",        /* 0x0D */
1162     NULL,               /* 0x0E */
1163     NULL,               /* 0x0F */
1164     "VK_SHIFT",         /* 0x10 */
1165     "VK_CONTROL",       /* 0x11 */
1166     "VK_MENU",          /* 0x12 */
1167     "VK_PAUSE",         /* 0x13 */
1168     "VK_CAPITAL",       /* 0x14 */
1169     NULL,               /* 0x15 */
1170     NULL,               /* 0x16 */
1171     NULL,               /* 0x17 */
1172     NULL,               /* 0x18 */
1173     NULL,               /* 0x19 */
1174     NULL,               /* 0x1A */
1175     "VK_ESCAPE",        /* 0x1B */
1176     "VK_CONVERT",       /* 0x1C */
1177     "VK_NONCONVERT",    /* 0x1D */
1178     "VK_ACCEPT",        /* 0x1E */
1179     "VK_MODECHANGE",    /* 0x1F */
1180     "VK_SPACE",         /* 0x20 */
1181     "VK_PRIOR",         /* 0x21 */
1182     "VK_NEXT",          /* 0x22 */
1183     "VK_END",           /* 0x23 */
1184     "VK_HOME",          /* 0x24 */
1185     "VK_LEFT",          /* 0x25 */
1186     "VK_UP",            /* 0x26 */
1187     "VK_RIGHT",         /* 0x27 */
1188     "VK_DOWN",          /* 0x28 */
1189     "VK_SELECT",        /* 0x29 */
1190     "VK_PRINT",         /* 0x2A */
1191     "VK_EXECUTE",       /* 0x2B */
1192     "VK_SNAPSHOT",      /* 0x2C */
1193     "VK_INSERT",        /* 0x2D */
1194     "VK_DELETE",        /* 0x2E */
1195     "VK_HELP",          /* 0x2F */
1196     "VK_0",             /* 0x30 */
1197     "VK_1",             /* 0x31 */
1198     "VK_2",             /* 0x32 */
1199     "VK_3",             /* 0x33 */
1200     "VK_4",             /* 0x34 */
1201     "VK_5",             /* 0x35 */
1202     "VK_6",             /* 0x36 */
1203     "VK_7",             /* 0x37 */
1204     "VK_8",             /* 0x38 */
1205     "VK_9",             /* 0x39 */
1206     NULL,               /* 0x3A */
1207     NULL,               /* 0x3B */
1208     NULL,               /* 0x3C */
1209     NULL,               /* 0x3D */
1210     NULL,               /* 0x3E */
1211     NULL,               /* 0x3F */
1212     NULL,               /* 0x40 */
1213     "VK_A",             /* 0x41 */
1214     "VK_B",             /* 0x42 */
1215     "VK_C",             /* 0x43 */
1216     "VK_D",             /* 0x44 */
1217     "VK_E",             /* 0x45 */
1218     "VK_F",             /* 0x46 */
1219     "VK_G",             /* 0x47 */
1220     "VK_H",             /* 0x48 */
1221     "VK_I",             /* 0x49 */
1222     "VK_J",             /* 0x4A */
1223     "VK_K",             /* 0x4B */
1224     "VK_L",             /* 0x4C */
1225     "VK_M",             /* 0x4D */
1226     "VK_N",             /* 0x4E */
1227     "VK_O",             /* 0x4F */
1228     "VK_P",             /* 0x50 */
1229     "VK_Q",             /* 0x51 */
1230     "VK_R",             /* 0x52 */
1231     "VK_S",             /* 0x53 */
1232     "VK_T",             /* 0x54 */
1233     "VK_U",             /* 0x55 */
1234     "VK_V",             /* 0x56 */
1235     "VK_W",             /* 0x57 */
1236     "VK_X",             /* 0x58 */
1237     "VK_Y",             /* 0x59 */
1238     "VK_Z",             /* 0x5A */
1239     "VK_LWIN",          /* 0x5B */
1240     "VK_RWIN",          /* 0x5C */
1241     "VK_APPS",          /* 0x5D */
1242     NULL,               /* 0x5E */
1243     "VK_SLEEP",         /* 0x5F */
1244     "VK_NUMPAD0",       /* 0x60 */
1245     "VK_NUMPAD1",       /* 0x61 */
1246     "VK_NUMPAD2",       /* 0x62 */
1247     "VK_NUMPAD3",       /* 0x63 */
1248     "VK_NUMPAD4",       /* 0x64 */
1249     "VK_NUMPAD5",       /* 0x65 */
1250     "VK_NUMPAD6",       /* 0x66 */
1251     "VK_NUMPAD7",       /* 0x67 */
1252     "VK_NUMPAD8",       /* 0x68 */
1253     "VK_NUMPAD9",       /* 0x69 */
1254     "VK_MULTIPLY",      /* 0x6A */
1255     "VK_ADD",           /* 0x6B */
1256     "VK_SEPARATOR",     /* 0x6C */
1257     "VK_SUBTRACT",      /* 0x6D */
1258     "VK_DECIMAL",       /* 0x6E */
1259     "VK_DIVIDE",        /* 0x6F */
1260     "VK_F1",            /* 0x70 */
1261     "VK_F2",            /* 0x71 */
1262     "VK_F3",            /* 0x72 */
1263     "VK_F4",            /* 0x73 */
1264     "VK_F5",            /* 0x74 */
1265     "VK_F6",            /* 0x75 */
1266     "VK_F7",            /* 0x76 */
1267     "VK_F8",            /* 0x77 */
1268     "VK_F9",            /* 0x78 */
1269     "VK_F10",           /* 0x79 */
1270     "VK_F11",           /* 0x7A */
1271     "VK_F12",           /* 0x7B */
1272     "VK_F13",           /* 0x7C */
1273     "VK_F14",           /* 0x7D */
1274     "VK_F15",           /* 0x7E */
1275     "VK_F16",           /* 0x7F */
1276     "VK_F17",           /* 0x80 */
1277     "VK_F18",           /* 0x81 */
1278     "VK_F19",           /* 0x82 */
1279     "VK_F20",           /* 0x83 */
1280     "VK_F21",           /* 0x84 */
1281     "VK_F22",           /* 0x85 */
1282     "VK_F23",           /* 0x86 */
1283     "VK_F24",           /* 0x87 */
1284     NULL,               /* 0x88 */
1285     NULL,               /* 0x89 */
1286     NULL,               /* 0x8A */
1287     NULL,               /* 0x8B */
1288     NULL,               /* 0x8C */
1289     NULL,               /* 0x8D */
1290     NULL,               /* 0x8E */
1291     NULL,               /* 0x8F */
1292     "VK_NUMLOCK",       /* 0x90 */
1293     "VK_SCROLL",        /* 0x91 */
1294     "VK_OEM_NEC_EQUAL",       /* 0x92 aka. VK_OEM_FJ_JISHO */
1295     "VK_OEM_FJ_MASSHOU",      /* 0x93 */
1296     "VK_OEM_FJ_TOUROKU",      /* 0x94 */
1297     "VK_OEM_FJ_LOYA",         /* 0x95 */
1298     "VK_OEM_FJ_ROYA",         /* 0x96 */
1299     NULL,               /* 0x97 */
1300     NULL,               /* 0x98 */
1301     NULL,               /* 0x99 */
1302     NULL,               /* 0x9A */
1303     NULL,               /* 0x9B */
1304     NULL,               /* 0x9C */
1305     NULL,               /* 0x9D */
1306     NULL,               /* 0x9E */
1307     NULL,               /* 0x9F */
1308     "VK_LSHIFT",        /* 0xA0 */
1309     "VK_RSHIFT",        /* 0xA1 */
1310     "VK_LCONTROL",      /* 0xA2 */
1311     "VK_RCONTROL",      /* 0xA3 */
1312     "VK_LMENU",         /* 0xA4 */
1313     "VK_RMENU",         /* 0xA5 */
1314     "VK_BROWSER_BACK",        /* 0xA6 */
1315     "VK_BROWSER_FORWARD",     /* 0xA7 */
1316     "VK_BROWSER_REFRESH",     /* 0xA8 */
1317     "VK_BROWSER_STOP",        /* 0xA9 */
1318     "VK_BROWSER_SEARCH",      /* 0xAA */
1319     "VK_BROWSER_FAVORITES",   /* 0xAB */
1320     "VK_BROWSER_HOME",        /* 0xAC */
1321     "VK_VOLUME_MUTE",         /* 0xAD */
1322     "VK_VOLUME_DOWN",         /* 0xAE */
1323     "VK_VOLUME_UP",           /* 0xAF */
1324     "VK_MEDIA_NEXT_TRACK",    /* 0xB0 */
1325     "VK_MEDIA_PREV_TRACK",    /* 0xB1 */
1326     "VK_MEDIA_STOP",          /* 0xB2 */
1327     "VK_MEDIA_PLAY_PAUSE",    /* 0xB3 */
1328     "VK_LAUNCH_MAIL",         /* 0xB4 */
1329     "VK_LAUNCH_MEDIA_SELECT", /* 0xB5 */
1330     "VK_LAUNCH_APP1",         /* 0xB6 */
1331     "VK_LAUNCH_APP2",         /* 0xB7 */
1332     NULL,               /* 0xB8 */
1333     NULL,               /* 0xB9 */
1334     "VK_OEM_1",         /* 0xBA */
1335     "VK_OEM_PLUS",      /* 0xBB */
1336     "VK_OEM_COMMA",     /* 0xBC */
1337     "VK_OEM_MINUS",     /* 0xBD */
1338     "VK_OEM_PERIOD",    /* 0xBE */
1339     "VK_OEM_2",         /* 0xBF */
1340     "VK_OEM_3",         /* 0xC0 */
1341     NULL,               /* 0xC1 */
1342     NULL,               /* 0xC2 */
1343     NULL,               /* 0xC3 */
1344     NULL,               /* 0xC4 */
1345     NULL,               /* 0xC5 */
1346     NULL,               /* 0xC6 */
1347     NULL,               /* 0xC7 */
1348     NULL,               /* 0xC8 */
1349     NULL,               /* 0xC9 */
1350     NULL,               /* 0xCA */
1351     NULL,               /* 0xCB */
1352     NULL,               /* 0xCC */
1353     NULL,               /* 0xCD */
1354     NULL,               /* 0xCE */
1355     NULL,               /* 0xCF */
1356     NULL,               /* 0xD0 */
1357     NULL,               /* 0xD1 */
1358     NULL,               /* 0xD2 */
1359     NULL,               /* 0xD3 */
1360     NULL,               /* 0xD4 */
1361     NULL,               /* 0xD5 */
1362     NULL,               /* 0xD6 */
1363     NULL,               /* 0xD7 */
1364     NULL,               /* 0xD8 */
1365     NULL,               /* 0xD9 */
1366     NULL,               /* 0xDA */
1367     "VK_OEM_4",         /* 0xDB */
1368     "VK_OEM_5",         /* 0xDC */
1369     "VK_OEM_6",         /* 0xDD */
1370     "VK_OEM_7",         /* 0xDE */
1371     "VK_OEM_8",         /* 0xDF */
1372     NULL,               /* 0xE0 */
1373     "VK_OEM_AX",        /* 0xE1 */
1374     "VK_OEM_102",       /* 0xE2 */
1375     "VK_ICO_HELP",      /* 0xE3 */
1376     "VK_ICO_00",        /* 0xE4 */
1377     "VK_PROCESSKEY",    /* 0xE5 */
1378     NULL,               /* 0xE6 */
1379     "VK_PACKET",        /* 0xE7 */
1380     NULL,               /* 0xE8 */
1381     NULL,               /* 0xE9 */
1382     NULL,               /* 0xEA */
1383     NULL,               /* 0xEB */
1384     NULL,               /* 0xEC */
1385     NULL,               /* 0xED */
1386     NULL,               /* 0xEE */
1387     NULL,               /* 0xEF */
1388     NULL,               /* 0xF0 */
1389     NULL,               /* 0xF1 */
1390     NULL,               /* 0xF2 */
1391     NULL,               /* 0xF3 */
1392     NULL,               /* 0xF4 */
1393     NULL,               /* 0xF5 */
1394     "VK_ATTN",          /* 0xF6 */
1395     "VK_CRSEL",         /* 0xF7 */
1396     "VK_EXSEL",         /* 0xF8 */
1397     "VK_EREOF",         /* 0xF9 */
1398     "VK_PLAY",          /* 0xFA */
1399     "VK_ZOOM",          /* 0xFB */
1400     "VK_NONAME",        /* 0xFC */
1401     "VK_PA1",           /* 0xFD */
1402     "VK_OEM_CLEAR",     /* 0xFE */
1403     NULL                /* 0xFF */
1404 };
1405
1406
1407 /************************************************************************/
1408
1409
1410 /* WM_USER+n message values for "common controls" */
1411
1412 typedef struct
1413 {
1414     const char *name;      /* name of control message           */
1415     UINT        value;     /* message number (0x0401-0x0fff     */
1416     UINT        len;       /* length of space at lParam to dump */
1417 } USER_MSG;
1418
1419
1420 typedef struct
1421 {
1422 const WCHAR      *classname;  /* class name to match                  */
1423 const USER_MSG   *classmsg;   /* pointer to first USER_MSG for class  */
1424 const USER_MSG   *lastmsg;    /* pointer to last USER_MSG for class   */
1425 } CONTROL_CLASS;
1426
1427 #define USM(a,b) { #a ,a,b}
1428 #define SZOF(a)  sizeof(a)
1429
1430 /* To dump memory at the lParam for any of these messages,  */
1431 /* replace the "0" with a "SZOF(structure)", or with a      */
1432 /* number. (First method preferred.)                         */
1433
1434 #define RB_GETBANDINFO_OLD (WM_USER+5) /* obsoleted after IE3, but we have to support it anyway */
1435
1436 static const USER_MSG rebar_array[] = {
1437           USM(RB_INSERTBANDA,          0),
1438           USM(RB_DELETEBAND,           0),
1439           USM(RB_GETBARINFO,           0),
1440           USM(RB_SETBARINFO,           0),
1441           USM(RB_GETBANDINFO_OLD,      0),
1442           USM(RB_SETBANDINFOA,         0),
1443           USM(RB_SETPARENT,            0),
1444           USM(RB_HITTEST,              0),
1445           USM(RB_GETRECT,              0),
1446           USM(RB_INSERTBANDW,          0),
1447           USM(RB_SETBANDINFOW,         0),
1448           USM(RB_GETBANDCOUNT,         0),
1449           USM(RB_GETROWCOUNT,          0),
1450           USM(RB_GETROWHEIGHT,         0),
1451           USM(RB_IDTOINDEX,            0),
1452           USM(RB_GETTOOLTIPS,          0),
1453           USM(RB_SETTOOLTIPS,          0),
1454           USM(RB_SETBKCOLOR,           0),
1455           USM(RB_GETBKCOLOR,           0),
1456           USM(RB_SETTEXTCOLOR,         0),
1457           USM(RB_GETTEXTCOLOR,         0),
1458           USM(RB_SIZETORECT,           0),
1459           USM(RB_BEGINDRAG,            0),
1460           USM(RB_ENDDRAG,              0),
1461           USM(RB_DRAGMOVE,             0),
1462           USM(RB_GETBARHEIGHT,         0),
1463           USM(RB_GETBANDINFOW,         0),
1464           USM(RB_GETBANDINFOA,         0),
1465           USM(RB_MINIMIZEBAND,         0),
1466           USM(RB_MAXIMIZEBAND,         0),
1467           USM(RB_GETBANDBORDERS,       0),
1468           USM(RB_SHOWBAND,             0),
1469           USM(RB_SETPALETTE,           0),
1470           USM(RB_GETPALETTE,           0),
1471           USM(RB_MOVEBAND,             0),
1472           {0,0,0} };
1473
1474 static const USER_MSG toolbar_array[] = {
1475           USM(TB_ENABLEBUTTON          ,0),
1476           USM(TB_CHECKBUTTON           ,0),
1477           USM(TB_PRESSBUTTON           ,0),
1478           USM(TB_HIDEBUTTON            ,0),
1479           USM(TB_INDETERMINATE         ,0),
1480           USM(TB_MARKBUTTON            ,0),
1481           USM(TB_ISBUTTONENABLED       ,0),
1482           USM(TB_ISBUTTONCHECKED       ,0),
1483           USM(TB_ISBUTTONPRESSED       ,0),
1484           USM(TB_ISBUTTONHIDDEN        ,0),
1485           USM(TB_ISBUTTONINDETERMINATE ,0),
1486           USM(TB_ISBUTTONHIGHLIGHTED   ,0),
1487           USM(TB_SETSTATE              ,0),
1488           USM(TB_GETSTATE              ,0),
1489           USM(TB_ADDBITMAP             ,0),
1490           USM(TB_ADDBUTTONSA           ,0),
1491           USM(TB_INSERTBUTTONA         ,0),
1492           USM(TB_DELETEBUTTON          ,0),
1493           USM(TB_GETBUTTON             ,0),
1494           USM(TB_BUTTONCOUNT           ,0),
1495           USM(TB_COMMANDTOINDEX        ,0),
1496           USM(TB_SAVERESTOREA          ,0),
1497           USM(TB_CUSTOMIZE             ,0),
1498           USM(TB_ADDSTRINGA            ,0),
1499           USM(TB_GETITEMRECT           ,0),
1500           USM(TB_BUTTONSTRUCTSIZE      ,0),
1501           USM(TB_SETBUTTONSIZE         ,0),
1502           USM(TB_SETBITMAPSIZE         ,0),
1503           USM(TB_AUTOSIZE              ,0),
1504           USM(TB_GETTOOLTIPS           ,0),
1505           USM(TB_SETTOOLTIPS           ,0),
1506           USM(TB_SETPARENT             ,0),
1507           USM(TB_SETROWS               ,0),
1508           USM(TB_GETROWS               ,0),
1509           USM(TB_GETBITMAPFLAGS        ,0),
1510           USM(TB_SETCMDID              ,0),
1511           USM(TB_CHANGEBITMAP          ,0),
1512           USM(TB_GETBITMAP             ,0),
1513           USM(TB_GETBUTTONTEXTA        ,0),
1514           USM(TB_REPLACEBITMAP         ,0),
1515           USM(TB_SETINDENT             ,0),
1516           USM(TB_SETIMAGELIST          ,0),
1517           USM(TB_GETIMAGELIST          ,0),
1518           USM(TB_LOADIMAGES            ,0),
1519           USM(TB_GETRECT               ,0),
1520           USM(TB_SETHOTIMAGELIST       ,0),
1521           USM(TB_GETHOTIMAGELIST       ,0),
1522           USM(TB_SETDISABLEDIMAGELIST  ,0),
1523           USM(TB_GETDISABLEDIMAGELIST  ,0),
1524           USM(TB_SETSTYLE              ,0),
1525           USM(TB_GETSTYLE              ,0),
1526           USM(TB_GETBUTTONSIZE         ,0),
1527           USM(TB_SETBUTTONWIDTH        ,0),
1528           USM(TB_SETMAXTEXTROWS        ,0),
1529           USM(TB_GETTEXTROWS           ,0),
1530           USM(TB_GETOBJECT             ,0),
1531           USM(TB_GETBUTTONINFOW        ,0),
1532           USM(TB_SETBUTTONINFOW        ,0),
1533           USM(TB_GETBUTTONINFOA        ,0),
1534           USM(TB_SETBUTTONINFOA        ,0),
1535           USM(TB_INSERTBUTTONW         ,0),
1536           USM(TB_ADDBUTTONSW           ,0),
1537           USM(TB_HITTEST               ,0),
1538           USM(TB_SETDRAWTEXTFLAGS      ,0),
1539           USM(TB_GETHOTITEM            ,0),
1540           USM(TB_SETHOTITEM            ,0),
1541           USM(TB_SETANCHORHIGHLIGHT    ,0),
1542           USM(TB_GETANCHORHIGHLIGHT    ,0),
1543           USM(TB_GETBUTTONTEXTW        ,0),
1544           USM(TB_SAVERESTOREW          ,0),
1545           USM(TB_ADDSTRINGW            ,0),
1546           USM(TB_MAPACCELERATORA       ,0),
1547           USM(TB_GETINSERTMARK         ,0),
1548           USM(TB_SETINSERTMARK         ,0),
1549           USM(TB_INSERTMARKHITTEST     ,0),
1550           USM(TB_MOVEBUTTON            ,0),
1551           USM(TB_GETMAXSIZE            ,0),
1552           USM(TB_SETEXTENDEDSTYLE      ,0),
1553           USM(TB_GETEXTENDEDSTYLE      ,0),
1554           USM(TB_GETPADDING            ,0),
1555           USM(TB_SETPADDING            ,0),
1556           USM(TB_SETINSERTMARKCOLOR    ,0),
1557           USM(TB_GETINSERTMARKCOLOR    ,0),
1558           USM(TB_MAPACCELERATORW       ,0),
1559           USM(TB_GETSTRINGW            ,0),
1560           USM(TB_GETSTRINGA            ,0),
1561           USM(TB_UNKWN45D              ,8),
1562           USM(TB_SETHOTITEM2           ,0),
1563           USM(TB_SETLISTGAP            ,0),
1564           USM(TB_GETIMAGELISTCOUNT     ,0),
1565           USM(TB_GETIDEALSIZE          ,8),
1566           USM(TB_UNKWN464              ,0),
1567           {0,0,0} };
1568
1569 static const USER_MSG tooltips_array[] = {
1570           USM(TTM_ACTIVATE             ,0),
1571           USM(TTM_SETDELAYTIME         ,0),
1572           USM(TTM_ADDTOOLA             ,0),
1573           USM(TTM_DELTOOLA             ,0),
1574           USM(TTM_NEWTOOLRECTA         ,0),
1575           USM(TTM_RELAYEVENT           ,0),
1576           USM(TTM_GETTOOLINFOA         ,0),
1577           USM(TTM_HITTESTA             ,0),
1578           USM(TTM_GETTEXTA             ,0),
1579           USM(TTM_UPDATETIPTEXTA       ,0),
1580           USM(TTM_GETTOOLCOUNT         ,0),
1581           USM(TTM_ENUMTOOLSA           ,0),
1582           USM(TTM_GETCURRENTTOOLA      ,0),
1583           USM(TTM_WINDOWFROMPOINT      ,0),
1584           USM(TTM_TRACKACTIVATE        ,0),
1585           USM(TTM_TRACKPOSITION        ,0),
1586           USM(TTM_SETTIPBKCOLOR        ,0),
1587           USM(TTM_SETTIPTEXTCOLOR      ,0),
1588           USM(TTM_GETDELAYTIME         ,0),
1589           USM(TTM_GETTIPBKCOLOR        ,0),
1590           USM(TTM_GETTIPTEXTCOLOR      ,0),
1591           USM(TTM_SETMAXTIPWIDTH       ,0),
1592           USM(TTM_GETMAXTIPWIDTH       ,0),
1593           USM(TTM_SETMARGIN            ,0),
1594           USM(TTM_GETMARGIN            ,0),
1595           USM(TTM_POP                  ,0),
1596           USM(TTM_UPDATE               ,0),
1597           USM(TTM_GETBUBBLESIZE        ,0),
1598           USM(TTM_ADDTOOLW             ,0),
1599           USM(TTM_DELTOOLW             ,0),
1600           USM(TTM_NEWTOOLRECTW         ,0),
1601           USM(TTM_GETTOOLINFOW         ,0),
1602           USM(TTM_SETTOOLINFOW         ,0),
1603           USM(TTM_HITTESTW             ,0),
1604           USM(TTM_GETTEXTW             ,0),
1605           USM(TTM_UPDATETIPTEXTW       ,0),
1606           USM(TTM_ENUMTOOLSW           ,0),
1607           USM(TTM_GETCURRENTTOOLW      ,0),
1608           {0,0,0} };
1609
1610 static const USER_MSG comboex_array[] = {
1611           USM(CBEM_INSERTITEMA        ,0),
1612           USM(CBEM_SETIMAGELIST       ,0),
1613           USM(CBEM_GETIMAGELIST       ,0),
1614           USM(CBEM_GETITEMA           ,0),
1615           USM(CBEM_SETITEMA           ,0),
1616           USM(CBEM_GETCOMBOCONTROL    ,0),
1617           USM(CBEM_GETEDITCONTROL     ,0),
1618           USM(CBEM_SETEXSTYLE         ,0),
1619           USM(CBEM_GETEXTENDEDSTYLE   ,0),
1620           USM(CBEM_HASEDITCHANGED     ,0),
1621           USM(CBEM_INSERTITEMW        ,0),
1622           USM(CBEM_SETITEMW           ,0),
1623           USM(CBEM_GETITEMW           ,0),
1624           USM(CBEM_SETEXTENDEDSTYLE   ,0),
1625           {0,0,0} };
1626
1627 static const USER_MSG propsht_array[] = {
1628           USM(PSM_SETCURSEL           ,0),
1629           USM(PSM_REMOVEPAGE          ,0),
1630           USM(PSM_ADDPAGE             ,0),
1631           USM(PSM_CHANGED             ,0),
1632           USM(PSM_RESTARTWINDOWS      ,0),
1633           USM(PSM_REBOOTSYSTEM        ,0),
1634           USM(PSM_CANCELTOCLOSE       ,0),
1635           USM(PSM_QUERYSIBLINGS       ,0),
1636           USM(PSM_UNCHANGED           ,0),
1637           USM(PSM_APPLY               ,0),
1638           USM(PSM_SETTITLEA           ,0),
1639           USM(PSM_SETWIZBUTTONS       ,0),
1640           USM(PSM_PRESSBUTTON         ,0),
1641           USM(PSM_SETCURSELID         ,0),
1642           USM(PSM_SETFINISHTEXTA      ,0),
1643           USM(PSM_GETTABCONTROL       ,0),
1644           USM(PSM_ISDIALOGMESSAGE     ,0),
1645           USM(PSM_GETCURRENTPAGEHWND  ,0),
1646           USM(PSM_SETTITLEW           ,0),
1647           USM(PSM_SETFINISHTEXTW      ,0),
1648           {0,0,0} };
1649 static const WCHAR PropSheetInfoStr[] =
1650     {'P','r','o','p','e','r','t','y','S','h','e','e','t','I','n','f','o',0 };
1651
1652 static const USER_MSG updown_array[] = {
1653           USM(UDM_SETRANGE            ,0),
1654           USM(UDM_GETRANGE            ,0),
1655           USM(UDM_SETPOS              ,0),
1656           USM(UDM_GETPOS              ,0),
1657           USM(UDM_SETBUDDY            ,0),
1658           USM(UDM_GETBUDDY            ,0),
1659           USM(UDM_SETACCEL            ,0),
1660           USM(UDM_GETACCEL            ,0),
1661           USM(UDM_SETBASE             ,0),
1662           USM(UDM_GETBASE             ,0),
1663           USM(UDM_SETRANGE32          ,0),
1664           USM(UDM_GETRANGE32          ,0),
1665           USM(UDM_SETPOS32            ,0),
1666           USM(UDM_GETPOS32            ,0),
1667           {0,0,0} };
1668
1669 /* generated from:
1670  * $ for i in `grep EM_ include/richedit.h | cut -d' ' -f2 | cut -f1`; do echo -e "          USM($i\t\t,0),"; done
1671  */
1672 static const USER_MSG richedit_array[] = {
1673           {"EM_SCROLLCARET", WM_USER+49 ,0},
1674           USM(EM_CANPASTE               ,0),
1675           USM(EM_DISPLAYBAND            ,0),
1676           USM(EM_EXGETSEL               ,0),
1677           USM(EM_EXLIMITTEXT            ,0),
1678           USM(EM_EXLINEFROMCHAR         ,0),
1679           USM(EM_EXSETSEL               ,0),
1680           USM(EM_FINDTEXT               ,0),
1681           USM(EM_FORMATRANGE            ,0),
1682           USM(EM_GETCHARFORMAT          ,0),
1683           USM(EM_GETEVENTMASK           ,0),
1684           USM(EM_GETOLEINTERFACE        ,0),
1685           USM(EM_GETPARAFORMAT          ,0),
1686           USM(EM_GETSELTEXT             ,0),
1687           USM(EM_HIDESELECTION          ,0),
1688           USM(EM_PASTESPECIAL           ,0),
1689           USM(EM_REQUESTRESIZE          ,0),
1690           USM(EM_SELECTIONTYPE          ,0),
1691           USM(EM_SETBKGNDCOLOR          ,0),
1692           USM(EM_SETCHARFORMAT          ,0),
1693           USM(EM_SETEVENTMASK           ,0),
1694           USM(EM_SETOLECALLBACK         ,0),
1695           USM(EM_SETPARAFORMAT          ,0),
1696           USM(EM_SETTARGETDEVICE        ,0),
1697           USM(EM_STREAMIN               ,0),
1698           USM(EM_STREAMOUT              ,0),
1699           USM(EM_GETTEXTRANGE           ,0),
1700           USM(EM_FINDWORDBREAK          ,0),
1701           USM(EM_SETOPTIONS             ,0),
1702           USM(EM_GETOPTIONS             ,0),
1703           USM(EM_FINDTEXTEX             ,0),
1704           USM(EM_GETWORDBREAKPROCEX     ,0),
1705           USM(EM_SETWORDBREAKPROCEX     ,0),
1706           USM(EM_SETUNDOLIMIT           ,0),
1707           USM(EM_REDO                   ,0),
1708           USM(EM_CANREDO                ,0),
1709           USM(EM_GETUNDONAME            ,0),
1710           USM(EM_GETREDONAME            ,0),
1711           USM(EM_STOPGROUPTYPING        ,0),
1712           USM(EM_SETTEXTMODE            ,0),
1713           USM(EM_GETTEXTMODE            ,0),
1714           USM(EM_AUTOURLDETECT          ,0),
1715           USM(EM_GETAUTOURLDETECT       ,0),
1716           USM(EM_SETPALETTE             ,0),
1717           USM(EM_GETTEXTEX              ,0),
1718           USM(EM_GETTEXTLENGTHEX        ,0),
1719           USM(EM_SHOWSCROLLBAR          ,0),
1720           USM(EM_SETTEXTEX              ,0),
1721           USM(EM_SETPUNCTUATION         ,0),
1722           USM(EM_GETPUNCTUATION         ,0),
1723           USM(EM_SETWORDWRAPMODE        ,0),
1724           USM(EM_GETWORDWRAPMODE        ,0),
1725           USM(EM_SETIMECOLOR            ,0),
1726           USM(EM_GETIMECOLOR            ,0),
1727           USM(EM_SETIMEOPTIONS          ,0),
1728           USM(EM_GETIMEOPTIONS          ,0),
1729           USM(EM_CONVPOSITION           ,0),
1730           USM(EM_SETLANGOPTIONS         ,0),
1731           USM(EM_GETLANGOPTIONS         ,0),
1732           USM(EM_GETIMECOMPMODE         ,0),
1733           USM(EM_FINDTEXTW              ,0),
1734           USM(EM_FINDTEXTEXW            ,0),
1735           USM(EM_RECONVERSION           ,0),
1736           USM(EM_SETIMEMODEBIAS         ,0),
1737           USM(EM_GETIMEMODEBIAS         ,0),
1738           USM(EM_SETBIDIOPTIONS         ,0),
1739           USM(EM_GETBIDIOPTIONS         ,0),
1740           USM(EM_SETTYPOGRAPHYOPTIONS   ,0),
1741           USM(EM_GETTYPOGRAPHYOPTIONS   ,0),
1742           USM(EM_SETEDITSTYLE           ,0),
1743           USM(EM_GETEDITSTYLE           ,0),
1744           USM(EM_OUTLINE                ,0),
1745           USM(EM_GETSCROLLPOS           ,0),
1746           USM(EM_SETSCROLLPOS           ,0),
1747           USM(EM_SETFONTSIZE            ,0),
1748           USM(EM_GETZOOM                ,0),
1749           USM(EM_SETZOOM                ,0),
1750           {0,0,0} };
1751
1752 #undef SZOF
1753 #undef USM
1754
1755 static CONTROL_CLASS  cc_array[] = {
1756     {WC_COMBOBOXEXW,    comboex_array,  0},
1757     {WC_PROPSHEETW,     propsht_array,  0},
1758     {REBARCLASSNAMEW,   rebar_array,    0},
1759     {TOOLBARCLASSNAMEW, toolbar_array,  0},
1760     {TOOLTIPS_CLASSW,   tooltips_array, 0},
1761     {UPDOWN_CLASSW,     updown_array,   0},
1762     {RICHEDIT_CLASS20W, richedit_array, 0},
1763     {0, 0, 0} };
1764
1765
1766 /************************************************************************/
1767
1768
1769 /* WM_NOTIFY function codes display */
1770
1771 typedef struct
1772 {
1773     const char *name;     /* name of notify message        */
1774     UINT        value;     /* notify code value             */
1775     UINT        len;       /* length of extra space to dump */
1776 } SPY_NOTIFY;
1777
1778 #define SPNFY(a,b) { #a ,a,sizeof(b)-sizeof(NMHDR)}
1779
1780 /* Array MUST be in descending order by the 'value' field  */
1781 /* (since value is UNSIGNED, 0xffffffff is largest and     */
1782 /*  0xfffffffe is smaller). A binary search is used to     */
1783 /* locate the correct 'value'.                             */
1784 static const SPY_NOTIFY spnfy_array[] = {
1785     /*  common        0U       to  0U-99U  */
1786     SPNFY(NM_OUTOFMEMORY,        NMHDR),
1787     SPNFY(NM_CLICK,              NMHDR),
1788     SPNFY(NM_DBLCLK,             NMHDR),
1789     SPNFY(NM_RETURN,             NMHDR),
1790     SPNFY(NM_RCLICK,             NMHDR),
1791     SPNFY(NM_RDBLCLK,            NMHDR),
1792     SPNFY(NM_SETFOCUS,           NMHDR),
1793     SPNFY(NM_KILLFOCUS,          NMHDR),
1794     SPNFY(NM_CUSTOMDRAW,         NMCUSTOMDRAW),
1795     SPNFY(NM_HOVER,              NMHDR),
1796     SPNFY(NM_NCHITTEST,          NMMOUSE),
1797     SPNFY(NM_KEYDOWN,            NMKEY),
1798     SPNFY(NM_RELEASEDCAPTURE,    NMHDR),
1799     SPNFY(NM_SETCURSOR,          NMMOUSE),
1800     SPNFY(NM_CHAR,               NMCHAR),
1801     SPNFY(NM_TOOLTIPSCREATED,    NMTOOLTIPSCREATED),
1802     /* Listview       0U-100U  to  0U-199U  */
1803     SPNFY(LVN_ITEMCHANGING,      NMLISTVIEW),
1804     SPNFY(LVN_ITEMCHANGED,       NMLISTVIEW),
1805     SPNFY(LVN_INSERTITEM,        NMLISTVIEW),
1806     SPNFY(LVN_DELETEITEM,        NMLISTVIEW),
1807     SPNFY(LVN_DELETEALLITEMS,    NMLISTVIEW),
1808     SPNFY(LVN_BEGINLABELEDITA,   NMLVDISPINFOA),
1809     SPNFY(LVN_ENDLABELEDITA,     NMLVDISPINFOA),
1810     SPNFY(LVN_COLUMNCLICK,       NMLISTVIEW),
1811     SPNFY(LVN_BEGINDRAG,         NMLISTVIEW),
1812     SPNFY(LVN_BEGINRDRAG,        NMLISTVIEW),
1813     SPNFY(LVN_ODCACHEHINT,       NMLVCACHEHINT),
1814     SPNFY(LVN_ITEMACTIVATE,      NMITEMACTIVATE),
1815     SPNFY(LVN_ODSTATECHANGED,    NMLVODSTATECHANGE),
1816     SPNFY(LVN_HOTTRACK,          NMLISTVIEW),
1817     SPNFY(LVN_GETDISPINFOA,      NMLVDISPINFOA),
1818     SPNFY(LVN_SETDISPINFOA,      NMLVDISPINFOA),
1819     SPNFY(LVN_ODFINDITEMA,       NMLVFINDITEMA),
1820     SPNFY(LVN_KEYDOWN,           NMLVKEYDOWN),
1821     SPNFY(LVN_MARQUEEBEGIN,      NMLISTVIEW),
1822     SPNFY(LVN_GETINFOTIPA,       NMLVGETINFOTIPA),
1823     SPNFY(LVN_GETINFOTIPW,       NMLVGETINFOTIPW),
1824     SPNFY(LVN_BEGINLABELEDITW,   NMLVDISPINFOW),
1825     SPNFY(LVN_ENDLABELEDITW,     NMLVDISPINFOW),
1826     SPNFY(LVN_GETDISPINFOW,      NMLVDISPINFOW),
1827     SPNFY(LVN_SETDISPINFOW,      NMLVDISPINFOW),
1828     SPNFY(LVN_ODFINDITEMW,       NMLVFINDITEMW),
1829     /* PropertySheet  0U-200U  to  0U-299U  */
1830     SPNFY(PSN_SETACTIVE,         PSHNOTIFY),
1831     SPNFY(PSN_KILLACTIVE,        PSHNOTIFY),
1832     SPNFY(PSN_APPLY,             PSHNOTIFY),
1833     SPNFY(PSN_RESET,             PSHNOTIFY),
1834     SPNFY(PSN_HELP,              PSHNOTIFY),
1835     SPNFY(PSN_WIZBACK,           PSHNOTIFY),
1836     SPNFY(PSN_WIZNEXT,           PSHNOTIFY),
1837     SPNFY(PSN_WIZFINISH,         PSHNOTIFY),
1838     SPNFY(PSN_QUERYCANCEL,       PSHNOTIFY),
1839     SPNFY(PSN_GETOBJECT,         NMOBJECTNOTIFY),
1840     SPNFY(PSN_TRANSLATEACCELERATOR, PSHNOTIFY),
1841     SPNFY(PSN_QUERYINITIALFOCUS, PSHNOTIFY),
1842     /* Header         0U-300U  to  0U-399U  */
1843     SPNFY(HDN_ITEMCHANGINGA,     NMHEADERA),
1844     SPNFY(HDN_ITEMCHANGEDA,      NMHEADERA),
1845     SPNFY(HDN_ITEMCLICKA,        NMHEADERA),
1846     SPNFY(HDN_ITEMDBLCLICKA,     NMHEADERA),
1847     SPNFY(HDN_DIVIDERDBLCLICKA,  NMHEADERA),
1848     SPNFY(HDN_BEGINTRACKA,       NMHEADERA),
1849     SPNFY(HDN_ENDTRACKA,         NMHEADERA),
1850     SPNFY(HDN_TRACKA,            NMHEADERA),
1851     SPNFY(HDN_GETDISPINFOA,      NMHEADERA),
1852     SPNFY(HDN_BEGINDRAG,         NMHDR),
1853     SPNFY(HDN_ENDDRAG,           NMHDR),
1854     SPNFY(HDN_ITEMCHANGINGW,     NMHDR),
1855     SPNFY(HDN_ITEMCHANGEDW,      NMHDR),
1856     SPNFY(HDN_ITEMCLICKW,        NMHDR),
1857     SPNFY(HDN_ITEMDBLCLICKW,     NMHDR),
1858     SPNFY(HDN_DIVIDERDBLCLICKW,  NMHDR),
1859     SPNFY(HDN_BEGINTRACKW,       NMHDR),
1860     SPNFY(HDN_ENDTRACKW,         NMHDR),
1861     SPNFY(HDN_TRACKW,            NMHDR),
1862     SPNFY(HDN_GETDISPINFOW,      NMHDR),
1863     /* Treeview       0U-400U  to  0U-499U  */
1864     SPNFY(TVN_SELCHANGINGA,      NMTREEVIEWA),
1865     SPNFY(TVN_SELCHANGEDA,       NMTREEVIEWA),
1866     SPNFY(TVN_GETDISPINFOA,      NMTVDISPINFOA),
1867     SPNFY(TVN_SETDISPINFOA,      NMTVDISPINFOA),
1868     SPNFY(TVN_ITEMEXPANDINGA,    NMTREEVIEWA),
1869     SPNFY(TVN_ITEMEXPANDEDA,     NMTREEVIEWA),
1870     SPNFY(TVN_BEGINDRAGA,        NMTREEVIEWA),
1871     SPNFY(TVN_BEGINRDRAGA,       NMTREEVIEWA),
1872     SPNFY(TVN_DELETEITEMA,       NMTREEVIEWA),
1873     SPNFY(TVN_BEGINLABELEDITA,   NMTVDISPINFOA),
1874     SPNFY(TVN_ENDLABELEDITA,     NMTVDISPINFOA),
1875     SPNFY(TVN_KEYDOWN,           NMTVKEYDOWN),
1876     SPNFY(TVN_SELCHANGINGW,      NMTREEVIEWW),
1877     SPNFY(TVN_SELCHANGEDW,       NMTREEVIEWW),
1878     SPNFY(TVN_GETDISPINFOW,      NMTVDISPINFOW),
1879     SPNFY(TVN_SETDISPINFOW,      NMTVDISPINFOW),
1880     SPNFY(TVN_ITEMEXPANDINGW,    NMTREEVIEWW),
1881     SPNFY(TVN_ITEMEXPANDEDW,     NMTREEVIEWW),
1882     SPNFY(TVN_BEGINDRAGW,        NMTREEVIEWW),
1883     SPNFY(TVN_BEGINRDRAGW,       NMTREEVIEWW),
1884     SPNFY(TVN_DELETEITEMW,       NMTREEVIEWW),
1885     SPNFY(TVN_BEGINLABELEDITW,   NMTVDISPINFOW),
1886     SPNFY(TVN_ENDLABELEDITW,     NMTVDISPINFOW),
1887     /* Tooltips       0U-520U  to  0U-549U  */
1888     SPNFY(TTN_GETDISPINFOA,      NMHDR),
1889     SPNFY(TTN_SHOW,              NMHDR),
1890     SPNFY(TTN_POP,               NMHDR),
1891     SPNFY(TTN_GETDISPINFOW,      NMHDR),
1892     /* Tab            0U-550U  to  0U-580U  */
1893     SPNFY(TCN_KEYDOWN,           NMHDR),
1894     SPNFY(TCN_SELCHANGE,         NMHDR),
1895     SPNFY(TCN_SELCHANGING,       NMHDR),
1896     SPNFY(TCN_GETOBJECT,         NMHDR),
1897     /* Common Dialog  0U-601U  to  0U-699U  */
1898     SPNFY(CDN_INITDONE,          OFNOTIFYA),
1899     SPNFY(CDN_SELCHANGE,         OFNOTIFYA),
1900     SPNFY(CDN_FOLDERCHANGE,      OFNOTIFYA),
1901     SPNFY(CDN_SHAREVIOLATION,    OFNOTIFYA),
1902     SPNFY(CDN_HELP,              OFNOTIFYA),
1903     SPNFY(CDN_FILEOK,            OFNOTIFYA),
1904     SPNFY(CDN_TYPECHANGE,        OFNOTIFYA),
1905     /* Toolbar        0U-700U  to  0U-720U  */
1906     SPNFY(TBN_GETBUTTONINFOA,    NMTOOLBARA),
1907     SPNFY(TBN_BEGINDRAG,         NMTOOLBARA),
1908     SPNFY(TBN_ENDDRAG,           NMTOOLBARA),
1909     SPNFY(TBN_BEGINADJUST,       NMHDR),
1910     SPNFY(TBN_ENDADJUST,         NMHDR),
1911     SPNFY(TBN_RESET,             NMHDR),
1912     SPNFY(TBN_QUERYINSERT,       NMTOOLBARA),
1913     SPNFY(TBN_QUERYDELETE,       NMTOOLBARA),
1914     SPNFY(TBN_TOOLBARCHANGE,     NMHDR),
1915     SPNFY(TBN_CUSTHELP,          NMHDR),
1916     SPNFY(TBN_DROPDOWN,          NMTOOLBARA),
1917     SPNFY(TBN_GETOBJECT,         NMOBJECTNOTIFY),
1918     SPNFY(TBN_HOTITEMCHANGE,     NMTBHOTITEM),
1919     SPNFY(TBN_DRAGOUT,           NMTOOLBARA),
1920     SPNFY(TBN_DELETINGBUTTON,    NMTOOLBARA),
1921     SPNFY(TBN_GETDISPINFOA,      NMTBDISPINFOA),
1922     SPNFY(TBN_GETDISPINFOW,      NMTBDISPINFOW),
1923     SPNFY(TBN_GETINFOTIPA,       NMTBGETINFOTIPA),
1924     SPNFY(TBN_GETINFOTIPW,       NMTBGETINFOTIPW),
1925     SPNFY(TBN_GETBUTTONINFOW,    NMTOOLBARW),
1926     /* Up/Down        0U-721U  to  0U-740U  */
1927     SPNFY(UDN_DELTAPOS,          NM_UPDOWN),
1928     /* Month Calendar 0U-750U  to  0U-759U  */
1929     /* ******************* WARNING ***************************** */
1930     /* The following appear backwards but needs to be this way.  */
1931     /* The reason is that MS (and us) define the MCNs as         */
1932     /*         MCN_FIRST + n                                     */
1933     /* instead of the way ALL other notifications are            */
1934     /*         TBN_FIRST - n                                     */
1935     /* The only place that this is important is in this list     */
1936     /*                                                           */
1937     /* Also since the same error was made with the DTN_ items,   */
1938     /* they overlay the MCN_ and need to be inserted in the      */
1939     /* other section of the table so that it is in order for     */
1940     /* the binary search.                                        */
1941     /*                                                           */
1942     /* Thank you MS for your obvious quality control!!           */
1943     /* ******************* WARNING ***************************** */
1944     /* Date/Time      0U-760U  to  0U-799U  */
1945     /* SPNFY(MCN_SELECT,            NMHDR), */
1946     /* SPNFY(MCN_GETDAYSTATE,       NMHDR), */
1947     /* SPNFY(MCN_SELCHANGE,         NMHDR), */
1948     /* ******************* WARNING ***************************** */
1949     /* The following appear backwards but needs to be this way.  */
1950     /* The reason is that MS (and us) define the MCNs as         */
1951     /*         DTN_FIRST + n                                     */
1952     /* instead of the way ALL other notifications are            */
1953     /*         TBN_FIRST - n                                     */
1954     /* The only place that this is important is in this list     */
1955     /* ******************* WARNING ***************************** */
1956     SPNFY(DTN_FORMATQUERYW,      NMHDR),
1957     SPNFY(DTN_FORMATW,           NMHDR),
1958     SPNFY(DTN_WMKEYDOWNW,        NMHDR),
1959     SPNFY(DTN_USERSTRINGW,       NMHDR),
1960     SPNFY(MCN_SELECT,            NMHDR),
1961     SPNFY(MCN_GETDAYSTATE,       NMHDR),
1962     SPNFY(MCN_SELCHANGE,         NMHDR),
1963     SPNFY(DTN_CLOSEUP,           NMHDR),
1964     SPNFY(DTN_DROPDOWN,          NMHDR),
1965     SPNFY(DTN_FORMATQUERYA,      NMHDR),
1966     SPNFY(DTN_FORMATA,           NMHDR),
1967     SPNFY(DTN_WMKEYDOWNA,        NMHDR),
1968     SPNFY(DTN_USERSTRINGA,       NMHDR),
1969     SPNFY(DTN_DATETIMECHANGE,    NMHDR),
1970     /* ComboBoxEx     0U-800U  to  0U-830U  */
1971     SPNFY(CBEN_GETDISPINFOA,     NMCOMBOBOXEXA),
1972     SPNFY(CBEN_INSERTITEM,       NMCOMBOBOXEXA),
1973     SPNFY(CBEN_DELETEITEM,       NMCOMBOBOXEXA),
1974     SPNFY(CBEN_BEGINEDIT,        NMHDR),
1975     SPNFY(CBEN_ENDEDITA,         NMCBEENDEDITA),
1976     SPNFY(CBEN_ENDEDITW,         NMCBEENDEDITW),
1977     SPNFY(CBEN_GETDISPINFOW,     NMCOMBOBOXEXW),
1978     SPNFY(CBEN_DRAGBEGINA,       NMCBEDRAGBEGINA),
1979     SPNFY(CBEN_DRAGBEGINW,       NMCBEDRAGBEGINW),
1980     /* Rebar          0U-831U  to  0U-859U  */
1981     SPNFY(RBN_HEIGHTCHANGE,      NMHDR),
1982     SPNFY(RBN_GETOBJECT,         NMOBJECTNOTIFY),
1983     SPNFY(RBN_LAYOUTCHANGED,     NMHDR),
1984     SPNFY(RBN_AUTOSIZE,          NMRBAUTOSIZE),
1985     SPNFY(RBN_BEGINDRAG,         NMREBAR),
1986     SPNFY(RBN_ENDDRAG,           NMREBAR),
1987     SPNFY(RBN_DELETINGBAND,      NMREBAR),
1988     SPNFY(RBN_DELETEDBAND,       NMREBAR),
1989     SPNFY(RBN_CHILDSIZE,         NMREBARCHILDSIZE),
1990     /* IP address     0U-860U  to  0U-879U  */
1991     SPNFY(IPN_FIELDCHANGED,      NMHDR),
1992     /* Status bar     0U-880U  to  0U-899U  */
1993     SPNFY(SBN_SIMPLEMODECHANGE,  NMHDR),
1994     /* Pager          0U-900U  to  0U-950U  */
1995     SPNFY(PGN_SCROLL,            NMPGSCROLL),
1996     SPNFY(PGN_CALCSIZE,          NMPGCALCSIZE),
1997     {0,0,0}};
1998 static const SPY_NOTIFY *end_spnfy_array;     /* ptr to last good entry in array */
1999 #undef SPNFY
2000
2001
2002 static unsigned char SPY_Exclude[SPY_MAX_MSGNUM+1];
2003 static unsigned char SPY_ExcludeDWP = 0;
2004
2005 #define SPY_EXCLUDE(msg) \
2006     (SPY_Exclude[(msg) > SPY_MAX_MSGNUM ? SPY_MAX_MSGNUM : (msg)])
2007
2008
2009 typedef struct
2010 {
2011     UINT       msgnum;           /* message number */
2012     HWND       msg_hwnd;         /* window handle for message          */
2013     WPARAM     wParam;           /* message parameter                  */
2014     LPARAM     lParam;           /* message parameter                  */
2015     INT        data_len;         /* length of data to dump             */
2016     char       msg_name[60];     /* message name (see SPY_GetMsgName)  */
2017     WCHAR      wnd_class[60];    /* window class name (full)           */
2018     WCHAR      wnd_name[16];     /* window name for message            */
2019 } SPY_INSTANCE;
2020
2021 static int indent_tls_index;
2022
2023 /***********************************************************************
2024  *           get_indent_level
2025  */
2026 static inline INT_PTR get_indent_level(void)
2027 {
2028     return (INT_PTR)TlsGetValue( indent_tls_index );
2029 }
2030
2031
2032 /***********************************************************************
2033  *           set_indent_level
2034  */
2035 static inline void set_indent_level( INT_PTR level )
2036 {
2037     TlsSetValue( indent_tls_index, (void *)level );
2038 }
2039
2040
2041 /***********************************************************************
2042  *           SPY_GetMsgInternal
2043  */
2044 static const char *SPY_GetMsgInternal( UINT msg )
2045 {
2046     if (msg <= SPY_MAX_MSGNUM)
2047         return MessageTypeNames[msg];
2048
2049     if (msg >= LVM_FIRST && msg <= LVM_FIRST + SPY_MAX_LVMMSGNUM)
2050         return LVMMessageTypeNames[msg-LVM_FIRST];
2051
2052     if (msg >= TV_FIRST && msg <= TV_FIRST + SPY_MAX_TVMSGNUM)
2053         return TVMessageTypeNames[msg-TV_FIRST];
2054
2055     if (msg >= HDM_FIRST && msg <= HDM_FIRST + SPY_MAX_HDMMSGNUM)
2056         return HDMMessageTypeNames[msg-HDM_FIRST];
2057
2058     if (msg >= TCM_FIRST && msg <= TCM_FIRST + SPY_MAX_TCMMSGNUM)
2059         return TCMMessageTypeNames[msg-TCM_FIRST];
2060
2061     if (msg >= PGM_FIRST && msg <= PGM_FIRST + SPY_MAX_PGMMSGNUM)
2062         return PGMMessageTypeNames[msg-PGM_FIRST];
2063
2064     if (msg >= CCM_FIRST && msg <= CCM_FIRST + SPY_MAX_CCMMSGNUM)
2065         return CCMMessageTypeNames[msg-CCM_FIRST];
2066
2067     if (msg >= WM_WINE_DESTROYWINDOW && msg <= WM_WINE_DESTROYWINDOW + SPY_MAX_WINEMSGNUM)
2068         return WINEMessageTypeNames[msg-WM_WINE_DESTROYWINDOW];
2069
2070     return NULL;
2071 }
2072
2073 /***********************************************************************
2074  *           SPY_Bsearch_Msg
2075  */
2076 static const USER_MSG *SPY_Bsearch_Msg( const USER_MSG *first, const USER_MSG *last, UINT code)
2077 {
2078     INT count;
2079     const USER_MSG *test;
2080
2081     while (last >= first) {
2082         count = 1 + last - first;
2083         if (count < 3) {
2084 #if DEBUG_SPY
2085             TRACE("code=%d, f-value=%d, f-name=%s, l-value=%d, l-name=%s, l-len=%d,\n",
2086                code, first->value, first->name, last->value, last->name, last->len);
2087 #endif
2088             if (first->value == code) return first;
2089             if (last->value == code) return last;
2090             return NULL;
2091         }
2092         count = count / 2;
2093         test = first + count;
2094 #if DEBUG_SPY
2095         TRACE("first=%p, last=%p, test=%p, t-value=%d, code=%d, count=%d\n",
2096            first, last, test, test->value, code, count);
2097 #endif
2098         if (test->value == code) return test;
2099         if (test->value > code)
2100             last = test - 1;
2101         else
2102             first = test + 1;
2103     }
2104     return NULL;
2105 }
2106
2107 /***********************************************************************
2108  *           SPY_GetClassLongOffsetName
2109  *
2110  * Gets the name of a class long offset.
2111  */
2112 const char *SPY_GetClassLongOffsetName( INT offset )
2113 {
2114     INT index;
2115     if (offset < 0 && offset % 2 == 0 && ((index = -(offset + 8) / 2) <
2116         sizeof(ClassLongOffsetNames) / sizeof(*ClassLongOffsetNames)))
2117     {
2118         return ClassLongOffsetNames[index];
2119     }
2120
2121     return "?";
2122 }
2123
2124 /***********************************************************************
2125  *           SPY_GetClassName
2126  *
2127  *  Sets the value of "wnd_class" member of the instance structure.
2128  */
2129 static void SPY_GetClassName( SPY_INSTANCE *sp_e )
2130 {
2131     /* special code to detect a property sheet dialog   */
2132     if ((GetClassLongW(sp_e->msg_hwnd, GCW_ATOM) == WC_DIALOG) &&
2133         (GetPropW(sp_e->msg_hwnd, PropSheetInfoStr))) {
2134         strcpyW(sp_e->wnd_class, WC_PROPSHEETW);
2135     }
2136     else {
2137         GetClassNameW(sp_e->msg_hwnd, sp_e->wnd_class, sizeof(sp_e->wnd_class)/sizeof(WCHAR));
2138     }
2139 }
2140
2141 /***********************************************************************
2142  *           SPY_GetMsgStuff
2143  *
2144  *  Get message name and other information for dumping
2145  */
2146 static void SPY_GetMsgStuff( SPY_INSTANCE *sp_e )
2147 {
2148     const USER_MSG *p;
2149     const char *msg_name = SPY_GetMsgInternal( sp_e->msgnum );
2150
2151     sp_e->data_len = 0;
2152     if (!msg_name)
2153     {
2154         INT i = 0;
2155
2156         if (sp_e->msgnum >= 0xc000)
2157         {
2158             if (GlobalGetAtomNameA( sp_e->msgnum, sp_e->msg_name+1, sizeof(sp_e->msg_name)-2 ))
2159             {
2160                 sp_e->msg_name[0] = '\"';
2161                 strcat( sp_e->msg_name, "\"" );
2162                 return;
2163             }
2164         }
2165         if (!sp_e->wnd_class[0]) SPY_GetClassName(sp_e);
2166
2167 #if DEBUG_SPY
2168         TRACE("looking class %s\n", debugstr_w(sp_e->wnd_class));
2169 #endif
2170
2171         while (cc_array[i].classname &&
2172                strcmpiW(cc_array[i].classname, sp_e->wnd_class) != 0) i++;
2173
2174         if (cc_array[i].classname)
2175         {
2176 #if DEBUG_SPY
2177             TRACE("process class %s, first %p, last %p\n",
2178                   debugstr_w(cc_array[i].classname), cc_array[i].classmsg,
2179                   cc_array[i].lastmsg);
2180 #endif
2181             p = SPY_Bsearch_Msg (cc_array[i].classmsg, cc_array[i].lastmsg,
2182                                  sp_e->msgnum);
2183             if (p) {
2184                 lstrcpynA (sp_e->msg_name, p->name, sizeof(sp_e->msg_name));
2185                 sp_e->data_len = p->len;
2186                 return;
2187             }
2188         }
2189         if (sp_e->msgnum >= WM_USER && sp_e->msgnum <= WM_APP)
2190             sprintf( sp_e->msg_name, "WM_USER+%d", sp_e->msgnum - WM_USER );
2191         else
2192             sprintf( sp_e->msg_name, "%04x", sp_e->msgnum );
2193     }
2194     else
2195     {
2196         lstrcpynA(sp_e->msg_name, msg_name, sizeof(sp_e->msg_name));
2197     }
2198 }
2199
2200 /***********************************************************************
2201  *           SPY_GetWndName
2202  *
2203  *  Sets the value of "wnd_name" and "wnd_class" members of the
2204  *  instance structure.
2205  *
2206  */
2207 static void SPY_GetWndName( SPY_INSTANCE *sp_e )
2208 {
2209     INT len;
2210
2211     SPY_GetClassName( sp_e );
2212
2213     len = InternalGetWindowText(sp_e->msg_hwnd, sp_e->wnd_name, sizeof(sp_e->wnd_name)/sizeof(WCHAR));
2214     if(!len) /* get class name */
2215     {
2216         LPWSTR dst = sp_e->wnd_name;
2217         LPWSTR src = sp_e->wnd_class;
2218         int n = sizeof(sp_e->wnd_name)/sizeof(WCHAR) - 3;
2219         *dst++ = '{';
2220         while ((n-- > 0) && *src) *dst++ = *src++;
2221         *dst++ = '}';
2222         *dst = 0;
2223     }
2224 }
2225
2226 /***********************************************************************
2227  *           SPY_GetMsgName
2228  *
2229  *  ****  External function  ****
2230  *
2231  *  Get message name
2232  */
2233 const char *SPY_GetMsgName( UINT msg, HWND hWnd )
2234 {
2235     SPY_INSTANCE ext_sp_e;
2236     DWORD save_error = GetLastError();
2237
2238     ext_sp_e.msgnum = msg;
2239     ext_sp_e.msg_hwnd   = hWnd;
2240     ext_sp_e.lParam = 0;
2241     ext_sp_e.wParam = 0;
2242     ext_sp_e.wnd_class[0] = 0;
2243     SPY_GetMsgStuff(&ext_sp_e);
2244     SetLastError( save_error );
2245     return wine_dbg_sprintf("%s", ext_sp_e.msg_name);
2246 }
2247
2248 /***********************************************************************
2249  *           SPY_GetVKeyName
2250  */
2251 const char *SPY_GetVKeyName(WPARAM wParam)
2252 {
2253     const char *vk_key_name;
2254
2255     if(wParam <= SPY_MAX_VKKEYSNUM && VK_KeyNames[wParam])
2256         vk_key_name = VK_KeyNames[wParam];
2257     else
2258         vk_key_name = "VK_???";
2259
2260     return vk_key_name;
2261 }
2262
2263 /***********************************************************************
2264  *           SPY_Bsearch_Notify
2265  */
2266 static const SPY_NOTIFY *SPY_Bsearch_Notify( const SPY_NOTIFY *first, const SPY_NOTIFY *last, UINT code)
2267 {
2268     INT count;
2269     const SPY_NOTIFY *test;
2270
2271     while (last >= first) {
2272         count = 1 + last - first;
2273         if (count < 3) {
2274 #if DEBUG_SPY
2275             TRACE("code=%d, f-value=%d, f-name=%s, l-value=%d, l-name=%s, l-len=%d,\n",
2276                code, first->value, first->name, last->value, last->name, last->len);
2277 #endif
2278             if (first->value == code) return first;
2279             if (last->value == code) return last;
2280             return NULL;
2281         }
2282         count = count / 2;
2283         test = first + count;
2284 #if DEBUG_SPY
2285         TRACE("first=%p, last=%p, test=%p, t-value=%d, code=%d, count=%d\n",
2286            first, last, test, test->value, code, count);
2287 #endif
2288         if (test->value == code) return test;
2289         if (test->value < code)
2290             last = test - 1;
2291         else
2292             first = test + 1;
2293     }
2294     return NULL;
2295 }
2296
2297 /***********************************************************************
2298  *           SPY_DumpMem
2299  */
2300 static void SPY_DumpMem (LPCSTR header, const UINT *q, INT len)
2301 {
2302     int i;
2303
2304     for(i=0; i<len-12; i+=16) {
2305         TRACE("%s [%04x] %08x %08x %08x %08x\n",
2306               header, i, *q, *(q+1), *(q+2), *(q+3));
2307         q += 4;
2308     }
2309     switch ((len - i + 3) & (~3)) {
2310     case 16:
2311         TRACE("%s [%04x] %08x %08x %08x %08x\n",
2312               header, i, *q, *(q+1), *(q+2), *(q+3));
2313         break;
2314     case 12:
2315         TRACE("%s [%04x] %08x %08x %08x\n",
2316               header, i, *q, *(q+1), *(q+2));
2317         break;
2318     case 8:
2319         TRACE("%s [%04x] %08x %08x\n",
2320               header, i, *q, *(q+1));
2321         break;
2322     case 4:
2323         TRACE("%s [%04x] %08x\n",
2324               header, i, *q);
2325         break;
2326     default:
2327         break;
2328     }
2329 }
2330
2331 /***********************************************************************
2332  *           SPY_DumpStructure
2333  */
2334 static void SPY_DumpStructure(const SPY_INSTANCE *sp_e, BOOL enter)
2335 {
2336     switch (sp_e->msgnum)
2337         {
2338         case LVM_INSERTITEMW:
2339         case LVM_SETITEMW:
2340             if (!enter) break;
2341             /* fall through */
2342         case LVM_GETITEMW:
2343             {
2344                 LPLVITEMA item = (LPLVITEMA) sp_e->lParam;
2345                 if (item) {
2346                     SPY_DumpMem ("LVITEM", (UINT*)item, sizeof(LVITEMA));
2347                 }
2348                 break;
2349             }
2350         case TCM_INSERTITEMW:
2351         case TCM_INSERTITEMA:
2352         case TCM_SETITEMW:
2353         case TCM_SETITEMA:
2354             if (!enter) break;
2355             /* fall through */
2356         case TCM_GETITEMW:
2357         case TCM_GETITEMA:
2358             {
2359                 TCITEMA *item = (TCITEMA *) sp_e->lParam;
2360                 if (item) {
2361                     SPY_DumpMem ("TCITEM", (UINT*)item, sizeof(TCITEMA));
2362                 }
2363                 break;
2364             }
2365         case TCM_ADJUSTRECT:
2366         case LVM_GETITEMRECT:
2367         case LVM_GETSUBITEMRECT:
2368             {
2369                 LPRECT rc = (LPRECT) sp_e->lParam;
2370                 if (rc)
2371                     TRACE("lParam rect (%s)\n", wine_dbgstr_rect(rc));
2372                 break;
2373             }
2374         case LVM_SETITEMPOSITION32:
2375             if (!enter) break;
2376             /* fall through */
2377         case LVM_GETITEMPOSITION:
2378         case LVM_GETORIGIN:
2379             {
2380                 LPPOINT point = (LPPOINT) sp_e->lParam;
2381                 if (point) {
2382                     TRACE("lParam point x=%d, y=%d\n", point->x, point->y);
2383                 }
2384                 break;
2385             }
2386         case SBM_SETRANGE:
2387             if (!enter && (sp_e->msgnum == SBM_SETRANGE)) break;
2388             TRACE("min=%d max=%d\n", (INT)sp_e->wParam, (INT)sp_e->lParam);
2389             break;
2390         case SBM_GETRANGE:
2391             if ((enter && (sp_e->msgnum == SBM_GETRANGE)) ||
2392                 (!enter && (sp_e->msgnum == SBM_SETRANGE))) break;
2393             {
2394                 LPINT ptmin = (LPINT) sp_e->wParam;
2395                 LPINT ptmax = (LPINT) sp_e->lParam;
2396                 if (ptmin && ptmax)
2397                     TRACE("min=%d max=%d\n", *ptmin, *ptmax);
2398                 else if (ptmin)
2399                     TRACE("min=%d max=n/a\n", *ptmin);
2400                 else if (ptmax)
2401                     TRACE("min=n/a max=%d\n", *ptmax);
2402                 break;
2403             }
2404         case EM_EXSETSEL:
2405             if (enter && sp_e->lParam)
2406             {
2407                 CHARRANGE *cr = (CHARRANGE *) sp_e->lParam;
2408                 TRACE("CHARRANGE: cpMin=%d cpMax=%d\n", cr->cpMin, cr->cpMax);
2409             }
2410             break;
2411         case EM_SETCHARFORMAT:
2412             if (enter && sp_e->lParam)
2413             {
2414                 CHARFORMATW *cf = (CHARFORMATW *) sp_e->lParam;
2415                 TRACE("CHARFORMAT: dwMask=0x%08x dwEffects=", cf->dwMask);
2416                 if ((cf->dwMask & CFM_BOLD) && (cf->dwEffects & CFE_BOLD))
2417                     TRACE(" CFE_BOLD");
2418                 if ((cf->dwMask & CFM_COLOR) && (cf->dwEffects & CFE_AUTOCOLOR))
2419                     TRACE(" CFE_AUTOCOLOR");
2420                 if ((cf->dwMask & CFM_ITALIC) && (cf->dwEffects & CFE_ITALIC))
2421                     TRACE(" CFE_ITALIC");
2422                 if ((cf->dwMask & CFM_PROTECTED) && (cf->dwEffects & CFE_PROTECTED))
2423                     TRACE(" CFE_PROTECTED");
2424                 if ((cf->dwMask & CFM_STRIKEOUT) && (cf->dwEffects & CFE_STRIKEOUT))
2425                     TRACE(" CFE_STRIKEOUT");
2426                 if ((cf->dwMask & CFM_UNDERLINE) && (cf->dwEffects & CFE_UNDERLINE))
2427                     TRACE(" CFE_UNDERLINE");
2428                 TRACE("\n");
2429                 if (cf->dwMask & CFM_SIZE)
2430                     TRACE("yHeight=%d\n", cf->yHeight);
2431                 if (cf->dwMask & CFM_OFFSET)
2432                     TRACE("yOffset=%d\n", cf->yOffset);
2433                 if ((cf->dwMask & CFM_COLOR) && !(cf->dwEffects & CFE_AUTOCOLOR))
2434                     TRACE("crTextColor=%x\n", cf->crTextColor);
2435                 TRACE("bCharSet=%x bPitchAndFamily=%x\n", cf->bCharSet, cf->bPitchAndFamily);
2436                 /* FIXME: we should try to be a bit more intelligent about
2437                  * whether this is in ANSI or Unicode (it could be either) */
2438                 if (cf->dwMask & CFM_FACE)
2439                     TRACE("szFaceName=%s\n", debugstr_wn(cf->szFaceName, LF_FACESIZE));
2440                 /* FIXME: handle CHARFORMAT2 too */
2441             }
2442             break;
2443         case WM_DRAWITEM:
2444             if (!enter) break;
2445             {
2446                 DRAWITEMSTRUCT *lpdis = (DRAWITEMSTRUCT*) sp_e->lParam;
2447                 TRACE("DRAWITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n",
2448                       lpdis->CtlType, lpdis->CtlID);
2449                 TRACE("itemID=0x%08x itemAction=0x%08x itemState=0x%08x\n",
2450                       lpdis->itemID, lpdis->itemAction, lpdis->itemState);
2451                 TRACE("hWnd=%p hDC=%p (%s) itemData=0x%08lx\n",
2452                       lpdis->hwndItem, lpdis->hDC,
2453                       wine_dbgstr_rect(&lpdis->rcItem), lpdis->itemData);
2454             }
2455             break;
2456         case WM_MEASUREITEM:
2457             {
2458                 MEASUREITEMSTRUCT *lpmis = (MEASUREITEMSTRUCT*) sp_e->lParam;
2459                 TRACE("MEASUREITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n",
2460                       lpmis->CtlType, lpmis->CtlID);
2461                 TRACE("itemID=0x%08x itemWidth=0x%08x itemHeight=0x%08x\n",
2462                       lpmis->itemID, lpmis->itemWidth, lpmis->itemHeight);
2463                 TRACE("itemData=0x%08lx\n", lpmis->itemData);
2464             }
2465             break;
2466         case WM_NCCREATE:
2467         case WM_CREATE:
2468         {
2469             BOOL unicode;
2470             CREATESTRUCTA *cs;
2471
2472             if (!enter) break;
2473
2474             unicode = IsWindowUnicode(sp_e->msg_hwnd);
2475             cs = (CREATESTRUCTA *)sp_e->lParam;
2476             TRACE("%s %s ex=%08x style=%08x %d,%d %dx%d parent=%p menu=%p inst=%p params=%p\n",
2477                   unicode ? debugstr_w((LPCWSTR)cs->lpszName) : debugstr_a(cs->lpszName),
2478                   unicode ? debugstr_w((LPCWSTR)cs->lpszClass) : debugstr_a(cs->lpszClass),
2479                   cs->dwExStyle, cs->style, cs->x, cs->y, cs->cx, cs->cy,
2480                   cs->hwndParent, cs->hMenu, cs->hInstance, cs->lpCreateParams);
2481             break;
2482         }
2483         case WM_SIZE:
2484             if (!enter) break;
2485             TRACE("cx=%d cy=%d\n", LOWORD(sp_e->lParam), HIWORD(sp_e->lParam));
2486             break;
2487         case WM_WINDOWPOSCHANGED:
2488             if (!enter) break;
2489         case WM_WINDOWPOSCHANGING:
2490             {
2491                 WINDOWPOS *lpwp = (WINDOWPOS *)sp_e->lParam;
2492                 TRACE("WINDOWPOS hwnd=%p, after=%p, at (%d,%d) w=%d h=%d, flags=0x%08x\n",
2493                       lpwp->hwnd, lpwp->hwndInsertAfter, lpwp->x, lpwp->y,
2494                       lpwp->cx, lpwp->cy, lpwp->flags);
2495             }
2496             break;
2497         case WM_STYLECHANGED:
2498             if (!enter) break;
2499         case WM_STYLECHANGING:
2500             {
2501                 LPSTYLESTRUCT ss = (LPSTYLESTRUCT) sp_e->lParam;
2502                 TRACE("STYLESTRUCT: StyleOld=0x%08x, StyleNew=0x%08x\n",
2503                       ss->styleOld, ss->styleNew);
2504             }
2505             break;
2506         case WM_NCCALCSIZE:
2507             {
2508                 RECT *rc = (RECT *)sp_e->lParam;
2509                 TRACE("Rect (%s)\n", wine_dbgstr_rect(rc));
2510             }
2511             break;
2512         case WM_NOTIFY:
2513             /* if (!enter) break; */
2514             {
2515                 NMHDR * pnmh = (NMHDR*) sp_e->lParam;
2516                 UINT *q, dumplen;
2517                 const SPY_NOTIFY *p;
2518                 WCHAR from_class[60];
2519                 DWORD save_error;
2520
2521                 p = SPY_Bsearch_Notify (&spnfy_array[0], end_spnfy_array,
2522                                         pnmh->code);
2523                 if (p) {
2524                     TRACE("NMHDR hwndFrom=%p idFrom=0x%08lx code=%s<0x%08x>, extra=0x%x\n",
2525                           pnmh->hwndFrom, pnmh->idFrom, p->name, pnmh->code, p->len);
2526                     dumplen = p->len;
2527
2528                     /* for CUSTOMDRAW, dump all the data for TOOLBARs */
2529                     if (pnmh->code == NM_CUSTOMDRAW) {
2530                         /* save and restore error code over the next call */
2531                         save_error = GetLastError();
2532                         GetClassNameW(pnmh->hwndFrom, from_class,
2533                                       sizeof(from_class)/sizeof(WCHAR));
2534                         SetLastError(save_error);
2535                         if (strcmpW(TOOLBARCLASSNAMEW, from_class) == 0)
2536                             dumplen = sizeof(NMTBCUSTOMDRAW)-sizeof(NMHDR);
2537                     } else if ( pnmh->code >= HDN_ENDDRAG
2538                                 && pnmh->code <= HDN_ITEMCHANGINGA ) {
2539                         dumplen = sizeof(NMHEADERA)-sizeof(NMHDR);
2540                     }
2541                     if (dumplen > 0) {
2542                         q = (UINT *)(pnmh + 1);
2543                         SPY_DumpMem ("NM extra", q, (INT)dumplen);
2544                     }
2545                 }
2546                 else
2547                     TRACE("NMHDR hwndFrom=%p idFrom=0x%08lx code=0x%08x\n",
2548                           pnmh->hwndFrom, pnmh->idFrom, pnmh->code);
2549             }
2550         default:
2551             if (sp_e->data_len > 0)
2552                 SPY_DumpMem ("MSG lParam", (UINT *)sp_e->lParam, sp_e->data_len);
2553             break;
2554         }
2555
2556 }
2557 /***********************************************************************
2558  *           SPY_EnterMessage
2559  */
2560 void SPY_EnterMessage( INT iFlag, HWND hWnd, UINT msg,
2561                        WPARAM wParam, LPARAM lParam )
2562 {
2563     SPY_INSTANCE sp_e;
2564     int indent;
2565     DWORD save_error = GetLastError();
2566
2567     if (!TRACE_ON(message) || SPY_EXCLUDE(msg)) return;
2568
2569     sp_e.msgnum = msg;
2570     sp_e.msg_hwnd = hWnd;
2571     sp_e.lParam = lParam;
2572     sp_e.wParam = wParam;
2573     SPY_GetWndName(&sp_e);
2574     SPY_GetMsgStuff(&sp_e);
2575     indent = get_indent_level();
2576
2577     /* each SPY_SENDMESSAGE must be complemented by call to SPY_ExitMessage */
2578     switch(iFlag)
2579     {
2580     case SPY_DISPATCHMESSAGE:
2581         TRACE("%*s(%p) %-16s [%04x] %s dispatched  wp=%08lx lp=%08lx\n",
2582                         indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
2583                         sp_e.msg_name, wParam, lParam);
2584         break;
2585
2586     case SPY_SENDMESSAGE:
2587         {
2588             char taskName[20];
2589             DWORD tid = GetWindowThreadProcessId( hWnd, NULL );
2590
2591             if (tid == GetCurrentThreadId()) strcpy( taskName, "self" );
2592             else sprintf( taskName, "tid %04x", GetCurrentThreadId() );
2593
2594             TRACE("%*s(%p) %-16s [%04x] %s sent from %s wp=%08lx lp=%08lx\n",
2595                   indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
2596                   sp_e.msg_name, taskName, wParam, lParam );
2597             SPY_DumpStructure(&sp_e, TRUE);
2598         }
2599         break;
2600
2601     case SPY_DEFWNDPROC:
2602         if( SPY_ExcludeDWP ) return;
2603         TRACE("%*s(%p)  DefWindowProc:[%04x] %s  wp=%08lx lp=%08lx\n",
2604               indent, "", hWnd, msg, sp_e.msg_name, wParam, lParam );
2605         break;
2606     }
2607     set_indent_level( indent + SPY_INDENT_UNIT );
2608     SetLastError( save_error );
2609 }
2610
2611
2612 /***********************************************************************
2613  *           SPY_ExitMessage
2614  */
2615 void SPY_ExitMessage( INT iFlag, HWND hWnd, UINT msg, LRESULT lReturn,
2616                        WPARAM wParam, LPARAM lParam )
2617 {
2618     SPY_INSTANCE sp_e;
2619     int indent;
2620     DWORD save_error = GetLastError();
2621
2622     if (!TRACE_ON(message) || SPY_EXCLUDE(msg) ||
2623         (SPY_ExcludeDWP && iFlag == SPY_RESULT_DEFWND))
2624         return;
2625
2626     sp_e.msgnum = msg;
2627     sp_e.msg_hwnd   = hWnd;
2628     sp_e.lParam = lParam;
2629     sp_e.wParam = wParam;
2630     SPY_GetWndName(&sp_e);
2631     SPY_GetMsgStuff(&sp_e);
2632
2633     if ((indent = get_indent_level()))
2634     {
2635         indent -= SPY_INDENT_UNIT;
2636         set_indent_level( indent );
2637     }
2638
2639     switch(iFlag)
2640     {
2641     case SPY_RESULT_DEFWND:
2642         TRACE(" %*s(%p)  DefWindowProc: [%04x] %s returned %08lx\n",
2643               indent, "", hWnd, msg, sp_e.msg_name, lReturn );
2644         break;
2645
2646     case SPY_RESULT_OK:
2647         TRACE(" %*s(%p) %-16s [%04x] %s returned %08lx\n",
2648                         indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
2649                         sp_e.msg_name, lReturn );
2650         SPY_DumpStructure(&sp_e, FALSE);
2651         break;
2652     }
2653     SetLastError( save_error );
2654 }
2655
2656
2657 /***********************************************************************
2658  *           SPY_Init
2659  */
2660 int SPY_Init(void)
2661 {
2662     int i;
2663     UINT j;
2664     char buffer[1024];
2665     const SPY_NOTIFY *p;
2666     const USER_MSG *q;
2667     HKEY hkey;
2668
2669     if (!TRACE_ON(message)) return TRUE;
2670
2671     indent_tls_index = TlsAlloc();
2672     /* @@ Wine registry key: HKCU\Software\Wine\Debug */
2673     if(!RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Wine\\Debug", &hkey))
2674     {
2675         DWORD type, count = sizeof(buffer);
2676
2677         buffer[0] = 0;
2678         if (!RegQueryValueExA(hkey, "SpyInclude", 0, &type, (LPBYTE) buffer, &count) &&
2679             strcmp( buffer, "INCLUDEALL" ))
2680         {
2681             TRACE("Include=%s\n", buffer );
2682             for (i = 0; i <= SPY_MAX_MSGNUM; i++)
2683                 SPY_Exclude[i] = (MessageTypeNames[i] && !strstr(buffer,MessageTypeNames[i]));
2684         }
2685
2686         count = sizeof(buffer);
2687         buffer[0] = 0;
2688         if (!RegQueryValueExA(hkey, "SpyExclude", 0, &type, (LPBYTE) buffer, &count))
2689         {
2690             TRACE("Exclude=%s\n", buffer );
2691             if (!strcmp( buffer, "EXCLUDEALL" ))
2692                 for (i = 0; i <= SPY_MAX_MSGNUM; i++) SPY_Exclude[i] = TRUE;
2693             else
2694                 for (i = 0; i <= SPY_MAX_MSGNUM; i++)
2695                     SPY_Exclude[i] = (MessageTypeNames[i] && strstr(buffer,MessageTypeNames[i]));
2696         }
2697
2698         SPY_ExcludeDWP = 0;
2699         count = sizeof(buffer);
2700         if(!RegQueryValueExA(hkey, "SpyExcludeDWP", 0, &type, (LPBYTE) buffer, &count))
2701             SPY_ExcludeDWP = atoi(buffer);
2702
2703         RegCloseKey(hkey);
2704     }
2705
2706     /* find last good entry in spy notify array and save addr for b-search */
2707     p = &spnfy_array[0];
2708     j = 0xffffffff;
2709     while (p->name) {
2710         if (p->value > j) {
2711             ERR("Notify message array out of order\n");
2712             ERR("  between values [%08x] %s and [%08x] %s\n",
2713                 j, (p-1)->name, p->value, p->name);
2714             break;
2715         }
2716         j = p->value;
2717         p++;
2718     }
2719     p--;
2720     end_spnfy_array = p;
2721
2722     /* find last good entry in each common control message array
2723      *  and save addr for b-search.
2724      */
2725     i = 0;
2726     while (cc_array[i].classname) {
2727
2728         j = 0x0400; /* minimum entry in array */
2729         q = cc_array[i].classmsg;
2730         while(q->name) {
2731             if (q->value <= j) {
2732                 ERR("Class message array out of order for class %s\n",
2733                     debugstr_w(cc_array[i].classname));
2734                 ERR("  between values [%04x] %s and [%04x] %s\n",
2735                     j, (q-1)->name, q->value, q->name);
2736                 break;
2737             }
2738             j = q->value;
2739             q++;
2740         }
2741         q--;
2742         cc_array[i].lastmsg = q;
2743
2744         i++;
2745     }
2746
2747     return 1;
2748 }