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