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