Fixed bugs in safe arrays.
[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_FindWndPtr( sp_e->msg_hwnd );
1714     if( pWnd )
1715     {
1716         LPSTR p = (LPSTR)&sp_e->wnd_name;
1717         LPSTR s = (LPSTR)&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         GlobalGetAtomNameA((ATOM) GetClassWord(pWnd->hwndSelf, GCW_ATOM), 
1724                                (LPSTR)&sp_e->wnd_class, 
1725                                sizeof(sp_e->wnd_class)-1);
1726         SetLastError(save_error);
1727
1728         if( pWnd->text && pWnd->text[0] != '\0' )
1729         {
1730             LPWSTR src = pWnd->text;
1731             int n=sizeof(sp_e->wnd_name)-2;
1732             *(p++) = postfix = '\"';
1733             while ((n-- > 0) && *src) *p++ = *src++;
1734         }
1735         else /* get class name */
1736         {
1737             LPSTR src = (LPSTR)&sp_e->wnd_class;
1738             int n=sizeof(sp_e->wnd_name)-2;
1739             *(p++) = '{';
1740             while ((n-- > 0) && *src) *p++ = *src++;
1741             postfix='}';
1742         }
1743
1744         if( p-s >= sizeof(sp_e->wnd_name)-1 ) {
1745             p = s + sizeof(sp_e->wnd_name)-5;
1746             *(p++) = '.';
1747             *(p++) = '.';
1748             *(p++) = '.';
1749         }
1750         *(p++) = postfix;
1751         *(p++) = '\0';
1752         WIN_ReleaseWndPtr(pWnd);
1753
1754     }
1755     else {strcpy( sp_e->wnd_name, "\"NULL\"" ); sp_e->wnd_class[0] = 0;}
1756     return;
1757 }
1758
1759 /***********************************************************************
1760  *           SPY_GetMsgName
1761  *
1762  *  ****  External function  **** 
1763  *
1764  *  Get message name
1765  */
1766 const char *SPY_GetMsgName( UINT msg, HWND hWnd )
1767 {
1768     ext_sp_e.msgnum = msg;
1769     ext_sp_e.msg_hwnd   = hWnd;
1770     ext_sp_e.lParam = 0;
1771     ext_sp_e.wParam = 0;
1772     SPY_GetWndName(&ext_sp_e);
1773     SPY_GetMsgStuff(&ext_sp_e);
1774     return ext_sp_e.msg_name;
1775 }
1776
1777 /***********************************************************************
1778  *           SPY_GetVKeyName
1779  */
1780 const char *SPY_GetVKeyName(WPARAM wParam)
1781 {
1782     const char *vk_key_name;
1783
1784     if(wParam <= SPY_MAX_VKKEYSNUM && VK_KeyNames[wParam])
1785         vk_key_name = VK_KeyNames[wParam];
1786     else
1787         vk_key_name = "VK_???";
1788
1789     return vk_key_name;
1790 }
1791
1792 /***********************************************************************
1793  *           SPY_Bsearch_Notify
1794  */
1795 const SPY_NOTIFY *SPY_Bsearch_Notify( const SPY_NOTIFY *first, const SPY_NOTIFY *last, UINT code)
1796 {
1797     INT count;
1798     const SPY_NOTIFY *test;
1799
1800     while (last >= first) {
1801         count = 1 + last - first;
1802         if (count < 3) {
1803             /* TRACE("code=%d, f-value=%d, f-name=%s, l-value=%d, l-name=%s, l-len=%d,\n",
1804                code, first->value, first->name, last->value, last->name, last->len); */
1805             if (first->value == code) return first;
1806             if (last->value == code) return last;
1807             return NULL;
1808         }
1809         count = count / 2;
1810         test = first + count;
1811         /* TRACE("first=%p, last=%p, test=%p, t-value=%d, code=%d, count=%d\n",
1812            first, last, test, test->value, code, count); */
1813         if (test->value == code) return test;
1814         if (test->value < code)
1815             last = test - 1;
1816         else
1817             first = test + 1;
1818     }
1819     return NULL;
1820 }
1821
1822 /***********************************************************************
1823  *           SPY_DumpMem
1824  */
1825 void SPY_DumpMem (LPSTR header, UINT *q, INT len)
1826 {
1827     int i;
1828
1829     for(i=0; i<len-12; i+=16) {
1830         TRACE("%s [%04x] %08x %08x %08x %08x\n",
1831               header, i, *q, *(q+1), *(q+2), *(q+3));
1832         q += 4;
1833     }
1834     switch (len - i) {
1835     case 12:
1836         TRACE("%s [%04x] %08x %08x %08x\n",
1837               header, i, *q, *(q+1), *(q+2));
1838         break;
1839     case 8:
1840         TRACE("%s [%04x] %08x %08x\n",
1841               header, i, *q, *(q+1));
1842         break;
1843     case 4:
1844         TRACE("%s [%04x] %08x\n",
1845               header, i, *q);
1846         break;
1847     default:
1848         break;
1849     }
1850 }
1851
1852 /***********************************************************************
1853  *           SPY_DumpStructure
1854  */
1855 void SPY_DumpStructure (SPY_INSTANCE *sp_e, BOOL enter)
1856 {
1857     switch (sp_e->msgnum)
1858         {
1859         case WM_DRAWITEM:
1860             if (!enter) break;
1861             {   
1862                 DRAWITEMSTRUCT *lpdis = (DRAWITEMSTRUCT*) sp_e->lParam;
1863                 TRACE("DRAWITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n", 
1864                       lpdis->CtlType, lpdis->CtlID);
1865                 TRACE("itemID=0x%08x itemAction=0x%08x itemState=0x%08x\n", 
1866                       lpdis->itemID, lpdis->itemAction, lpdis->itemState);
1867                 TRACE("hWnd=0x%04x hDC=0x%04x (%d,%d)-(%d,%d) itemData=0x%08lx\n",
1868                       lpdis->hwndItem, lpdis->hDC, lpdis->rcItem.left, 
1869                       lpdis->rcItem.top, lpdis->rcItem.right,
1870                       lpdis->rcItem.bottom, lpdis->itemData);
1871             }
1872             break;
1873         case WM_MEASUREITEM:
1874             {   
1875                 MEASUREITEMSTRUCT *lpmis = (MEASUREITEMSTRUCT*) sp_e->lParam;
1876                 TRACE("MEASUREITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n", 
1877                       lpmis->CtlType, lpmis->CtlID);
1878                 TRACE("itemID=0x%08x itemWidth=0x%08x itemHeight=0x%08x\n", 
1879                       lpmis->itemID, lpmis->itemWidth, lpmis->itemHeight);
1880                 TRACE("itemData=0x%08lx\n", lpmis->itemData);
1881             }
1882             break;
1883         case WM_WINDOWPOSCHANGED:
1884             if (!enter) break;
1885         case WM_WINDOWPOSCHANGING:
1886             {   
1887                 WINDOWPOS *lpwp = (WINDOWPOS *)sp_e->lParam;
1888                 TRACE("WINDOWPOS hwnd=0x%04x, after=0x%04x, at (%d,%d) w=%d h=%d, flags=0x%08x\n",
1889                       lpwp->hwnd, lpwp->hwndInsertAfter, lpwp->x, lpwp->y,
1890                       lpwp->cx, lpwp->cy, lpwp->flags);
1891             }
1892             break;
1893         case WM_STYLECHANGED:
1894             if (!enter) break;
1895         case WM_STYLECHANGING:
1896             {   
1897                 LPSTYLESTRUCT ss = (LPSTYLESTRUCT) sp_e->lParam;
1898                 TRACE("STYLESTRUCT: StyleOld=0x%08lx, StyleNew=0x%08lx\n",
1899                       ss->styleOld, ss->styleNew); 
1900             }
1901             break;
1902         case WM_NCCALCSIZE:
1903             {
1904                 RECT *rc = (RECT *)sp_e->lParam;
1905                 TRACE("Rect (%d,%d)-(%d,%d)\n",
1906                       rc->left, rc->top, rc->right, rc->bottom);
1907             }
1908             break;
1909         case WM_NOTIFY:
1910             if (!enter) break;
1911             {   
1912                 NMHDR * pnmh = (NMHDR*) sp_e->lParam;
1913                 UINT *q;
1914                 const SPY_NOTIFY *p;
1915
1916                 p = SPY_Bsearch_Notify (&spnfy_array[0], end_spnfy_array, 
1917                                         pnmh->code);
1918                 if (p) {
1919                     TRACE("NMHDR hwndFrom=0x%08x idFrom=0x%08x code=%s<0x%08x>, extra=0x%x\n",
1920                           pnmh->hwndFrom, pnmh->idFrom, p->name, pnmh->code, p->len);
1921                     if (p->len > 0) {
1922                         q = (UINT *)(pnmh + 1);
1923                         SPY_DumpMem ("NM extra", q, (INT)p->len);
1924                     }
1925                 }
1926                 else
1927                     TRACE("NMHDR hwndFrom=0x%08x idFrom=0x%08x code=0x%08x\n",
1928                           pnmh->hwndFrom, pnmh->idFrom, pnmh->code);
1929             }
1930         default:
1931             if (sp_e->data_len > 0)
1932                 SPY_DumpMem ("MSG lParam", (UINT *)sp_e->lParam, sp_e->data_len);
1933             break;
1934         }
1935         
1936 }
1937 /***********************************************************************
1938  *           SPY_EnterMessage
1939  */
1940 void SPY_EnterMessage( INT iFlag, HWND hWnd, UINT msg,
1941                        WPARAM wParam, LPARAM lParam )
1942 {
1943     SPY_INSTANCE sp_e;
1944
1945     if (!TRACE_ON(message) || SPY_EXCLUDE(msg)) return;
1946
1947     sp_e.msgnum = msg;
1948     sp_e.msg_hwnd   = hWnd;
1949     sp_e.lParam = lParam;
1950     sp_e.wParam = wParam;
1951     SPY_GetWndName(&sp_e);
1952     SPY_GetMsgStuff(&sp_e);
1953
1954     /* each SPY_SENDMESSAGE must be complemented by call to SPY_ExitMessage */
1955     switch(iFlag)
1956     {
1957     case SPY_DISPATCHMESSAGE16:
1958         TRACE("%*s(%04x) %-16s message [%04x] %s dispatched  wp=%04x lp=%08lx\n",
1959               SPY_IndentLevel, "", WIN_Handle16(hWnd),
1960               sp_e.wnd_name, msg, sp_e.msg_name, wParam, lParam);
1961         break;
1962
1963     case SPY_DISPATCHMESSAGE:
1964         TRACE("%*s(%08x) %-16s message [%04x] %s dispatched  wp=%08x lp=%08lx\n",
1965                         SPY_IndentLevel, "", hWnd, sp_e.wnd_name, msg, 
1966                         sp_e.msg_name, wParam, lParam);
1967         break;
1968
1969     case SPY_SENDMESSAGE16:
1970     case SPY_SENDMESSAGE:
1971         {
1972             char taskName[30];
1973             HTASK16 hTask = GetWindowTask16( WIN_Handle16(hWnd) );
1974
1975             if (hTask == GetCurrentTask()) strcpy( taskName, "self" );
1976             else if (!hTask) strcpy( taskName, "Wine" );
1977             else
1978             {
1979                 sprintf( taskName, "task %04x ???", hTask );
1980                 GetModuleName16( hTask, taskName + 10, sizeof(taskName) - 10 );
1981             }
1982
1983             if (iFlag == SPY_SENDMESSAGE16)
1984                 TRACE("%*s(%04x) %-16s message [%04x] %s sent from %s wp=%04x lp=%08lx\n",
1985                       SPY_IndentLevel, "", WIN_Handle16(hWnd), sp_e.wnd_name, msg,
1986                       sp_e.msg_name, taskName, wParam, lParam );
1987             else
1988             {   TRACE("%*s(%08x) %-16s message [%04x] %s sent from %s wp=%08x lp=%08lx\n",
1989                              SPY_IndentLevel, "", hWnd, sp_e.wnd_name, msg,
1990                              sp_e.msg_name, taskName, wParam, lParam );
1991                 SPY_DumpStructure(&sp_e, TRUE);
1992             }
1993         }
1994         break;   
1995
1996     case SPY_DEFWNDPROC16:
1997         if( SPY_ExcludeDWP ) return;
1998         TRACE("%*s(%04x)  DefWindowProc16: %s [%04x]  wp=%04x lp=%08lx\n",
1999               SPY_IndentLevel, "", WIN_Handle16(hWnd), sp_e.msg_name, msg, wParam, lParam );
2000         break;
2001
2002     case SPY_DEFWNDPROC:
2003         if( SPY_ExcludeDWP ) return;
2004         TRACE("%*s(%08x)  DefWindowProc32: %s [%04x]  wp=%08x lp=%08lx\n",
2005                         SPY_IndentLevel, "", hWnd, sp_e.msg_name,
2006                         msg, wParam, lParam );
2007         break;
2008     }  
2009     SPY_IndentLevel += SPY_INDENT_UNIT;
2010 }
2011
2012
2013 /***********************************************************************
2014  *           SPY_ExitMessage
2015  */
2016 void SPY_ExitMessage( INT iFlag, HWND hWnd, UINT msg, LRESULT lReturn,
2017                        WPARAM wParam, LPARAM lParam )
2018 {
2019     SPY_INSTANCE sp_e;
2020
2021     if (!TRACE_ON(message) || SPY_EXCLUDE(msg) ||
2022         (SPY_ExcludeDWP && (iFlag == SPY_RESULT_DEFWND16 || iFlag == SPY_RESULT_DEFWND)) )
2023         return;
2024
2025     sp_e.msgnum = msg;
2026     sp_e.msg_hwnd   = hWnd;
2027     sp_e.lParam = lParam;
2028     sp_e.wParam = wParam;
2029     SPY_GetWndName(&sp_e);
2030     SPY_GetMsgStuff(&sp_e);
2031
2032     if (SPY_IndentLevel) SPY_IndentLevel -= SPY_INDENT_UNIT;
2033
2034     switch(iFlag)
2035     {
2036     case SPY_RESULT_DEFWND16:
2037         TRACE(" %*s(%04x)  DefWindowProc16: %s [%04x] returned %08lx\n",
2038               SPY_IndentLevel, "", WIN_Handle16(hWnd), sp_e.msg_name, msg, lReturn );
2039         break;
2040
2041     case SPY_RESULT_DEFWND:
2042         TRACE(" %*s(%08x)  DefWindowProc32: %s [%04x] returned %08lx\n",
2043                         SPY_IndentLevel, "", hWnd, sp_e.msg_name, msg, lReturn );
2044         break;
2045
2046     case SPY_RESULT_OK16:
2047         TRACE(" %*s(%04x) %-16s message [%04x] %s returned %08lx\n",
2048               SPY_IndentLevel, "", WIN_Handle16(hWnd), sp_e.wnd_name, msg,
2049               sp_e.msg_name, lReturn );
2050         break;
2051
2052     case SPY_RESULT_OK:
2053         TRACE(" %*s(%08x) %-16s message [%04x] %s returned %08lx\n",
2054                         SPY_IndentLevel, "", hWnd, sp_e.wnd_name, msg,
2055                         sp_e.msg_name, lReturn );
2056         SPY_DumpStructure(&sp_e, FALSE);
2057         break; 
2058
2059     case SPY_RESULT_INVALIDHWND16:
2060         WARN(" %*s(%04x) %-16s message [%04x] %s HAS INVALID HWND\n",
2061              SPY_IndentLevel, "", WIN_Handle16(hWnd), sp_e.wnd_name, msg, sp_e.msg_name );
2062         break;
2063
2064     case SPY_RESULT_INVALIDHWND:
2065         WARN(" %*s(%08x) %-16s message [%04x] %s HAS INVALID HWND\n",
2066                         SPY_IndentLevel, "", hWnd, sp_e.wnd_name, msg,
2067                         sp_e.msg_name );
2068         break;
2069    }
2070 }
2071
2072
2073 /***********************************************************************
2074  *           SPY_Init
2075  */
2076 int SPY_Init(void)
2077 {
2078     int i, j;
2079     char buffer[1024];
2080     const SPY_NOTIFY *p;
2081     const USER_MSG *q;
2082     HKEY hkey;
2083
2084     if (!TRACE_ON(message)) return TRUE;
2085
2086     buffer[0] = 0;
2087     if(!RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config\\Spy", &hkey))
2088     {
2089         DWORD type, count = sizeof(buffer);
2090         RegQueryValueExA(hkey, "Include", 0, &type, buffer, &count);
2091         RegCloseKey(hkey);
2092     }
2093     if (buffer[0] && strcmp( buffer, "INCLUDEALL" ))
2094     {
2095         TRACE("Include=%s\n", buffer );
2096         for (i = 0; i <= SPY_MAX_MSGNUM; i++)
2097             SPY_Exclude[i] = (MessageTypeNames[i] && !strstr(buffer,MessageTypeNames[i]));
2098     }
2099
2100     buffer[0] = 0;
2101     if(!RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config\\Spy", &hkey))
2102     {
2103         DWORD type, count = sizeof(buffer);
2104         RegQueryValueExA(hkey, "Exclude", 0, &type, buffer, &count);
2105         RegCloseKey(hkey);
2106     }
2107     if (buffer[0])
2108     {
2109         TRACE("Exclude=%s\n", buffer );
2110         if (!strcmp( buffer, "EXCLUDEALL" ))
2111             for (i = 0; i <= SPY_MAX_MSGNUM; i++) SPY_Exclude[i] = TRUE;
2112         else
2113             for (i = 0; i <= SPY_MAX_MSGNUM; i++)
2114                 SPY_Exclude[i] = (MessageTypeNames[i] && strstr(buffer,MessageTypeNames[i]));
2115     }
2116
2117     SPY_ExcludeDWP = 0;
2118     if(!RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config\\Spy", &hkey))
2119     {
2120         DWORD type, count = sizeof(buffer);
2121         if(!RegQueryValueExA(hkey, "ExcludeDWP", 0, &type, buffer, &count))
2122             SPY_ExcludeDWP = atoi(buffer);
2123         RegCloseKey(hkey);
2124     }
2125
2126     /* find last good entry in spy notify array and save addr for b-search */
2127     p = &spnfy_array[0];
2128     j = 0xffffffff;
2129     while (p->name) {
2130         if ((UINT)p->value > (UINT)j) {
2131             ERR("Notify message array out of order\n");
2132             ERR("  between values [%08x] %s and [%08x] %s\n",
2133                 j, (p-1)->name, p->value, p->name);
2134             break;
2135         }
2136         j = p->value;
2137         p++;
2138     }
2139     p--;
2140     end_spnfy_array = p;
2141
2142     /* find last good entry in each common control message array 
2143      *  and save addr for b-search.
2144      */
2145     i = 0;
2146     while (cc_array[i].classname) {
2147
2148         j = 0x0400; /* minimum entry in array */
2149         q = cc_array[i].classmsg;
2150         while(q->name) {
2151             if (q->value <= j) {
2152                 ERR("Class message array out of order for class ""%s""\n",
2153                     cc_array[i].classname);
2154                 ERR("  between values [%04x] %s and [%04x] %s\n",
2155                     j, (q-1)->name, q->value, q->name);
2156                 break;
2157             }
2158             j = q->value;
2159             q++;
2160         }
2161         q--;
2162         cc_array[i].lastmsg = (USER_MSG *)q;
2163
2164         i++;
2165     }
2166
2167     return 1;
2168 }