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