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