Created dummy implementation of InternetSetOption function.
[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           {0,0,0} };
1405
1406 static const USER_MSG comboex_array[] = {
1407           USM(CBEM_INSERTITEMA        ,0),
1408           USM(CBEM_SETIMAGELIST       ,0),
1409           USM(CBEM_GETIMAGELIST       ,0),
1410           USM(CBEM_GETITEMA           ,0),
1411           USM(CBEM_SETITEMA           ,0),
1412           USM(CBEM_GETCOMBOCONTROL    ,0),
1413           USM(CBEM_GETEDITCONTROL     ,0),
1414           USM(CBEM_SETEXSTYLE         ,0),
1415           USM(CBEM_GETEXTENDEDSTYLE   ,0),
1416           USM(CBEM_HASEDITCHANGED     ,0),
1417           USM(CBEM_INSERTITEMW        ,0),
1418           USM(CBEM_SETITEMW           ,0),
1419           USM(CBEM_GETITEMW           ,0),
1420           USM(CBEM_SETEXTENDEDSTYLE   ,0),
1421           {0,0,0} };
1422
1423 #undef SZOF
1424 #undef USM
1425
1426 static CONTROL_CLASS  cc_array[] = {
1427     {WC_COMBOBOXEXW,    comboex_array, 0},
1428     {REBARCLASSNAMEW,   rebar_array,   0},
1429     {TOOLBARCLASSNAMEW, toolbar_array, 0},
1430     {0, 0, 0} };
1431
1432
1433 /************************************************************************/
1434
1435
1436 /* WM_NOTIFY function codes display */
1437
1438 typedef struct
1439 {
1440     const char *name;     /* name of notify message        */
1441     UINT        value;     /* notify code value             */
1442     UINT        len;       /* length of extra space to dump */
1443 } SPY_NOTIFY;
1444
1445 #define SPNFY(a,b) { #a ,a,sizeof(b)-sizeof(NMHDR)}
1446
1447 /* Array MUST be in descending order by the 'value' field  */
1448 /* (since value is UNSIGNED, 0xffffffff is largest and     */
1449 /*  0xfffffffe is smaller). A binary search is used to     */
1450 /* locate the correct 'value'.                             */
1451 static const SPY_NOTIFY spnfy_array[] = {
1452     /*  common        0U       to  0U-99U  */
1453     SPNFY(NM_OUTOFMEMORY,        NMHDR), 
1454     SPNFY(NM_CLICK,              NMHDR),    
1455     SPNFY(NM_DBLCLK,             NMHDR),
1456     SPNFY(NM_RETURN,             NMHDR),  
1457     SPNFY(NM_RCLICK,             NMHDR),
1458     SPNFY(NM_RDBLCLK,            NMHDR),       
1459     SPNFY(NM_SETFOCUS,           NMHDR),
1460     SPNFY(NM_KILLFOCUS,          NMHDR),
1461     SPNFY(NM_CUSTOMDRAW,         NMCUSTOMDRAW),
1462     SPNFY(NM_HOVER,              NMHDR),
1463     SPNFY(NM_NCHITTEST,          NMMOUSE),
1464     SPNFY(NM_KEYDOWN,            NMKEY),
1465     SPNFY(NM_RELEASEDCAPTURE,    NMHDR),
1466     SPNFY(NM_SETCURSOR,          NMMOUSE),
1467     SPNFY(NM_CHAR,               NMCHAR),
1468     SPNFY(NM_TOOLTIPSCREATED,    NMTOOLTIPSCREATED),  
1469     /* Listview       0U-100U  to  0U-199U  */
1470     SPNFY(LVN_ITEMCHANGING,      NMLISTVIEW),
1471     SPNFY(LVN_ITEMCHANGED,       NMLISTVIEW),
1472     SPNFY(LVN_INSERTITEM,        NMLISTVIEW),
1473     SPNFY(LVN_DELETEITEM,        NMLISTVIEW),
1474     SPNFY(LVN_DELETEALLITEMS,    NMLISTVIEW),
1475     SPNFY(LVN_BEGINLABELEDITA,   NMLVDISPINFOA),
1476     SPNFY(LVN_ENDLABELEDITA,     NMLVDISPINFOA),
1477     SPNFY(LVN_COLUMNCLICK,       NMLISTVIEW),
1478     SPNFY(LVN_BEGINDRAG,         NMLISTVIEW),
1479     SPNFY(LVN_BEGINRDRAG,        NMLISTVIEW),
1480     SPNFY(LVN_ODCACHEHINT,       NMLVCACHEHINT),
1481     SPNFY(LVN_ITEMACTIVATE,      NMITEMACTIVATE),
1482     SPNFY(LVN_ODSTATECHANGED,    NMLVODSTATECHANGE),
1483     SPNFY(LVN_HOTTRACK,          NMLISTVIEW),
1484     SPNFY(LVN_GETDISPINFOA,      NMLVDISPINFOA),
1485     SPNFY(LVN_SETDISPINFOA,      NMLVDISPINFOA),
1486     SPNFY(LVN_ODFINDITEMA,       NMLVFINDITEMA),
1487     SPNFY(LVN_KEYDOWN,           NMLVKEYDOWN),
1488     SPNFY(LVN_MARQUEEBEGIN,      NMLISTVIEW),
1489     SPNFY(LVN_GETINFOTIPA,       NMLVGETINFOTIPA),
1490     SPNFY(LVN_GETINFOTIPW,       NMLVGETINFOTIPW),
1491     SPNFY(LVN_BEGINLABELEDITW,   NMLVDISPINFOW),
1492     SPNFY(LVN_ENDLABELEDITW,     NMLVDISPINFOW),
1493     SPNFY(LVN_GETDISPINFOW,      NMLVDISPINFOW),
1494     SPNFY(LVN_SETDISPINFOW,      NMLVDISPINFOW),
1495     SPNFY(LVN_ODFINDITEMW,       NMLVFINDITEMW),
1496     /* Header         0U-300U  to  0U-399U  */
1497     SPNFY(HDN_ITEMCHANGINGA,     NMHDR),
1498     SPNFY(HDN_ITEMCHANGEDA,      NMHDR),
1499     SPNFY(HDN_ITEMCLICKA,        NMHDR),
1500     SPNFY(HDN_ITEMDBLCLICKA,     NMHDR),
1501     SPNFY(HDN_DIVIDERDBLCLICKA,  NMHDR),
1502     SPNFY(HDN_BEGINTRACKA,       NMHDR),
1503     SPNFY(HDN_ENDTRACKA,         NMHDR),
1504     SPNFY(HDN_GETDISPINFOA,      NMHDR),
1505     SPNFY(HDN_BEGINDRAG,         NMHDR),
1506     SPNFY(HDN_ENDDRAG,           NMHDR),
1507     SPNFY(HDN_ITEMCHANGINGW,     NMHDR),
1508     SPNFY(HDN_ITEMCHANGEDW,      NMHDR),
1509     SPNFY(HDN_ITEMCLICKW,        NMHDR),
1510     SPNFY(HDN_ITEMDBLCLICKW,     NMHDR),
1511     SPNFY(HDN_DIVIDERDBLCLICKW,  NMHDR),
1512     SPNFY(HDN_BEGINTRACKW,       NMHDR),
1513     SPNFY(HDN_ENDTRACKW,         NMHDR),
1514     SPNFY(HDN_GETDISPINFOW,      NMHDR),
1515     /* Treeview       0U-400U  to  0U-499U  */
1516     SPNFY(TVN_SELCHANGINGA,      NMHDR),
1517     SPNFY(TVN_SELCHANGEDA,       NMHDR),
1518     SPNFY(TVN_GETDISPINFOA,      NMHDR),
1519     SPNFY(TVN_SETDISPINFOA,      NMHDR),
1520     SPNFY(TVN_ITEMEXPANDINGA,    NMHDR),
1521     SPNFY(TVN_ITEMEXPANDEDA,     NMHDR),
1522     SPNFY(TVN_BEGINDRAGA,        NMHDR),
1523     SPNFY(TVN_BEGINRDRAGA,       NMHDR),
1524     SPNFY(TVN_DELETEITEMA,       NMHDR),
1525     SPNFY(TVN_BEGINLABELEDITA,   NMHDR),
1526     SPNFY(TVN_ENDLABELEDITA,     NMHDR),
1527     SPNFY(TVN_KEYDOWN,           NMHDR),
1528     SPNFY(TVN_SELCHANGINGW,      NMHDR),
1529     SPNFY(TVN_SELCHANGEDW,       NMHDR),
1530     SPNFY(TVN_GETDISPINFOW,      NMHDR),
1531     SPNFY(TVN_SETDISPINFOW,      NMHDR),
1532     SPNFY(TVN_ITEMEXPANDINGW,    NMHDR),
1533     SPNFY(TVN_ITEMEXPANDEDW,     NMHDR),
1534     SPNFY(TVN_BEGINDRAGW,        NMHDR),
1535     SPNFY(TVN_BEGINRDRAGW,       NMHDR),
1536     SPNFY(TVN_DELETEITEMW,       NMHDR),
1537     SPNFY(TVN_BEGINLABELEDITW,   NMHDR),
1538     SPNFY(TVN_ENDLABELEDITW,     NMHDR),
1539     /* Tooltips       0U-520U  to  0U-549U  */
1540     /* Tab            0U-550U  to  0U-580U  */
1541     SPNFY(TCN_KEYDOWN,           NMHDR),
1542     SPNFY(TCN_SELCHANGE,         NMHDR),
1543     SPNFY(TCN_SELCHANGING,       NMHDR),
1544     SPNFY(TCN_GETOBJECT,         NMHDR),
1545     /* Common Dialog  0U-601U  to  0U-699U  */
1546     /* Toolbar        0U-700U  to  0U-720U  */
1547     SPNFY(TBN_GETBUTTONINFOA,    NMTOOLBARA),
1548     SPNFY(TBN_BEGINDRAG,         NMTOOLBARA),
1549     SPNFY(TBN_ENDDRAG,           NMTOOLBARA),
1550     SPNFY(TBN_BEGINADJUST,       NMHDR),
1551     SPNFY(TBN_ENDADJUST,         NMHDR),
1552     SPNFY(TBN_RESET,             NMHDR),
1553     SPNFY(TBN_QUERYINSERT,       NMTOOLBARA),
1554     SPNFY(TBN_QUERYDELETE,       NMTOOLBARA),
1555     SPNFY(TBN_TOOLBARCHANGE,     NMHDR),
1556     SPNFY(TBN_CUSTHELP,          NMHDR),
1557     SPNFY(TBN_DROPDOWN,          NMTOOLBARA),
1558     SPNFY(TBN_GETOBJECT,         NMOBJECTNOTIFY),
1559     SPNFY(TBN_HOTITEMCHANGE,     NMTBHOTITEM),
1560     SPNFY(TBN_DRAGOUT,           NMTOOLBARA),
1561     SPNFY(TBN_DELETINGBUTTON,    NMTOOLBARA),
1562     SPNFY(TBN_GETDISPINFOA,      NMTBDISPINFOA),
1563     SPNFY(TBN_GETDISPINFOW,      NMTBDISPINFOW),
1564     SPNFY(TBN_GETINFOTIPA,       NMTBGETINFOTIPA),
1565     SPNFY(TBN_GETINFOTIPW,       NMTBGETINFOTIPW),
1566     SPNFY(TBN_GETBUTTONINFOW,    NMTOOLBARW),
1567     /* Up/Down        0U-721U  to  0U-740U  */
1568     /* Month Calendar 0U-750U  to  0U-759U  */
1569     /* Date/Time      0U-760U  to  0U-799U  */
1570     /* ComboBoxEx     0U-800U  to  0U-830U  */
1571     SPNFY(CBEN_GETDISPINFOA,     NMCOMBOBOXEXA),
1572     SPNFY(CBEN_INSERTITEM,       NMCOMBOBOXEXA),
1573     SPNFY(CBEN_DELETEITEM,       NMCOMBOBOXEXA),
1574     SPNFY(CBEN_BEGINEDIT,        NMHDR),
1575     SPNFY(CBEN_ENDEDITA,         NMCBEENDEDITA),
1576     SPNFY(CBEN_ENDEDITW,         NMCBEENDEDITW),
1577     SPNFY(CBEN_GETDISPINFOW,     NMCOMBOBOXEXW),
1578     SPNFY(CBEN_DRAGBEGINA,       NMCBEDRAGBEGINA),
1579     SPNFY(CBEN_DRAGBEGINW,       NMCBEDRAGBEGINW),
1580     /* Rebar          0U-831U  to  0U-859U  */
1581     SPNFY(RBN_HEIGHTCHANGE,      NMHDR),
1582     SPNFY(RBN_GETOBJECT,         NMOBJECTNOTIFY),
1583     SPNFY(RBN_LAYOUTCHANGED,     NMHDR),
1584     SPNFY(RBN_AUTOSIZE,          NMRBAUTOSIZE),
1585     SPNFY(RBN_BEGINDRAG,         NMREBAR),
1586     SPNFY(RBN_ENDDRAG,           NMREBAR),
1587     SPNFY(RBN_DELETINGBAND,      NMREBAR),
1588     SPNFY(RBN_DELETEDBAND,       NMREBAR),
1589     SPNFY(RBN_CHILDSIZE,         NMREBARCHILDSIZE),
1590     /* IP Adderss     0U-860U  to  0U-879U  */
1591     /* Status bar     0U-880U  to  0U-899U  */
1592     /* Pager          0U-900U  to  0U-950U  */
1593     SPNFY(PGN_SCROLL,            NMPGSCROLL),
1594     SPNFY(PGN_CALCSIZE,          NMPGCALCSIZE),
1595     {0,0,0}};
1596 static const SPY_NOTIFY *end_spnfy_array;     /* ptr to last good entry in array */
1597 #undef SPNFY
1598
1599
1600 static BOOL16 SPY_Exclude[SPY_MAX_MSGNUM+1];
1601 static BOOL16 SPY_ExcludeDWP = 0;
1602
1603 #define SPY_EXCLUDE(msg) \
1604     (SPY_Exclude[(msg) > SPY_MAX_MSGNUM ? SPY_MAX_MSGNUM : (msg)])
1605
1606
1607 typedef struct
1608 {
1609     UINT       msgnum;           /* message number */
1610     HWND       msg_hwnd;         /* window handle for message          */
1611     WPARAM     wParam;           /* message parameter                  */
1612     LPARAM     lParam;           /* message parameter                  */
1613     INT        data_len;         /* length of data to dump             */
1614     char       msg_name[60];     /* message name (see SPY_GetMsgName)  */
1615     WCHAR      wnd_class[60];    /* window class name (full)           */
1616     WCHAR      wnd_name[16];     /* window name for message            */
1617 } SPY_INSTANCE;
1618
1619 /* This is defined so that the external entry point can return the addr */
1620 static SPY_INSTANCE ext_sp_e;
1621
1622 static int indent_tls_index;
1623
1624 /***********************************************************************
1625  *           get_indent_level
1626  */
1627 inline static int get_indent_level(void)
1628 {
1629     return (int)TlsGetValue( indent_tls_index );
1630 }
1631
1632
1633 /***********************************************************************
1634  *           set_indent_level
1635  */
1636 inline static void set_indent_level( int level )
1637 {
1638     TlsSetValue( indent_tls_index, (void *)level );
1639 }
1640
1641
1642 /***********************************************************************
1643  *           SPY_GetMsgInternal
1644  */
1645 static const char *SPY_GetMsgInternal( UINT msg )
1646 {
1647     static char msg_buffer[20];
1648
1649     if (msg <= SPY_MAX_MSGNUM)
1650     {
1651         if (!MessageTypeNames[msg]) return "???";
1652         return MessageTypeNames[msg];
1653     }
1654
1655     if (msg >= LVM_FIRST && msg <= LVM_FIRST + SPY_MAX_LVMMSGNUM)
1656     {
1657         if (!LVMMessageTypeNames[msg-LVM_FIRST]) return "LVM_?";
1658         return LVMMessageTypeNames[msg-LVM_FIRST];
1659     }
1660
1661     if (msg >= TV_FIRST && msg <= TV_FIRST + SPY_MAX_TVMSGNUM)
1662     {
1663         if (!TVMessageTypeNames[msg-TV_FIRST]) return "TV_?";
1664         return TVMessageTypeNames[msg-TV_FIRST];
1665     }
1666
1667     if (msg >= HDM_FIRST && msg <= HDM_FIRST + SPY_MAX_HDMMSGNUM)
1668     {
1669         if (!HDMMessageTypeNames[msg-HDM_FIRST]) return "HDM_?";
1670         return HDMMessageTypeNames[msg-HDM_FIRST];
1671     }
1672
1673     if (msg >= TCM_FIRST && msg <= TCM_FIRST + SPY_MAX_TCMMSGNUM)
1674     {
1675         if (!TCMMessageTypeNames[msg-TCM_FIRST]) return "TCM_?";
1676         return TCMMessageTypeNames[msg-TCM_FIRST];
1677     }
1678
1679     if (msg >= PGM_FIRST && msg <= PGM_FIRST + SPY_MAX_PGMMSGNUM)
1680     {
1681         if (!PGMMessageTypeNames[msg-PGM_FIRST]) return "PGM_?";
1682         return PGMMessageTypeNames[msg-PGM_FIRST];
1683     }
1684
1685     if (msg >= CCM_FIRST && msg <= CCM_FIRST + SPY_MAX_CCMMSGNUM)
1686     {
1687         if (!CCMMessageTypeNames[msg-CCM_FIRST]) return "???";
1688         return CCMMessageTypeNames[msg-CCM_FIRST];
1689     }
1690
1691     if (msg >= WM_WINE_DESTROYWINDOW && msg <= WM_WINE_DESTROYWINDOW + SPY_MAX_WINEMSGNUM)
1692     {
1693         if (!WINEMessageTypeNames[msg-WM_WINE_DESTROYWINDOW]) return "???";
1694         return WINEMessageTypeNames[msg-WM_WINE_DESTROYWINDOW];
1695     }
1696
1697     sprintf( msg_buffer, "WM_USER+%04x", msg - WM_USER );
1698     return msg_buffer;
1699 }
1700
1701 /***********************************************************************
1702  *           SPY_Bsearch_Msg
1703  */
1704 const USER_MSG *SPY_Bsearch_Msg( const USER_MSG *first, const USER_MSG *last, UINT code)
1705 {
1706     INT count;
1707     const USER_MSG *test;
1708
1709     while (last >= first) {
1710         count = 1 + last - first;
1711         if (count < 3) {
1712             /* TRACE("code=%d, f-value=%d, f-name=%s, l-value=%d, l-name=%s, l-len=%d,\n",
1713                code, first->value, first->name, last->value, last->name, last->len); */
1714             if (first->value == code) return first;
1715             if (last->value == code) return last;
1716             return NULL;
1717         }
1718         count = count / 2;
1719         test = first + count;
1720         /* TRACE("first=%p, last=%p, test=%p, t-value=%d, code=%d, count=%d\n",
1721            first, last, test, test->value, code, count); */
1722         if (test->value == code) return test;
1723         if (test->value > code)
1724             last = test - 1;
1725         else
1726             first = test + 1;
1727     }
1728     return NULL;
1729 }
1730
1731 /***********************************************************************
1732  *           SPY_GetMsgStuff
1733  *
1734  *  Get message name and other information for dumping
1735  */
1736 static void SPY_GetMsgStuff( SPY_INSTANCE *sp_e )
1737 {
1738     const USER_MSG *p;
1739
1740     sp_e->msg_name[sizeof(sp_e->msg_name)-1] = 0;
1741     strncpy (sp_e->msg_name, SPY_GetMsgInternal( sp_e->msgnum ),
1742              sizeof(sp_e->msg_name)-1);
1743
1744     sp_e->data_len = 0;
1745     if (strncmp(sp_e->msg_name, "WM_USER+", 8) == 0) {
1746         INT i = 0;
1747
1748         /* TRACE("looking class %s\n", sp_e->wnd_class); */
1749
1750         while (cc_array[i].classname &&
1751                strcmpW(cc_array[i].classname, sp_e->wnd_class) !=0) i++;
1752
1753         if (!cc_array[i].classname) return;
1754         /* TRACE("process class %s, first %p, last %p\n", 
1755               debugstr_w(cc_array[i].classname), cc_array[i].classmsg, 
1756               cc_array[i].lastmsg); */
1757         p = SPY_Bsearch_Msg (cc_array[i].classmsg, cc_array[i].lastmsg,
1758                          sp_e->msgnum);
1759         if (p) {
1760             strncpy (sp_e->msg_name, p->name, sizeof(sp_e->msg_name)-1);
1761             sp_e->data_len = p->len;
1762         }
1763     }
1764 }
1765
1766 /***********************************************************************
1767  *           SPY_GetWndName
1768  *
1769  *  Sets the value of "wnd_name" and "wnd_class" members of the 
1770  *  instance structure.
1771  *
1772  */
1773 void SPY_GetWndName( SPY_INSTANCE *sp_e )
1774 {
1775     DWORD save_error;
1776     INT len;
1777
1778     /* save and restore error code over the next call */        
1779     save_error = GetLastError();
1780     GetClassNameW(sp_e->msg_hwnd, sp_e->wnd_class, sizeof(sp_e->wnd_class)/sizeof(WCHAR));
1781     SetLastError(save_error);
1782
1783     len = InternalGetWindowText(sp_e->msg_hwnd, sp_e->wnd_name, sizeof(sp_e->wnd_name)/sizeof(WCHAR));
1784     if(!len) /* get class name */
1785     {
1786         LPWSTR dst = sp_e->wnd_name;
1787         LPWSTR src = sp_e->wnd_class;
1788         int n = sizeof(sp_e->wnd_name)/sizeof(WCHAR) - 3;
1789         *dst++ = '{';
1790         while ((n-- > 0) && *src) *dst++ = *src++;
1791         *dst++ = '}';
1792         *dst = 0;
1793     }
1794 }
1795
1796 /***********************************************************************
1797  *           SPY_GetMsgName
1798  *
1799  *  ****  External function  **** 
1800  *
1801  *  Get message name
1802  */
1803 const char *SPY_GetMsgName( UINT msg, HWND hWnd )
1804 {
1805     ext_sp_e.msgnum = msg;
1806     ext_sp_e.msg_hwnd   = hWnd;
1807     ext_sp_e.lParam = 0;
1808     ext_sp_e.wParam = 0;
1809     SPY_GetWndName(&ext_sp_e);
1810     SPY_GetMsgStuff(&ext_sp_e);
1811     return ext_sp_e.msg_name;
1812 }
1813
1814 /***********************************************************************
1815  *           SPY_GetVKeyName
1816  */
1817 const char *SPY_GetVKeyName(WPARAM wParam)
1818 {
1819     const char *vk_key_name;
1820
1821     if(wParam <= SPY_MAX_VKKEYSNUM && VK_KeyNames[wParam])
1822         vk_key_name = VK_KeyNames[wParam];
1823     else
1824         vk_key_name = "VK_???";
1825
1826     return vk_key_name;
1827 }
1828
1829 /***********************************************************************
1830  *           SPY_Bsearch_Notify
1831  */
1832 const SPY_NOTIFY *SPY_Bsearch_Notify( const SPY_NOTIFY *first, const SPY_NOTIFY *last, UINT code)
1833 {
1834     INT count;
1835     const SPY_NOTIFY *test;
1836
1837     while (last >= first) {
1838         count = 1 + last - first;
1839         if (count < 3) {
1840             /* TRACE("code=%d, f-value=%d, f-name=%s, l-value=%d, l-name=%s, l-len=%d,\n",
1841                code, first->value, first->name, last->value, last->name, last->len); */
1842             if (first->value == code) return first;
1843             if (last->value == code) return last;
1844             return NULL;
1845         }
1846         count = count / 2;
1847         test = first + count;
1848         /* TRACE("first=%p, last=%p, test=%p, t-value=%d, code=%d, count=%d\n",
1849            first, last, test, test->value, code, count); */
1850         if (test->value == code) return test;
1851         if (test->value < code)
1852             last = test - 1;
1853         else
1854             first = test + 1;
1855     }
1856     return NULL;
1857 }
1858
1859 /***********************************************************************
1860  *           SPY_DumpMem
1861  */
1862 void SPY_DumpMem (LPSTR header, UINT *q, INT len)
1863 {
1864     int i;
1865
1866     for(i=0; i<len-12; i+=16) {
1867         TRACE("%s [%04x] %08x %08x %08x %08x\n",
1868               header, i, *q, *(q+1), *(q+2), *(q+3));
1869         q += 4;
1870     }
1871     switch (len - i) {
1872     case 12:
1873         TRACE("%s [%04x] %08x %08x %08x\n",
1874               header, i, *q, *(q+1), *(q+2));
1875         break;
1876     case 8:
1877         TRACE("%s [%04x] %08x %08x\n",
1878               header, i, *q, *(q+1));
1879         break;
1880     case 4:
1881         TRACE("%s [%04x] %08x\n",
1882               header, i, *q);
1883         break;
1884     default:
1885         break;
1886     }
1887 }
1888
1889 /***********************************************************************
1890  *           SPY_DumpStructure
1891  */
1892 void SPY_DumpStructure (SPY_INSTANCE *sp_e, BOOL enter)
1893 {
1894     switch (sp_e->msgnum)
1895         {
1896         case WM_DRAWITEM:
1897             if (!enter) break;
1898             {   
1899                 DRAWITEMSTRUCT *lpdis = (DRAWITEMSTRUCT*) sp_e->lParam;
1900                 TRACE("DRAWITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n", 
1901                       lpdis->CtlType, lpdis->CtlID);
1902                 TRACE("itemID=0x%08x itemAction=0x%08x itemState=0x%08x\n", 
1903                       lpdis->itemID, lpdis->itemAction, lpdis->itemState);
1904                 TRACE("hWnd=0x%04x hDC=0x%04x (%d,%d)-(%d,%d) itemData=0x%08lx\n",
1905                       lpdis->hwndItem, lpdis->hDC, lpdis->rcItem.left, 
1906                       lpdis->rcItem.top, lpdis->rcItem.right,
1907                       lpdis->rcItem.bottom, lpdis->itemData);
1908             }
1909             break;
1910         case WM_MEASUREITEM:
1911             {   
1912                 MEASUREITEMSTRUCT *lpmis = (MEASUREITEMSTRUCT*) sp_e->lParam;
1913                 TRACE("MEASUREITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n", 
1914                       lpmis->CtlType, lpmis->CtlID);
1915                 TRACE("itemID=0x%08x itemWidth=0x%08x itemHeight=0x%08x\n", 
1916                       lpmis->itemID, lpmis->itemWidth, lpmis->itemHeight);
1917                 TRACE("itemData=0x%08lx\n", lpmis->itemData);
1918             }
1919             break;
1920         case WM_WINDOWPOSCHANGED:
1921             if (!enter) break;
1922         case WM_WINDOWPOSCHANGING:
1923             {   
1924                 WINDOWPOS *lpwp = (WINDOWPOS *)sp_e->lParam;
1925                 TRACE("WINDOWPOS hwnd=0x%04x, after=0x%04x, at (%d,%d) w=%d h=%d, flags=0x%08x\n",
1926                       lpwp->hwnd, lpwp->hwndInsertAfter, lpwp->x, lpwp->y,
1927                       lpwp->cx, lpwp->cy, lpwp->flags);
1928             }
1929             break;
1930         case WM_STYLECHANGED:
1931             if (!enter) break;
1932         case WM_STYLECHANGING:
1933             {   
1934                 LPSTYLESTRUCT ss = (LPSTYLESTRUCT) sp_e->lParam;
1935                 TRACE("STYLESTRUCT: StyleOld=0x%08lx, StyleNew=0x%08lx\n",
1936                       ss->styleOld, ss->styleNew); 
1937             }
1938             break;
1939         case WM_NCCALCSIZE:
1940             {
1941                 RECT *rc = (RECT *)sp_e->lParam;
1942                 TRACE("Rect (%d,%d)-(%d,%d)\n",
1943                       rc->left, rc->top, rc->right, rc->bottom);
1944             }
1945             break;
1946         case WM_NOTIFY:
1947             if (!enter) break;
1948             {   
1949                 NMHDR * pnmh = (NMHDR*) sp_e->lParam;
1950                 UINT *q;
1951                 const SPY_NOTIFY *p;
1952
1953                 p = SPY_Bsearch_Notify (&spnfy_array[0], end_spnfy_array, 
1954                                         pnmh->code);
1955                 if (p) {
1956                     TRACE("NMHDR hwndFrom=0x%08x idFrom=0x%08x code=%s<0x%08x>, extra=0x%x\n",
1957                           pnmh->hwndFrom, pnmh->idFrom, p->name, pnmh->code, p->len);
1958                     if (p->len > 0) {
1959                         q = (UINT *)(pnmh + 1);
1960                         SPY_DumpMem ("NM extra", q, (INT)p->len);
1961                     }
1962                 }
1963                 else
1964                     TRACE("NMHDR hwndFrom=0x%08x idFrom=0x%08x code=0x%08x\n",
1965                           pnmh->hwndFrom, pnmh->idFrom, pnmh->code);
1966             }
1967         default:
1968             if (sp_e->data_len > 0)
1969                 SPY_DumpMem ("MSG lParam", (UINT *)sp_e->lParam, sp_e->data_len);
1970             break;
1971         }
1972         
1973 }
1974 /***********************************************************************
1975  *           SPY_EnterMessage
1976  */
1977 void SPY_EnterMessage( INT iFlag, HWND hWnd, UINT msg,
1978                        WPARAM wParam, LPARAM lParam )
1979 {
1980     SPY_INSTANCE sp_e;
1981     int indent;
1982
1983     if (!TRACE_ON(message) || SPY_EXCLUDE(msg)) return;
1984
1985     sp_e.msgnum = msg;
1986     sp_e.msg_hwnd   = hWnd;
1987     sp_e.lParam = lParam;
1988     sp_e.wParam = wParam;
1989     SPY_GetWndName(&sp_e);
1990     SPY_GetMsgStuff(&sp_e);
1991     indent = get_indent_level();
1992
1993     /* each SPY_SENDMESSAGE must be complemented by call to SPY_ExitMessage */
1994     switch(iFlag)
1995     {
1996     case SPY_DISPATCHMESSAGE16:
1997         TRACE("%*s(%04x) %-16s message [%04x] %s dispatched  wp=%04x lp=%08lx\n",
1998               indent, "", WIN_Handle16(hWnd),
1999               debugstr_w(sp_e.wnd_name), msg, sp_e.msg_name, wParam, lParam);
2000         break;
2001
2002     case SPY_DISPATCHMESSAGE:
2003         TRACE("%*s(%08x) %-16s message [%04x] %s dispatched  wp=%08x lp=%08lx\n",
2004                         indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg, 
2005                         sp_e.msg_name, wParam, lParam);
2006         break;
2007
2008     case SPY_SENDMESSAGE16:
2009     case SPY_SENDMESSAGE:
2010         {
2011             char taskName[30];
2012             HTASK16 hTask = GetWindowTask16( WIN_Handle16(hWnd) );
2013
2014             if (hTask == GetCurrentTask()) strcpy( taskName, "self" );
2015             else if (!hTask) strcpy( taskName, "Wine" );
2016             else
2017             {
2018                 sprintf( taskName, "task %04x ???", hTask );
2019                 GetModuleName16( hTask, taskName + 10, sizeof(taskName) - 10 );
2020             }
2021
2022             if (iFlag == SPY_SENDMESSAGE16)
2023                 TRACE("%*s(%04x) %-16s message [%04x] %s sent from %s wp=%04x lp=%08lx\n",
2024                       indent, "", WIN_Handle16(hWnd), debugstr_w(sp_e.wnd_name), msg,
2025                       sp_e.msg_name, taskName, wParam, lParam );
2026             else
2027             {   TRACE("%*s(%08x) %-16s message [%04x] %s sent from %s wp=%08x lp=%08lx\n",
2028                              indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
2029                              sp_e.msg_name, taskName, wParam, lParam );
2030                 SPY_DumpStructure(&sp_e, TRUE);
2031             }
2032         }
2033         break;   
2034
2035     case SPY_DEFWNDPROC16:
2036         if( SPY_ExcludeDWP ) return;
2037         TRACE("%*s(%04x)  DefWindowProc16: %s [%04x]  wp=%04x lp=%08lx\n",
2038               indent, "", WIN_Handle16(hWnd), sp_e.msg_name, msg, wParam, lParam );
2039         break;
2040
2041     case SPY_DEFWNDPROC:
2042         if( SPY_ExcludeDWP ) return;
2043         TRACE("%*s(%08x)  DefWindowProc32: %s [%04x]  wp=%08x lp=%08lx\n",
2044                         indent, "", hWnd, sp_e.msg_name,
2045                         msg, wParam, lParam );
2046         break;
2047     }
2048     set_indent_level( indent + SPY_INDENT_UNIT );
2049 }
2050
2051
2052 /***********************************************************************
2053  *           SPY_ExitMessage
2054  */
2055 void SPY_ExitMessage( INT iFlag, HWND hWnd, UINT msg, LRESULT lReturn,
2056                        WPARAM wParam, LPARAM lParam )
2057 {
2058     SPY_INSTANCE sp_e;
2059     int indent;
2060
2061     if (!TRACE_ON(message) || SPY_EXCLUDE(msg) ||
2062         (SPY_ExcludeDWP && (iFlag == SPY_RESULT_DEFWND16 || iFlag == SPY_RESULT_DEFWND)) )
2063         return;
2064
2065     sp_e.msgnum = msg;
2066     sp_e.msg_hwnd   = hWnd;
2067     sp_e.lParam = lParam;
2068     sp_e.wParam = wParam;
2069     SPY_GetWndName(&sp_e);
2070     SPY_GetMsgStuff(&sp_e);
2071
2072     if ((indent = get_indent_level()))
2073     {
2074         indent -= SPY_INDENT_UNIT;
2075         set_indent_level( indent );
2076     }
2077
2078     switch(iFlag)
2079     {
2080     case SPY_RESULT_DEFWND16:
2081         TRACE(" %*s(%04x)  DefWindowProc16: %s [%04x] returned %08lx\n",
2082               indent, "", WIN_Handle16(hWnd), sp_e.msg_name, msg, lReturn );
2083         break;
2084
2085     case SPY_RESULT_DEFWND:
2086         TRACE(" %*s(%08x)  DefWindowProc32: %s [%04x] returned %08lx\n",
2087                         indent, "", hWnd, sp_e.msg_name, msg, lReturn );
2088         break;
2089
2090     case SPY_RESULT_OK16:
2091         TRACE(" %*s(%04x) %-16s message [%04x] %s returned %08lx\n",
2092               indent, "", WIN_Handle16(hWnd), debugstr_w(sp_e.wnd_name), msg,
2093               sp_e.msg_name, lReturn );
2094         break;
2095
2096     case SPY_RESULT_OK:
2097         TRACE(" %*s(%08x) %-16s message [%04x] %s returned %08lx\n",
2098                         indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
2099                         sp_e.msg_name, lReturn );
2100         SPY_DumpStructure(&sp_e, FALSE);
2101         break; 
2102
2103     case SPY_RESULT_INVALIDHWND16:
2104         WARN(" %*s(%04x) %-16s message [%04x] %s HAS INVALID HWND\n",
2105              indent, "", WIN_Handle16(hWnd), debugstr_w(sp_e.wnd_name), msg, sp_e.msg_name );
2106         break;
2107
2108     case SPY_RESULT_INVALIDHWND:
2109         WARN(" %*s(%08x) %-16s message [%04x] %s HAS INVALID HWND\n",
2110                         indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
2111                         sp_e.msg_name );
2112         break;
2113    }
2114 }
2115
2116
2117 /***********************************************************************
2118  *           SPY_Init
2119  */
2120 int SPY_Init(void)
2121 {
2122     int i, j;
2123     char buffer[1024];
2124     const SPY_NOTIFY *p;
2125     const USER_MSG *q;
2126     HKEY hkey;
2127
2128     if (!TRACE_ON(message)) return TRUE;
2129
2130     indent_tls_index = TlsAlloc();
2131     buffer[0] = 0;
2132     if(!RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config\\Spy", &hkey))
2133     {
2134         DWORD type, count = sizeof(buffer);
2135         RegQueryValueExA(hkey, "Include", 0, &type, buffer, &count);
2136         RegCloseKey(hkey);
2137     }
2138     if (buffer[0] && strcmp( buffer, "INCLUDEALL" ))
2139     {
2140         TRACE("Include=%s\n", buffer );
2141         for (i = 0; i <= SPY_MAX_MSGNUM; i++)
2142             SPY_Exclude[i] = (MessageTypeNames[i] && !strstr(buffer,MessageTypeNames[i]));
2143     }
2144
2145     buffer[0] = 0;
2146     if(!RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config\\Spy", &hkey))
2147     {
2148         DWORD type, count = sizeof(buffer);
2149         RegQueryValueExA(hkey, "Exclude", 0, &type, buffer, &count);
2150         RegCloseKey(hkey);
2151     }
2152     if (buffer[0])
2153     {
2154         TRACE("Exclude=%s\n", buffer );
2155         if (!strcmp( buffer, "EXCLUDEALL" ))
2156             for (i = 0; i <= SPY_MAX_MSGNUM; i++) SPY_Exclude[i] = TRUE;
2157         else
2158             for (i = 0; i <= SPY_MAX_MSGNUM; i++)
2159                 SPY_Exclude[i] = (MessageTypeNames[i] && strstr(buffer,MessageTypeNames[i]));
2160     }
2161
2162     SPY_ExcludeDWP = 0;
2163     if(!RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config\\Spy", &hkey))
2164     {
2165         DWORD type, count = sizeof(buffer);
2166         if(!RegQueryValueExA(hkey, "ExcludeDWP", 0, &type, buffer, &count))
2167             SPY_ExcludeDWP = atoi(buffer);
2168         RegCloseKey(hkey);
2169     }
2170
2171     /* find last good entry in spy notify array and save addr for b-search */
2172     p = &spnfy_array[0];
2173     j = 0xffffffff;
2174     while (p->name) {
2175         if ((UINT)p->value > (UINT)j) {
2176             ERR("Notify message array out of order\n");
2177             ERR("  between values [%08x] %s and [%08x] %s\n",
2178                 j, (p-1)->name, p->value, p->name);
2179             break;
2180         }
2181         j = p->value;
2182         p++;
2183     }
2184     p--;
2185     end_spnfy_array = p;
2186
2187     /* find last good entry in each common control message array 
2188      *  and save addr for b-search.
2189      */
2190     i = 0;
2191     while (cc_array[i].classname) {
2192
2193         j = 0x0400; /* minimum entry in array */
2194         q = cc_array[i].classmsg;
2195         while(q->name) {
2196             if (q->value <= j) {
2197                 ERR("Class message array out of order for class %s\n",
2198                     debugstr_w(cc_array[i].classname));
2199                 ERR("  between values [%04x] %s and [%04x] %s\n",
2200                     j, (q-1)->name, q->value, q->name);
2201                 break;
2202             }
2203             j = q->value;
2204             q++;
2205         }
2206         q--;
2207         cc_array[i].lastmsg = (USER_MSG *)q;
2208
2209         i++;
2210     }
2211
2212     return 1;
2213 }