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