urlmon: Use pluggable protocol for ftp binding.
[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     /* special code to detect a property sheet dialog   */
2084     if ((GetClassLongW(sp_e->msg_hwnd, GCW_ATOM) == WC_DIALOG) &&
2085         (GetPropW(sp_e->msg_hwnd, PropSheetInfoStr))) {
2086         strcpyW(sp_e->wnd_class, WC_PROPSHEETW);
2087     }
2088     else {
2089         GetClassNameW(sp_e->msg_hwnd, sp_e->wnd_class, sizeof(sp_e->wnd_class)/sizeof(WCHAR));
2090     }
2091 }
2092
2093 /***********************************************************************
2094  *           SPY_GetMsgStuff
2095  *
2096  *  Get message name and other information for dumping
2097  */
2098 static void SPY_GetMsgStuff( SPY_INSTANCE *sp_e )
2099 {
2100     const USER_MSG *p;
2101     const char *msg_name = SPY_GetMsgInternal( sp_e->msgnum );
2102
2103     sp_e->data_len = 0;
2104     if (!msg_name)
2105     {
2106         INT i = 0;
2107
2108         if (sp_e->msgnum >= 0xc000)
2109         {
2110             if (GlobalGetAtomNameA( sp_e->msgnum, sp_e->msg_name+1, sizeof(sp_e->msg_name)-2 ))
2111             {
2112                 sp_e->msg_name[0] = '\"';
2113                 strcat( sp_e->msg_name, "\"" );
2114                 return;
2115             }
2116         }
2117         if (!sp_e->wnd_class[0]) SPY_GetClassName(sp_e);
2118
2119 #if DEBUG_SPY
2120         TRACE("looking class %s\n", debugstr_w(sp_e->wnd_class));
2121 #endif
2122
2123         while (cc_array[i].classname &&
2124                strcmpiW(cc_array[i].classname, sp_e->wnd_class) != 0) i++;
2125
2126         if (cc_array[i].classname)
2127         {
2128 #if DEBUG_SPY
2129             TRACE("process class %s, first %p, last %p\n",
2130                   debugstr_w(cc_array[i].classname), cc_array[i].classmsg,
2131                   cc_array[i].lastmsg);
2132 #endif
2133             p = SPY_Bsearch_Msg (cc_array[i].classmsg, cc_array[i].lastmsg,
2134                                  sp_e->msgnum);
2135             if (p) {
2136                 lstrcpynA (sp_e->msg_name, p->name, sizeof(sp_e->msg_name));
2137                 sp_e->data_len = p->len;
2138                 return;
2139             }
2140         }
2141         if (sp_e->msgnum >= WM_USER && sp_e->msgnum <= WM_APP)
2142             sprintf( sp_e->msg_name, "WM_USER+%d", sp_e->msgnum - WM_USER );
2143         else
2144             sprintf( sp_e->msg_name, "%04x", sp_e->msgnum );
2145     }
2146     else
2147     {
2148         lstrcpynA(sp_e->msg_name, msg_name, sizeof(sp_e->msg_name));
2149     }
2150 }
2151
2152 /***********************************************************************
2153  *           SPY_GetWndName
2154  *
2155  *  Sets the value of "wnd_name" and "wnd_class" members of the
2156  *  instance structure.
2157  *
2158  */
2159 static void SPY_GetWndName( SPY_INSTANCE *sp_e )
2160 {
2161     INT len;
2162
2163     SPY_GetClassName( sp_e );
2164
2165     len = InternalGetWindowText(sp_e->msg_hwnd, sp_e->wnd_name, sizeof(sp_e->wnd_name)/sizeof(WCHAR));
2166     if(!len) /* get class name */
2167     {
2168         LPWSTR dst = sp_e->wnd_name;
2169         LPWSTR src = sp_e->wnd_class;
2170         int n = sizeof(sp_e->wnd_name)/sizeof(WCHAR) - 3;
2171         *dst++ = '{';
2172         while ((n-- > 0) && *src) *dst++ = *src++;
2173         *dst++ = '}';
2174         *dst = 0;
2175     }
2176 }
2177
2178 /***********************************************************************
2179  *           SPY_GetMsgName
2180  *
2181  *  ****  External function  ****
2182  *
2183  *  Get message name
2184  */
2185 const char *SPY_GetMsgName( UINT msg, HWND hWnd )
2186 {
2187     SPY_INSTANCE ext_sp_e;
2188     DWORD save_error = GetLastError();
2189
2190     ext_sp_e.msgnum = msg;
2191     ext_sp_e.msg_hwnd   = hWnd;
2192     ext_sp_e.lParam = 0;
2193     ext_sp_e.wParam = 0;
2194     ext_sp_e.wnd_class[0] = 0;
2195     SPY_GetMsgStuff(&ext_sp_e);
2196     SetLastError( save_error );
2197     return wine_dbg_sprintf("%s", ext_sp_e.msg_name);
2198 }
2199
2200 /***********************************************************************
2201  *           SPY_GetVKeyName
2202  */
2203 const char *SPY_GetVKeyName(WPARAM wParam)
2204 {
2205     const char *vk_key_name;
2206
2207     if(wParam <= SPY_MAX_VKKEYSNUM && VK_KeyNames[wParam])
2208         vk_key_name = VK_KeyNames[wParam];
2209     else
2210         vk_key_name = "VK_???";
2211
2212     return vk_key_name;
2213 }
2214
2215 /***********************************************************************
2216  *           SPY_Bsearch_Notify
2217  */
2218 static const SPY_NOTIFY *SPY_Bsearch_Notify( const SPY_NOTIFY *first, const SPY_NOTIFY *last, UINT code)
2219 {
2220     INT count;
2221     const SPY_NOTIFY *test;
2222
2223     while (last >= first) {
2224         count = 1 + last - first;
2225         if (count < 3) {
2226 #if DEBUG_SPY
2227             TRACE("code=%d, f-value=%d, f-name=%s, l-value=%d, l-name=%s, l-len=%d,\n",
2228                code, first->value, first->name, last->value, last->name, last->len);
2229 #endif
2230             if (first->value == code) return first;
2231             if (last->value == code) return last;
2232             return NULL;
2233         }
2234         count = count / 2;
2235         test = first + count;
2236 #if DEBUG_SPY
2237         TRACE("first=%p, last=%p, test=%p, t-value=%d, code=%d, count=%d\n",
2238            first, last, test, test->value, code, count);
2239 #endif
2240         if (test->value == code) return test;
2241         if (test->value < code)
2242             last = test - 1;
2243         else
2244             first = test + 1;
2245     }
2246     return NULL;
2247 }
2248
2249 /***********************************************************************
2250  *           SPY_DumpMem
2251  */
2252 static void SPY_DumpMem (LPCSTR header, const UINT *q, INT len)
2253 {
2254     int i;
2255
2256     for(i=0; i<len-12; i+=16) {
2257         TRACE("%s [%04x] %08x %08x %08x %08x\n",
2258               header, i, *q, *(q+1), *(q+2), *(q+3));
2259         q += 4;
2260     }
2261     switch ((len - i + 3) & (~3)) {
2262     case 16:
2263         TRACE("%s [%04x] %08x %08x %08x %08x\n",
2264               header, i, *q, *(q+1), *(q+2), *(q+3));
2265         break;
2266     case 12:
2267         TRACE("%s [%04x] %08x %08x %08x\n",
2268               header, i, *q, *(q+1), *(q+2));
2269         break;
2270     case 8:
2271         TRACE("%s [%04x] %08x %08x\n",
2272               header, i, *q, *(q+1));
2273         break;
2274     case 4:
2275         TRACE("%s [%04x] %08x\n",
2276               header, i, *q);
2277         break;
2278     default:
2279         break;
2280     }
2281 }
2282
2283 /***********************************************************************
2284  *           SPY_DumpStructure
2285  */
2286 static void SPY_DumpStructure(const SPY_INSTANCE *sp_e, BOOL enter)
2287 {
2288     switch (sp_e->msgnum)
2289         {
2290         case LVM_INSERTITEMW:
2291         case LVM_INSERTITEMA:
2292         case LVM_SETITEMW:
2293         case LVM_SETITEMA:
2294             if (!enter) break;
2295             /* fall through */
2296         case LVM_GETITEMW:
2297         case LVM_GETITEMA:
2298             {
2299                 LPLVITEMA item = (LPLVITEMA) sp_e->lParam;
2300                 if (item) {
2301                     SPY_DumpMem ("LVITEM", (UINT*)item, sizeof(LVITEMA));
2302                 }
2303                 break;
2304             }
2305         case TCM_INSERTITEMW:
2306         case TCM_INSERTITEMA:
2307         case TCM_SETITEMW:
2308         case TCM_SETITEMA:
2309             if (!enter) break;
2310             /* fall through */
2311         case TCM_GETITEMW:
2312         case TCM_GETITEMA:
2313             {
2314                 TCITEMA *item = (TCITEMA *) sp_e->lParam;
2315                 if (item) {
2316                     SPY_DumpMem ("TCITEM", (UINT*)item, sizeof(TCITEMA));
2317                 }
2318                 break;
2319             }
2320         case TCM_ADJUSTRECT:
2321         case LVM_GETITEMRECT:
2322         case LVM_GETSUBITEMRECT:
2323             {
2324                 LPRECT rc = (LPRECT) sp_e->lParam;
2325                 if (rc)
2326                     TRACE("lParam rect (%s)\n", wine_dbgstr_rect(rc));
2327                 break;
2328             }
2329         case LVM_SETITEMPOSITION32:
2330             if (!enter) break;
2331             /* fall through */
2332         case LVM_GETITEMPOSITION:
2333         case LVM_GETORIGIN:
2334             {
2335                 LPPOINT point = (LPPOINT) sp_e->lParam;
2336                 if (point) {
2337                     TRACE("lParam point x=%d, y=%d\n", point->x, point->y);
2338                 }
2339                 break;
2340             }
2341         case SBM_SETRANGE:
2342             if (!enter && (sp_e->msgnum == SBM_SETRANGE)) break;
2343             TRACE("min=%d max=%d\n", (INT)sp_e->wParam, (INT)sp_e->lParam);
2344             break;
2345         case SBM_GETRANGE:
2346             if ((enter && (sp_e->msgnum == SBM_GETRANGE)) ||
2347                 (!enter && (sp_e->msgnum == SBM_SETRANGE))) break;
2348             {
2349                 LPINT ptmin = (LPINT) sp_e->wParam;
2350                 LPINT ptmax = (LPINT) sp_e->lParam;
2351                 if (ptmin && ptmax)
2352                     TRACE("min=%d max=%d\n", *ptmin, *ptmax);
2353                 else if (ptmin)
2354                     TRACE("min=%d max=n/a\n", *ptmin);
2355                 else if (ptmax)
2356                     TRACE("min=n/a max=%d\n", *ptmax);
2357                 break;
2358             }
2359         case EM_EXSETSEL:
2360             if (enter && sp_e->lParam)
2361             {
2362                 CHARRANGE *cr = (CHARRANGE *) sp_e->lParam;
2363                 TRACE("CHARRANGE: cpMin=%d cpMax=%d\n", cr->cpMin, cr->cpMax);
2364             }
2365             break;
2366         case EM_SETCHARFORMAT:
2367             if (enter && sp_e->lParam)
2368             {
2369                 CHARFORMATW *cf = (CHARFORMATW *) sp_e->lParam;
2370                 TRACE("CHARFORMAT: dwMask=0x%08x dwEffects=", cf->dwMask);
2371                 if ((cf->dwMask & CFM_BOLD) && (cf->dwEffects & CFE_BOLD))
2372                     TRACE(" CFE_BOLD");
2373                 if ((cf->dwMask & CFM_COLOR) && (cf->dwEffects & CFE_AUTOCOLOR))
2374                     TRACE(" CFE_AUTOCOLOR");
2375                 if ((cf->dwMask & CFM_ITALIC) && (cf->dwEffects & CFE_ITALIC))
2376                     TRACE(" CFE_ITALIC");
2377                 if ((cf->dwMask & CFM_PROTECTED) && (cf->dwEffects & CFE_PROTECTED))
2378                     TRACE(" CFE_PROTECTED");
2379                 if ((cf->dwMask & CFM_STRIKEOUT) && (cf->dwEffects & CFE_STRIKEOUT))
2380                     TRACE(" CFE_STRIKEOUT");
2381                 if ((cf->dwMask & CFM_UNDERLINE) && (cf->dwEffects & CFE_UNDERLINE))
2382                     TRACE(" CFE_UNDERLINE");
2383                 TRACE("\n");
2384                 if (cf->dwMask & CFM_SIZE)
2385                     TRACE("yHeight=%d\n", cf->yHeight);
2386                 if (cf->dwMask & CFM_OFFSET)
2387                     TRACE("yOffset=%d\n", cf->yOffset);
2388                 if ((cf->dwMask & CFM_COLOR) && !(cf->dwEffects & CFE_AUTOCOLOR))
2389                     TRACE("crTextColor=%x\n", cf->crTextColor);
2390                 TRACE("bCharSet=%x bPitchAndFamily=%x\n", cf->bCharSet, cf->bPitchAndFamily);
2391                 /* FIXME: we should try to be a bit more intelligent about
2392                  * whether this is in ANSI or Unicode (it could be either) */
2393                 if (cf->dwMask & CFM_FACE)
2394                     TRACE("szFaceName=%s\n", debugstr_wn(cf->szFaceName, LF_FACESIZE));
2395                 /* FIXME: handle CHARFORMAT2 too */
2396             }
2397             break;
2398         case WM_DRAWITEM:
2399             if (!enter) break;
2400             {
2401                 DRAWITEMSTRUCT *lpdis = (DRAWITEMSTRUCT*) sp_e->lParam;
2402                 TRACE("DRAWITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n",
2403                       lpdis->CtlType, lpdis->CtlID);
2404                 TRACE("itemID=0x%08x itemAction=0x%08x itemState=0x%08x\n",
2405                       lpdis->itemID, lpdis->itemAction, lpdis->itemState);
2406                 TRACE("hWnd=%p hDC=%p (%s) itemData=0x%08lx\n",
2407                       lpdis->hwndItem, lpdis->hDC,
2408                       wine_dbgstr_rect(&lpdis->rcItem), lpdis->itemData);
2409             }
2410             break;
2411         case WM_MEASUREITEM:
2412             {
2413                 MEASUREITEMSTRUCT *lpmis = (MEASUREITEMSTRUCT*) sp_e->lParam;
2414                 TRACE("MEASUREITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n",
2415                       lpmis->CtlType, lpmis->CtlID);
2416                 TRACE("itemID=0x%08x itemWidth=0x%08x itemHeight=0x%08x\n",
2417                       lpmis->itemID, lpmis->itemWidth, lpmis->itemHeight);
2418                 TRACE("itemData=0x%08lx\n", lpmis->itemData);
2419             }
2420             break;
2421         case WM_NCCREATE:
2422         case WM_CREATE:
2423         {
2424             BOOL unicode;
2425             CREATESTRUCTA *cs;
2426
2427             if (!enter) break;
2428
2429             unicode = IsWindowUnicode(sp_e->msg_hwnd);
2430             cs = (CREATESTRUCTA *)sp_e->lParam;
2431             TRACE("%s %s ex=%08x style=%08x %d,%d %dx%d parent=%p menu=%p inst=%p params=%p\n",
2432                   unicode ? debugstr_w((LPCWSTR)cs->lpszName) : debugstr_a(cs->lpszName),
2433                   unicode ? debugstr_w((LPCWSTR)cs->lpszClass) : debugstr_a(cs->lpszClass),
2434                   cs->dwExStyle, cs->style, cs->x, cs->y, cs->cx, cs->cy,
2435                   cs->hwndParent, cs->hMenu, cs->hInstance, cs->lpCreateParams);
2436             break;
2437         }
2438         case WM_SIZE:
2439             if (!enter) break;
2440             TRACE("cx=%d cy=%d\n", LOWORD(sp_e->lParam), HIWORD(sp_e->lParam));
2441             break;
2442         case WM_WINDOWPOSCHANGED:
2443             if (!enter) break;
2444         case WM_WINDOWPOSCHANGING:
2445             {
2446                 WINDOWPOS *lpwp = (WINDOWPOS *)sp_e->lParam;
2447                 TRACE("WINDOWPOS hwnd=%p, after=%p, at (%d,%d) w=%d h=%d, flags=0x%08x\n",
2448                       lpwp->hwnd, lpwp->hwndInsertAfter, lpwp->x, lpwp->y,
2449                       lpwp->cx, lpwp->cy, lpwp->flags);
2450             }
2451             break;
2452         case WM_STYLECHANGED:
2453             if (!enter) break;
2454         case WM_STYLECHANGING:
2455             {
2456                 LPSTYLESTRUCT ss = (LPSTYLESTRUCT) sp_e->lParam;
2457                 TRACE("STYLESTRUCT: StyleOld=0x%08x, StyleNew=0x%08x\n",
2458                       ss->styleOld, ss->styleNew);
2459             }
2460             break;
2461         case WM_NCCALCSIZE:
2462             {
2463                 RECT *rc = (RECT *)sp_e->lParam;
2464                 TRACE("Rect (%s)\n", wine_dbgstr_rect(rc));
2465             }
2466             break;
2467         case WM_NOTIFY:
2468             /* if (!enter) break; */
2469             {
2470                 NMHDR * pnmh = (NMHDR*) sp_e->lParam;
2471                 UINT *q, dumplen;
2472                 const SPY_NOTIFY *p;
2473                 WCHAR from_class[60];
2474                 DWORD save_error;
2475
2476                 p = SPY_Bsearch_Notify (&spnfy_array[0], end_spnfy_array,
2477                                         pnmh->code);
2478                 if (p) {
2479                     TRACE("NMHDR hwndFrom=%p idFrom=0x%08lx code=%s<0x%08x>, extra=0x%x\n",
2480                           pnmh->hwndFrom, pnmh->idFrom, p->name, pnmh->code, p->len);
2481                     dumplen = p->len;
2482
2483                     /* for CUSTOMDRAW, dump all the data for TOOLBARs */
2484                     if (pnmh->code == NM_CUSTOMDRAW) {
2485                         /* save and restore error code over the next call */
2486                         save_error = GetLastError();
2487                         GetClassNameW(pnmh->hwndFrom, from_class,
2488                                       sizeof(from_class)/sizeof(WCHAR));
2489                         SetLastError(save_error);
2490                         if (strcmpW(TOOLBARCLASSNAMEW, from_class) == 0)
2491                             dumplen = sizeof(NMTBCUSTOMDRAW)-sizeof(NMHDR);
2492                     } else if ((pnmh->code >= HDN_ITEMCHANGINGA) && (pnmh->code <= HDN_ENDDRAG)) {
2493                         dumplen = sizeof(NMHEADERA)-sizeof(NMHDR);
2494                     }
2495                     if (dumplen > 0) {
2496                         q = (UINT *)(pnmh + 1);
2497                         SPY_DumpMem ("NM extra", q, (INT)dumplen);
2498                     }
2499                 }
2500                 else
2501                     TRACE("NMHDR hwndFrom=%p idFrom=0x%08lx code=0x%08x\n",
2502                           pnmh->hwndFrom, pnmh->idFrom, pnmh->code);
2503             }
2504         default:
2505             if (sp_e->data_len > 0)
2506                 SPY_DumpMem ("MSG lParam", (UINT *)sp_e->lParam, sp_e->data_len);
2507             break;
2508         }
2509
2510 }
2511 /***********************************************************************
2512  *           SPY_EnterMessage
2513  */
2514 void SPY_EnterMessage( INT iFlag, HWND hWnd, UINT msg,
2515                        WPARAM wParam, LPARAM lParam )
2516 {
2517     SPY_INSTANCE sp_e;
2518     int indent;
2519     DWORD save_error = GetLastError();
2520
2521     if (!TRACE_ON(message) || SPY_EXCLUDE(msg)) return;
2522
2523     sp_e.msgnum = msg;
2524     sp_e.msg_hwnd = hWnd;
2525     sp_e.lParam = lParam;
2526     sp_e.wParam = wParam;
2527     SPY_GetWndName(&sp_e);
2528     SPY_GetMsgStuff(&sp_e);
2529     indent = get_indent_level();
2530
2531     /* each SPY_SENDMESSAGE must be complemented by call to SPY_ExitMessage */
2532     switch(iFlag)
2533     {
2534     case SPY_DISPATCHMESSAGE16:
2535         TRACE("%*s(%04x) %-16s message [%04x] %s dispatched  wp=%04lx lp=%08lx\n",
2536               indent, "", HWND_16(hWnd),
2537               debugstr_w(sp_e.wnd_name), msg, sp_e.msg_name, wParam, lParam);
2538         break;
2539
2540     case SPY_DISPATCHMESSAGE:
2541         TRACE("%*s(%p) %-16s message [%04x] %s dispatched  wp=%08lx lp=%08lx\n",
2542                         indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
2543                         sp_e.msg_name, wParam, lParam);
2544         break;
2545
2546     case SPY_SENDMESSAGE16:
2547     case SPY_SENDMESSAGE:
2548         {
2549             char taskName[20];
2550             DWORD tid = GetWindowThreadProcessId( hWnd, NULL );
2551
2552             if (tid == GetCurrentThreadId()) strcpy( taskName, "self" );
2553             else sprintf( taskName, "tid %04x", GetCurrentThreadId() );
2554
2555             if (iFlag == SPY_SENDMESSAGE16)
2556                 TRACE("%*s(%04x) %-16s message [%04x] %s sent from %s wp=%04lx lp=%08lx\n",
2557                       indent, "", HWND_16(hWnd), debugstr_w(sp_e.wnd_name), msg,
2558                       sp_e.msg_name, taskName, wParam, lParam );
2559             else
2560             {   TRACE("%*s(%p) %-16s message [%04x] %s sent from %s wp=%08lx lp=%08lx\n",
2561                              indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
2562                              sp_e.msg_name, taskName, wParam, lParam );
2563                 SPY_DumpStructure(&sp_e, TRUE);
2564             }
2565         }
2566         break;
2567
2568     case SPY_DEFWNDPROC16:
2569         if( SPY_ExcludeDWP ) return;
2570         TRACE("%*s(%04x)  DefWindowProc16: %s [%04x]  wp=%04lx lp=%08lx\n",
2571               indent, "", HWND_16(hWnd), sp_e.msg_name, msg, wParam, lParam );
2572         break;
2573
2574     case SPY_DEFWNDPROC:
2575         if( SPY_ExcludeDWP ) return;
2576         TRACE("%*s(%p)  DefWindowProc32: %s [%04x]  wp=%08lx lp=%08lx\n",
2577                         indent, "", hWnd, sp_e.msg_name,
2578                         msg, wParam, lParam );
2579         break;
2580     }
2581     set_indent_level( indent + SPY_INDENT_UNIT );
2582     SetLastError( save_error );
2583 }
2584
2585
2586 /***********************************************************************
2587  *           SPY_ExitMessage
2588  */
2589 void SPY_ExitMessage( INT iFlag, HWND hWnd, UINT msg, LRESULT lReturn,
2590                        WPARAM wParam, LPARAM lParam )
2591 {
2592     SPY_INSTANCE sp_e;
2593     int indent;
2594     DWORD save_error = GetLastError();
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     SetLastError( save_error );
2650 }
2651
2652
2653 /***********************************************************************
2654  *           SPY_Init
2655  */
2656 int SPY_Init(void)
2657 {
2658     int i;
2659     UINT j;
2660     char buffer[1024];
2661     const SPY_NOTIFY *p;
2662     const USER_MSG *q;
2663     HKEY hkey;
2664
2665     if (!TRACE_ON(message)) return TRUE;
2666
2667     indent_tls_index = TlsAlloc();
2668     /* @@ Wine registry key: HKCU\Software\Wine\Debug */
2669     if(!RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Wine\\Debug", &hkey))
2670     {
2671         DWORD type, count = sizeof(buffer);
2672
2673         buffer[0] = 0;
2674         if (!RegQueryValueExA(hkey, "SpyInclude", 0, &type, (LPBYTE) buffer, &count) &&
2675             strcmp( buffer, "INCLUDEALL" ))
2676         {
2677             TRACE("Include=%s\n", buffer );
2678             for (i = 0; i <= SPY_MAX_MSGNUM; i++)
2679                 SPY_Exclude[i] = (MessageTypeNames[i] && !strstr(buffer,MessageTypeNames[i]));
2680         }
2681
2682         count = sizeof(buffer);
2683         buffer[0] = 0;
2684         if (!RegQueryValueExA(hkey, "SpyExclude", 0, &type, (LPBYTE) buffer, &count))
2685         {
2686             TRACE("Exclude=%s\n", buffer );
2687             if (!strcmp( buffer, "EXCLUDEALL" ))
2688                 for (i = 0; i <= SPY_MAX_MSGNUM; i++) SPY_Exclude[i] = TRUE;
2689             else
2690                 for (i = 0; i <= SPY_MAX_MSGNUM; i++)
2691                     SPY_Exclude[i] = (MessageTypeNames[i] && strstr(buffer,MessageTypeNames[i]));
2692         }
2693
2694         SPY_ExcludeDWP = 0;
2695         count = sizeof(buffer);
2696         if(!RegQueryValueExA(hkey, "SpyExcludeDWP", 0, &type, (LPBYTE) buffer, &count))
2697             SPY_ExcludeDWP = atoi(buffer);
2698
2699         RegCloseKey(hkey);
2700     }
2701
2702     /* find last good entry in spy notify array and save addr for b-search */
2703     p = &spnfy_array[0];
2704     j = 0xffffffff;
2705     while (p->name) {
2706         if (p->value > j) {
2707             ERR("Notify message array out of order\n");
2708             ERR("  between values [%08x] %s and [%08x] %s\n",
2709                 j, (p-1)->name, p->value, p->name);
2710             break;
2711         }
2712         j = p->value;
2713         p++;
2714     }
2715     p--;
2716     end_spnfy_array = p;
2717
2718     /* find last good entry in each common control message array
2719      *  and save addr for b-search.
2720      */
2721     i = 0;
2722     while (cc_array[i].classname) {
2723
2724         j = 0x0400; /* minimum entry in array */
2725         q = cc_array[i].classmsg;
2726         while(q->name) {
2727             if (q->value <= j) {
2728                 ERR("Class message array out of order for class %s\n",
2729                     debugstr_w(cc_array[i].classname));
2730                 ERR("  between values [%04x] %s and [%04x] %s\n",
2731                     j, (q-1)->name, q->value, q->name);
2732                 break;
2733             }
2734             j = q->value;
2735             q++;
2736         }
2737         q--;
2738         cc_array[i].lastmsg = q;
2739
2740         i++;
2741     }
2742
2743     return 1;
2744 }