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