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