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