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