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