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