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