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