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