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