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