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