- print out WM_NOTIFY message code if we know it.
[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 "wine/winuser16.h"
14 #include "wine/winbase16.h"
15 #include "win.h"
16 #include "options.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_GETSEL32",              /* 0x00b0 */
155     "EM_SETSEL32",              /* 0x00b1 */
156     "EM_GETRECT32",             /* 0x00b2 */
157     "EM_SETRECT32",             /* 0x00b3 */
158     "EM_SETRECTNP32",           /* 0x00b4 */
159     "EM_SCROLL32",              /* 0x00b5 */
160     "EM_LINESCROLL32",          /* 0x00b6 */
161     "EM_SCROLLCARET32",         /* 0x00b7 */
162     "EM_GETMODIFY32",           /* 0x00b8 */
163     "EM_SETMODIFY32",           /* 0x00b9 */
164     "EM_GETLINECOUNT32",        /* 0x00ba */
165     "EM_LINEINDEX32",           /* 0x00bb */
166     "EM_SETHANDLE32",           /* 0x00bc */
167     "EM_GETHANDLE32",           /* 0x00bd */
168     "EM_GETTHUMB32",            /* 0x00be */
169     NULL,                       /* 0x00bf */
170
171     NULL,                       /* 0x00c0 */
172     "EM_LINELENGTH32",          /* 0x00c1 */
173     "EM_REPLACESEL32",          /* 0x00c2 */
174     NULL,                       /* 0x00c3 */
175     "EM_GETLINE32",             /* 0x00c4 */
176     "EM_LIMITTEXT32",           /* 0x00c5 */
177     "EM_CANUNDO32",             /* 0x00c6 */
178     "EM_UNDO32",                /* 0x00c7 */
179     "EM_FMTLINES32",            /* 0x00c8 */
180     "EM_LINEFROMCHAR32",        /* 0x00c9 */
181     NULL,                       /* 0x00ca */
182     "EM_SETTABSTOPS32",         /* 0x00cb */
183     "EM_SETPASSWORDCHAR32",     /* 0x00cc */
184     "EM_EMPTYUNDOBUFFER32",     /* 0x00cd */
185     "EM_GETFIRSTVISIBLELINE32", /* 0x00ce */
186     "EM_SETREADONLY32",         /* 0x00cf */
187
188     "EM_SETWORDBREAKPROC32",    /* 0x00d0 */
189     "EM_GETWORDBREAKPROC32",    /* 0x00d1 */
190     "EM_GETPASSWORDCHAR32",     /* 0x00d2 */
191     "EM_SETMARGINS32",          /* 0x00d3 */
192     "EM_GETMARGINS32",          /* 0x00d4 */
193     "EM_GETLIMITTEXT32",        /* 0x00d5 */
194     "EM_POSFROMCHAR32",         /* 0x00d6 */
195     "EM_CHARFROMPOS32",         /* 0x00d7 */
196     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
197
198     /* 0x00E0 - Win32 Scrollbars */
199     "SBM_SETPOS32",             /* 0x00e0 */
200     "SBM_GETPOS32",             /* 0x00e1 */
201     "SBM_SETRANGE32",           /* 0x00e2 */
202     "SBM_GETRANGE32",           /* 0x00e3 */
203     "SBM_ENABLE_ARROWS32",      /* 0x00e4 */
204     NULL,
205     "SBM_SETRANGEREDRAW32",     /* 0x00e6 */
206     NULL, NULL,
207     "SBM_SETSCROLLINFO32",      /* 0x00e9 */
208     "SBM_GETSCROLLINFO32",      /* 0x00ea */
209     NULL, NULL, NULL, NULL, NULL,
210
211     /* 0x00F0 - Win32 Buttons */
212     "BM_GETCHECK32",            /* 0x00f0 */
213     "BM_SETCHECK32",            /* 0x00f1 */
214     "BM_GETSTATE32",            /* 0x00f2 */
215     "BM_SETSTATE32",            /* 0x00f3 */
216     "BM_SETSTYLE32",            /* 0x00f4 */
217     "BM_CLICK32",               /* 0x00f5 */
218     "BM_GETIMAGE32",            /* 0x00f6 */
219     "BM_SETIMAGE32",            /* 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_GETEDITSEL32",          /* 0x0140 */
270     "CB_LIMITTEXT32",           /* 0x0141 */
271     "CB_SETEDITSEL32",          /* 0x0142 */
272     "CB_ADDSTRING32",           /* 0x0143 */
273     "CB_DELETESTRING32",        /* 0x0144 */
274     "CB_DIR32",                 /* 0x0145 */
275     "CB_GETCOUNT32",            /* 0x0146 */
276     "CB_GETCURSEL32",           /* 0x0147 */
277     "CB_GETLBTEXT32",           /* 0x0148 */
278     "CB_GETLBTEXTLEN32",        /* 0x0149 */
279     "CB_INSERTSTRING32",        /* 0x014a */
280     "CB_RESETCONTENT32",        /* 0x014b */
281     "CB_FINDSTRING32",          /* 0x014c */
282     "CB_SELECTSTRING32",        /* 0x014d */
283     "CB_SETCURSEL32",           /* 0x014e */
284     "CB_SHOWDROPDOWN32",        /* 0x014f */
285
286     "CB_GETITEMDATA32",         /* 0x0150 */
287     "CB_SETITEMDATA32",         /* 0x0151 */
288     "CB_GETDROPPEDCONTROLRECT32",/* 0x0152 */
289     "CB_SETITEMHEIGHT32",       /* 0x0153 */
290     "CB_GETITEMHEIGHT32",       /* 0x0154 */
291     "CB_SETEXTENDEDUI32",       /* 0x0155 */
292     "CB_GETEXTENDEDUI32",       /* 0x0156 */
293     "CB_GETDROPPEDSTATE32",     /* 0x0157 */
294     "CB_FINDSTRINGEXACT32",     /* 0x0158 */
295     "CB_SETLOCALE32",           /* 0x0159 */
296     "CB_GETLOCALE32",           /* 0x015a */
297     "CB_GETTOPINDEX32",         /* 0x015b */
298     "CB_SETTOPINDEX32",         /* 0x015c */
299     "CB_GETHORIZONTALEXTENT32", /* 0x015d */
300     "CB_SETHORIZONTALEXTENT32", /* 0x015e */
301     "CB_GETDROPPEDWIDTH32",     /* 0x015f */
302
303     "CB_SETDROPPEDWIDTH32",     /* 0x0160 */
304     "CB_INITSTORAGE32",         /* 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_SETICON32",            /* 0x0170 */
310     "STM_GETICON32",            /* 0x0171 */
311     "STM_SETIMAGE32",           /* 0x0172 */
312     "STM_GETIMAGE32",           /* 0x0173 */
313     NULL, NULL, NULL, NULL, 
314     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
315
316     /* 0x0180 - Win32 Listboxes */
317     "LB_ADDSTRING32",           /* 0x0180 */
318     "LB_INSERTSTRING32",        /* 0x0181 */
319     "LB_DELETESTRING32",        /* 0x0182 */
320     "LB_SELITEMRANGEEX32",      /* 0x0183 */
321     "LB_RESETCONTENT32",        /* 0x0184 */
322     "LB_SETSEL32",              /* 0x0185 */
323     "LB_SETCURSEL32",           /* 0x0186 */
324     "LB_GETSEL32",              /* 0x0187 */
325     "LB_GETCURSEL32",           /* 0x0188 */
326     "LB_GETTEXT32",             /* 0x0189 */
327     "LB_GETTEXTLEN32",          /* 0x018a */
328     "LB_GETCOUNT32",            /* 0x018b */
329     "LB_SELECTSTRING32",        /* 0x018c */
330     "LB_DIR32",                 /* 0x018d */
331     "LB_GETTOPINDEX32",         /* 0x018e */
332     "LB_FINDSTRING32",          /* 0x018f */
333
334     "LB_GETSELCOUNT32",         /* 0x0190 */
335     "LB_GETSELITEMS32",         /* 0x0191 */
336     "LB_SETTABSTOPS32",         /* 0x0192 */
337     "LB_GETHORIZONTALEXTENT32", /* 0x0193 */
338     "LB_SETHORIZONTALEXTENT32", /* 0x0194 */
339     "LB_SETCOLUMNWIDTH32",      /* 0x0195 */
340     "LB_ADDFILE32",             /* 0x0196 */
341     "LB_SETTOPINDEX32",         /* 0x0197 */
342     "LB_GETITEMRECT32",         /* 0x0198 */
343     "LB_GETITEMDATA32",         /* 0x0199 */
344     "LB_SETITEMDATA32",         /* 0x019a */
345     "LB_SELITEMRANGE32",        /* 0x019b */
346     "LB_SETANCHORINDEX32",      /* 0x019c */
347     "LB_GETANCHORINDEX32",      /* 0x019d */
348     "LB_SETCARETINDEX32",       /* 0x019e */
349     "LB_GETCARETINDEX32",       /* 0x019f */
350
351     "LB_SETITEMHEIGHT32",       /* 0x01a0 */
352     "LB_GETITEMHEIGHT32",       /* 0x01a1 */
353     "LB_FINDSTRINGEXACT32",     /* 0x01a2 */
354     "LB_CARETON32",             /* 0x01a3 */
355     "LB_CARETOFF32",            /* 0x01a4 */
356     "LB_SETLOCALE32",           /* 0x01a5 */
357     "LB_GETLOCALE32",           /* 0x01a6 */
358     "LB_SETCOUNT32",            /* 0x01a7 */
359     "LB_INITSTORAGE32",         /* 0x01a8 */
360     "LB_ITEMFROMPOINT32",       /* 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, NULL, NULL, NULL, 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     /* 0x0380 */
536     "WM_PENWINFIRST", 
537     "WM_RCRESULT", 
538     "WM_HOOKRCRESULT", 
539     "WM_GLOBALRCCHANGE", 
540     "WM_SKB", 
541     "WM_HEDITCTL", 
542                                         NULL, NULL,
543     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
544
545     "WM_COALESCE_FIRST", 
546           NULL, NULL, NULL, NULL, NULL, NULL, NULL,
547     NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
548     "WM_COALESCE_LAST", 
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"
605 };
606
607
608 #define SPY_MAX_LVMMSGNUM   139
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     "LVM_CREATEDRAGIMAGE",
644     "LVM_GETVIEWRECT",
645     "LVM_GETTEXTCOLOR",
646     "LVM_SETTEXTCOLOR",
647     "LVM_GETTEXTBKCOLOR",
648     "LVM_SETTEXTBKCOLOR",
649     "LVM_GETTOPINDEX",
650     "LVM_GETCOUNTPERPAGE",
651     "LVM_GETORIGIN",
652     "LVM_UPDATE",
653     "LVM_SETITEMSTATE",
654     "LVM_GETITEMSTATE",
655     "LVM_GETITEMTEXTA",
656     "LVM_SETITEMTEXTA",
657     "LVM_SETITEMCOUNT",
658     "LVM_SORTITEMS",
659     "LVM_SETITEMPOSITION32",
660     "LVM_GETSELECTEDCOUNT",
661     "LVM_GETITEMSPACING",
662     "LVM_GETISEARCHSTRINGA",
663     "LVM_SETICONSPACING",
664     "LVM_SETEXTENDEDLISTVIEWSTYLE",
665     "LVM_GETEXTENDEDLISTVIEWSTYLE",
666     "LVM_GETSUBITEMRECT",
667     "LVM_SUBITEMHITTEST",
668     "LVM_SETCOLUMNORDERARRAY",
669     "LVM_GETCOLUMNORDERARRAY",
670     "LVM_SETHOTITEM",
671     "LVM_GETHOTITEM",
672     "LVM_SETHOTCURSOR",
673     "LVM_GETHOTCURSOR",
674     "LVM_APPROXIMATEVIEWRECT",
675     "LVM_SETWORKAREAS",
676     "LVM_GETSELECTIONMARK",
677     "LVM_SETSELECTIONMARK",
678     "LVM_SETBKIMAGEA",
679     "LVM_GETBKIMAGEA",
680     "LVM_GETWORKAREAS",
681     "LVM_SETHOVERTIME",
682     "LVM_GETHOVERTIME",
683     "LVM_GETNUMBEROFWORKAREAS",
684     "LVM_SETTOOLTIPS",
685     "LVM_GETITEMW",
686     "LVM_SETITEMW",
687     "LVM_INSERTITEMW",
688     "LVM_GETTOOLTIPS",
689     NULL,
690     NULL,
691     NULL,
692     NULL,
693     "LVM_FINDITEMW",
694     NULL,
695     NULL,
696     NULL,
697     "LVM_GETSTRINGWIDTHW",
698     NULL,
699     NULL,
700     NULL,
701     NULL,
702     NULL,
703     NULL,
704     NULL,
705     "LVM_GETCOLUMNW",
706     "LVM_SETCOLUMNW",
707     "LVM_INSERTCOLUMNW",
708     NULL,
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     "LVM_GETITEMTEXTW",
726     "LVM_SETITEMTEXTW",
727     "LVM_GETISEARCHSTRINGW",
728     "LVM_EDITLABELW",
729     NULL,
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     "LVM_SETBKIMAGEW",
750     "LVM_GETBKIMAGEW"   /* 0x108B */
751 };
752
753 #define SPY_MAX_CCMMSGNUM   6
754 static const char * const CCMMessageTypeNames[SPY_MAX_CCMMSGNUM + 1] =
755 {
756     NULL,               /* 0x2000 */
757     "CCM_SETBKCOLOR",
758     "CCM_SETCOLORSCHEME",
759     "CCM_GETCOLORSCHEME",
760     "CCM_GETDROPTARGET",
761     "CCM_SETUNICODEFORMAT",
762     "CCM_GETUNICODEFORMAT"
763 };
764
765 /* Virtual key names */
766 #define SPY_MAX_VKKEYSNUM 255
767 static const char * const VK_KeyNames[SPY_MAX_VKKEYSNUM + 1] =
768 {
769     NULL,               /* 0x00 */
770     "VK_LBUTTON",       /* 0x01 */
771     "VK_RBUTTON",       /* 0x02 */
772     "VK_CANCEL",        /* 0x03 */
773     "VK_MBUTTON",       /* 0x04 */
774     NULL,               /* 0x05 */
775     NULL,               /* 0x06 */
776     NULL,               /* 0x07 */
777     "VK_BACK",          /* 0x08 */
778     "VK_TAB",           /* 0x09 */
779     NULL,               /* 0x0A */
780     NULL,               /* 0x0B */
781     "VK_CLEAR",         /* 0x0C */
782     "VK_RETURN",        /* 0x0D */
783     NULL,               /* 0x0E */
784     NULL,               /* 0x0F */
785     "VK_SHIFT",         /* 0x10 */
786     "VK_CONTROL",       /* 0x11 */
787     "VK_MENU",          /* 0x12 */
788     "VK_PAUSE",         /* 0x13 */
789     "VK_CAPITAL",       /* 0x14 */
790     NULL,               /* 0x15 */
791     NULL,               /* 0x16 */
792     NULL,               /* 0x17 */
793     NULL,               /* 0x18 */
794     NULL,               /* 0x19 */
795     NULL,               /* 0x1A */
796     "VK_ESCAPE",        /* 0x1B */
797     NULL,               /* 0x1C */
798     NULL,               /* 0x1D */
799     NULL,               /* 0x1E */
800     NULL,               /* 0x1F */
801     "VK_SPACE",         /* 0x20 */
802     "VK_PRIOR",         /* 0x21 */
803     "VK_NEXT",          /* 0x22 */
804     "VK_END",           /* 0x23 */
805     "VK_HOME",          /* 0x24 */
806     "VK_LEFT",          /* 0x25 */
807     "VK_UP",            /* 0x26 */
808     "VK_RIGHT",         /* 0x27 */
809     "VK_DOWN",          /* 0x28 */
810     "VK_SELECT",        /* 0x29 */
811     "VK_PRINT",         /* 0x2A */
812     "VK_EXECUTE",       /* 0x2B */
813     "VK_SNAPSHOT",      /* 0x2C */
814     "VK_INSERT",        /* 0x2D */
815     "VK_DELETE",        /* 0x2E */
816     "VK_HELP",          /* 0x2F */
817     "VK_0",             /* 0x30 */
818     "VK_1",             /* 0x31 */
819     "VK_2",             /* 0x32 */
820     "VK_3",             /* 0x33 */
821     "VK_4",             /* 0x34 */
822     "VK_5",             /* 0x35 */
823     "VK_6",             /* 0x36 */
824     "VK_7",             /* 0x37 */
825     "VK_8",             /* 0x38 */
826     "VK_9",             /* 0x39 */
827     NULL,               /* 0x3A */
828     NULL,               /* 0x3B */
829     NULL,               /* 0x3C */
830     NULL,               /* 0x3D */
831     NULL,               /* 0x3E */
832     NULL,               /* 0x3F */
833     NULL,               /* 0x40 */
834     "VK_A",             /* 0x41 */
835     "VK_B",             /* 0x42 */
836     "VK_C",             /* 0x43 */
837     "VK_D",             /* 0x44 */
838     "VK_E",             /* 0x45 */
839     "VK_F",             /* 0x46 */
840     "VK_G",             /* 0x47 */
841     "VK_H",             /* 0x48 */
842     "VK_I",             /* 0x49 */
843     "VK_J",             /* 0x4A */
844     "VK_K",             /* 0x4B */
845     "VK_L",             /* 0x4C */
846     "VK_M",             /* 0x4D */
847     "VK_N",             /* 0x4E */
848     "VK_O",             /* 0x4F */
849     "VK_P",             /* 0x50 */
850     "VK_Q",             /* 0x51 */
851     "VK_R",             /* 0x52 */
852     "VK_S",             /* 0x53 */
853     "VK_T",             /* 0x54 */
854     "VK_U",             /* 0x55 */
855     "VK_V",             /* 0x56 */
856     "VK_W",             /* 0x57 */
857     "VK_X",             /* 0x58 */
858     "VK_Y",             /* 0x59 */
859     "VK_Z",             /* 0x5A */
860     "VK_LWIN",          /* 0x5B */
861     "VK_RWIN",          /* 0x5C */
862     "VK_APPS",          /* 0x5D */
863     NULL,               /* 0x5E */
864     NULL,               /* 0x5F */
865     "VK_NUMPAD0",       /* 0x60 */
866     "VK_NUMPAD1",       /* 0x61 */
867     "VK_NUMPAD2",       /* 0x62 */
868     "VK_NUMPAD3",       /* 0x63 */
869     "VK_NUMPAD4",       /* 0x64 */
870     "VK_NUMPAD5",       /* 0x65 */
871     "VK_NUMPAD6",       /* 0x66 */
872     "VK_NUMPAD7",       /* 0x67 */
873     "VK_NUMPAD8",       /* 0x68 */
874     "VK_NUMPAD9",       /* 0x69 */
875     "VK_MULTIPLY",      /* 0x6A */
876     "VK_ADD",           /* 0x6B */
877     "VK_SEPARATOR",     /* 0x6C */
878     "VK_SUBTRACT",      /* 0x6D */
879     "VK_DECIMAL",       /* 0x6E */
880     "VK_DIVIDE",        /* 0x6F */
881     "VK_F1",            /* 0x70 */
882     "VK_F2",            /* 0x71 */
883     "VK_F3",            /* 0x72 */
884     "VK_F4",            /* 0x73 */
885     "VK_F5",            /* 0x74 */
886     "VK_F6",            /* 0x75 */
887     "VK_F7",            /* 0x76 */
888     "VK_F8",            /* 0x77 */
889     "VK_F9",            /* 0x78 */
890     "VK_F10",           /* 0x79 */
891     "VK_F11",           /* 0x7A */
892     "VK_F12",           /* 0x7B */
893     "VK_F13",           /* 0x7C */
894     "VK_F14",           /* 0x7D */
895     "VK_F15",           /* 0x7E */
896     "VK_F16",           /* 0x7F */
897     "VK_F17",           /* 0x80 */
898     "VK_F18",           /* 0x81 */
899     "VK_F19",           /* 0x82 */
900     "VK_F20",           /* 0x83 */
901     "VK_F21",           /* 0x84 */
902     "VK_F22",           /* 0x85 */
903     "VK_F23",           /* 0x86 */
904     "VK_F24",           /* 0x87 */
905     NULL,               /* 0x88 */
906     NULL,               /* 0x89 */
907     NULL,               /* 0x8A */
908     NULL,               /* 0x8B */
909     NULL,               /* 0x8C */
910     NULL,               /* 0x8D */
911     NULL,               /* 0x8E */
912     NULL,               /* 0x8F */
913     "VK_NUMLOCK",       /* 0x90 */
914     "VK_SCROLL",        /* 0x91 */
915     NULL,               /* 0x92 */
916     NULL,               /* 0x93 */
917     NULL,               /* 0x94 */
918     NULL,               /* 0x95 */
919     NULL,               /* 0x96 */
920     NULL,               /* 0x97 */
921     NULL,               /* 0x98 */
922     NULL,               /* 0x99 */
923     NULL,               /* 0x9A */
924     NULL,               /* 0x9B */
925     NULL,               /* 0x9C */
926     NULL,               /* 0x9D */
927     NULL,               /* 0x9E */
928     NULL,               /* 0x9F */
929     "VK_LSHIFT",        /* 0xA0 */
930     "VK_RSHIFT",        /* 0xA1 */
931     "VK_LCONTROL",      /* 0xA2 */
932     "VK_RCONTROL",      /* 0xA3 */
933     "VK_LMENU",         /* 0xA4 */
934     "VK_RMENU",         /* 0xA5 */
935     NULL,               /* 0xA6 */
936     NULL,               /* 0xA7 */
937     NULL,               /* 0xA8 */
938     NULL,               /* 0xA9 */
939     NULL,               /* 0xAA */
940     NULL,               /* 0xAB */
941     NULL,               /* 0xAC */
942     NULL,               /* 0xAD */
943     NULL,               /* 0xAE */
944     NULL,               /* 0xAF */
945     NULL,               /* 0xB0 */
946     NULL,               /* 0xB1 */
947     NULL,               /* 0xB2 */
948     NULL,               /* 0xB3 */
949     NULL,               /* 0xB4 */
950     NULL,               /* 0xB5 */
951     NULL,               /* 0xB6 */
952     NULL,               /* 0xB7 */
953     NULL,               /* 0xB8 */
954     NULL,               /* 0xB9 */
955     "VK_OEM_1",         /* 0xBA */
956     "VK_OEM_PLUS",      /* 0xBB */
957     "VK_OEM_COMMA",     /* 0xBC */
958     "VK_OEM_MINUS",     /* 0xBD */
959     "VK_OEM_PERIOD",    /* 0xBE */
960     "VK_OEM_2",         /* 0xBF */
961     "VK_OEM_3",         /* 0xC0 */
962     NULL,               /* 0xC1 */
963     NULL,               /* 0xC2 */
964     NULL,               /* 0xC3 */
965     NULL,               /* 0xC4 */
966     NULL,               /* 0xC5 */
967     NULL,               /* 0xC6 */
968     NULL,               /* 0xC7 */
969     NULL,               /* 0xC8 */
970     NULL,               /* 0xC9 */
971     NULL,               /* 0xCA */
972     NULL,               /* 0xCB */
973     NULL,               /* 0xCC */
974     NULL,               /* 0xCD */
975     NULL,               /* 0xCE */
976     NULL,               /* 0xCF */
977     NULL,               /* 0xD0 */
978     NULL,               /* 0xD1 */
979     NULL,               /* 0xD2 */
980     NULL,               /* 0xD3 */
981     NULL,               /* 0xD4 */
982     NULL,               /* 0xD5 */
983     NULL,               /* 0xD6 */
984     NULL,               /* 0xD7 */
985     NULL,               /* 0xD8 */
986     NULL,               /* 0xD9 */
987     NULL,               /* 0xDA */
988     "VK_OEM_4",         /* 0xDB */
989     "VK_OEM_5",         /* 0xDC */
990     "VK_OEM_6",         /* 0xDD */
991     "VK_OEM_7",         /* 0xDE */
992     "VK_OEM_8",         /* 0xDF */
993     NULL,               /* 0xE0 */
994     "VK_OEM_AX",        /* 0xE1 */
995     "VK_OEM_102",       /* 0xE2 */
996     "VK_ICO_HELP",      /* 0xE3 */
997     "VK_ICO_00",        /* 0xE4 */
998     "VK_PROCESSKEY",    /* 0xE5 */
999     NULL,               /* 0xE6 */
1000     NULL,               /* 0xE7 */
1001     NULL,               /* 0xE8 */
1002     NULL,               /* 0xE9 */
1003     NULL,               /* 0xEA */
1004     NULL,               /* 0xEB */
1005     NULL,               /* 0xEC */
1006     NULL,               /* 0xED */
1007     NULL,               /* 0xEE */
1008     NULL,               /* 0xEF */
1009     NULL,               /* 0xF0 */
1010     NULL,               /* 0xF1 */
1011     NULL,               /* 0xF2 */
1012     NULL,               /* 0xF3 */
1013     NULL,               /* 0xF4 */
1014     NULL,               /* 0xF5 */
1015     "VK_ATTN",          /* 0xF6 */
1016     "VK_CRSEL",         /* 0xF7 */
1017     "VK_EXSEL",         /* 0xF8 */
1018     "VK_EREOF",         /* 0xF9 */
1019     "VK_PLAY",          /* 0xFA */
1020     "VK_ZOOM",          /* 0xFB */
1021     "VK_NONAME",        /* 0xFC */
1022     "VK_PA1",           /* 0xFD */
1023     "VK_OEM_CLEAR",     /* 0xFE */
1024     NULL                /* 0xFF */
1025 };
1026
1027
1028 /* WM_NOTIFY function codes display */
1029
1030 typedef struct
1031 {
1032     const char *name;     /* name of notify message        */
1033     UINT        value;     /* notify code value             */
1034     UINT        len;       /* length of extra space to dump */
1035 } SPY_NOTIFY;
1036
1037 #define SPNFY(a,b) { #a ,a,sizeof(b)-sizeof(NMHDR)}
1038
1039 /* Array MUST be in descending order by the 'value' field  */
1040 /* (since value is UNSIGNED, 0xffffffff is largest and     */
1041 /*  0xfffffffe is smaller). A binary search is used to     */
1042 /* locate the correct 'value'.                             */
1043 static const SPY_NOTIFY spnfy_array[] = {
1044     /*  common        0U       to  0U-99U  */
1045     SPNFY(NM_OUTOFMEMORY,        NMHDR), 
1046     SPNFY(NM_CLICK,              NMHDR),    
1047     SPNFY(NM_DBLCLK,             NMHDR),
1048     SPNFY(NM_RETURN,             NMHDR),  
1049     SPNFY(NM_RCLICK,             NMHDR),
1050     SPNFY(NM_RDBLCLK,            NMHDR),       
1051     SPNFY(NM_SETFOCUS,           NMHDR),
1052     SPNFY(NM_KILLFOCUS,          NMHDR),
1053     SPNFY(NM_CUSTOMDRAW,         NMCUSTOMDRAW),
1054     SPNFY(NM_HOVER,              NMHDR),
1055     SPNFY(NM_NCHITTEST,          NMHDR),
1056     SPNFY(NM_KEYDOWN,            NMKEY),
1057     SPNFY(NM_RELEASEDCAPTURE,    NMHDR),
1058     SPNFY(NM_SETCURSOR,          NMMOUSE),
1059     SPNFY(NM_CHAR,               NMCHAR),
1060     SPNFY(NM_TOOLTIPSCREATED,    NMTOOLTIPSCREATED),  
1061     /* Listview       0U-100U  to  0U-199U  */
1062     /* Header         0U-300U  to  0U-399U  */
1063     /* Treeview       0U-400U  to  0U-499U  */
1064     /* Tooltips       0U-520U  to  0U-549U  */
1065     /* Tab            0U-550U  to  0U-580U  */
1066     /* Common Dialog  0U-601U  to  0U-699U  */
1067     /* Toolbar        0U-700U  to  0U-720U  */
1068     SPNFY(TBN_GETBUTTONINFOA,    NMTOOLBARA),
1069     SPNFY(TBN_BEGINDRAG,         NMTOOLBARA),
1070     SPNFY(TBN_ENDDRAG,           NMTOOLBARA),
1071     SPNFY(TBN_BEGINADJUST,       NMHDR),
1072     SPNFY(TBN_ENDADJUST,         NMHDR),
1073     SPNFY(TBN_RESET,             NMHDR),
1074     SPNFY(TBN_QUERYINSERT,       NMTOOLBARA),
1075     SPNFY(TBN_QUERYDELETE,       NMTOOLBARA),
1076     SPNFY(TBN_TOOLBARCHANGE,     NMHDR),
1077     SPNFY(TBN_CUSTHELP,          NMHDR),
1078     SPNFY(TBN_DROPDOWN,          NMTOOLBARA),
1079     SPNFY(TBN_GETOBJECT,         NMOBJECTNOTIFY),
1080     SPNFY(TBN_HOTITEMCHANGE,     NMHDR),    /* NMTBHOTITEM), */
1081     SPNFY(TBN_DRAGOUT,           NMTOOLBARA),
1082     SPNFY(TBN_DELETINGBUTTON,    NMTOOLBARA),
1083     SPNFY(TBN_GETDISPINFOA,      NMHDR),    /* NMTBDISPINFO), */
1084     SPNFY(TBN_GETDISPINFOW,      NMHDR),    /* NMTBDISPINFO), */
1085     SPNFY(TBN_GETINFOTIPA,       NMTBGETINFOTIPA),
1086     SPNFY(TBN_GETINFOTIPW,       NMTBGETINFOTIPW),
1087     SPNFY(TBN_GETBUTTONINFOW,    NMTOOLBARW),
1088     /* Up/Down        0U-721U  to  0U-740U  */
1089     /* Month Calendar 0U-750U  to  0U-759U  */
1090     /* Date/Time      0U-760U  to  0U-799U  */
1091     /* ComboBoxEx     0U-800U  to  0U-830U  */
1092     SPNFY(CBEN_GETDISPINFOA,     NMHDR),    /* NMCOMBOBOXEX), */
1093     SPNFY(CBEN_INSERTITEM,       NMHDR),    /* NMCOMBOBOXEX), */
1094     SPNFY(CBEN_DELETEITEM,       NMHDR),    /* NMCOMBOBOXEX), */
1095     SPNFY(CBEN_BEGINEDIT,        NMHDR),
1096     SPNFY(CBEN_ENDEDITA,         NMHDR),    /* NMCBEENDEDITA), */
1097     SPNFY(CBEN_ENDEDITW,         NMHDR),    /* NMCBEENDEDITW), */
1098     SPNFY(CBEN_GETDISPINFOW,     NMHDR),    /* NMCOMBOBOXEXW), */
1099     SPNFY(CBEN_DRAGBEGINA,       NMHDR),    /* NMCBEDRAGBEGINA), */
1100     SPNFY(CBEN_DRAGBEGINW,       NMHDR),    /* NMCBEDRAGBEGINW), */
1101     /* Rebar          0U-831U  to  0U-859U  */
1102     SPNFY(RBN_HEIGHTCHANGE,      NMHDR),
1103     SPNFY(RBN_GETOBJECT,         NMOBJECTNOTIFY),
1104     SPNFY(RBN_LAYOUTCHANGED,     NMHDR),
1105     SPNFY(RBN_AUTOSIZE,          NMRBAUTOSIZE),
1106     SPNFY(RBN_BEGINDRAG,         NMREBAR),
1107     SPNFY(RBN_ENDDRAG,           NMREBAR),
1108     SPNFY(RBN_DELETINGBAND,      NMREBAR),
1109     SPNFY(RBN_DELETEDBAND,       NMREBAR),
1110     SPNFY(RBN_CHILDSIZE,         NMREBARCHILDSIZE),
1111     /* IP Adderss     0U-860U  to  0U-879U  */
1112     /* Status bar     0U-880U  to  0U-899U  */
1113     /* Pager          0U-900U  to  0U-950U  */
1114     {0,0,0}};
1115 static const SPY_NOTIFY *end_spnfy_array;     /* ptr to last good entry in array */
1116 #undef SPNFY
1117
1118
1119 static BOOL16 SPY_Exclude[SPY_MAX_MSGNUM+1];
1120 static BOOL16 SPY_ExcludeDWP = 0;
1121 static int SPY_IndentLevel  = 0;
1122
1123 #define SPY_EXCLUDE(msg) \
1124     (SPY_Exclude[(msg) > SPY_MAX_MSGNUM ? SPY_MAX_MSGNUM : (msg)])
1125
1126 /***********************************************************************
1127  *           SPY_GetMsgName
1128  */
1129 const char *SPY_GetMsgName( UINT msg )
1130 {
1131     static char msg_buffer[20];
1132
1133     if (msg <= SPY_MAX_MSGNUM)
1134     {
1135         if (!MessageTypeNames[msg]) return "???";
1136         return MessageTypeNames[msg];
1137     }
1138
1139     if (msg >= LVM_FIRST && msg <= LVM_FIRST + SPY_MAX_LVMMSGNUM)
1140     {
1141         if (!LVMMessageTypeNames[msg-LVM_FIRST]) return "LVM_?";
1142         return LVMMessageTypeNames[msg-LVM_FIRST];
1143     }
1144
1145     if (msg >= CCM_FIRST && msg <= CCM_FIRST + SPY_MAX_CCMMSGNUM)
1146     {
1147         if (!CCMMessageTypeNames[msg-CCM_FIRST]) return "???";
1148         return CCMMessageTypeNames[msg-CCM_FIRST];
1149     }
1150
1151     sprintf( msg_buffer, "WM_USER+%04x", msg - WM_USER );
1152     return msg_buffer;
1153 }
1154
1155 /***********************************************************************
1156  *           SPY_GetWndName
1157  */
1158 const char *SPY_GetWndName( HWND hwnd )
1159 {
1160     static char wnd_buffer[16];
1161
1162     WND* pWnd = WIN_FindWndPtr( hwnd );
1163     if( pWnd )
1164     {
1165         INT n = sizeof(wnd_buffer) - 6;
1166         LPSTR p = wnd_buffer;
1167         char  postfix;
1168         
1169         if( pWnd->text && pWnd->text[0] != '\0' )
1170         {
1171             LPWSTR src = pWnd->text;
1172             *(p++) = postfix = '\"';
1173             while ((n-- > 1) && *src) *p++ = *src++;
1174             if( *src ) for( n = 0; n < 3; n++ ) *(p++)='.';
1175         }
1176         else /* get class name */
1177         {
1178             *(p++)='{';
1179             GlobalGetAtomNameA((ATOM) GetClassWord(pWnd->hwndSelf, GCW_ATOM), p, n + 1);
1180             p += strlen(p);
1181             postfix = '}';
1182         }
1183         *(p++) = postfix;
1184         *(p++) = '\0';
1185         WIN_ReleaseWndPtr(pWnd);
1186
1187     }
1188     else strcpy( wnd_buffer, "\"NULL\"" );
1189     return wnd_buffer;
1190 }
1191
1192 /***********************************************************************
1193  *           SPY_GetVKeyName
1194  */
1195 const char *SPY_GetVKeyName(WPARAM wParam)
1196 {
1197     const char *vk_key_name;
1198
1199     if(wParam <= SPY_MAX_VKKEYSNUM && VK_KeyNames[wParam])
1200         vk_key_name = VK_KeyNames[wParam];
1201     else
1202         vk_key_name = "VK_???";
1203
1204     return vk_key_name;
1205 }
1206
1207 /***********************************************************************
1208  *           SPY_Bsearch_Notify
1209  */
1210 const SPY_NOTIFY *SPY_Bsearch_Notify( const SPY_NOTIFY *first, const SPY_NOTIFY *last, UINT code)
1211 {
1212     INT count;
1213     const SPY_NOTIFY *test;
1214
1215     while (last >= first) {
1216         count = 1 + last - first;
1217         if (count < 3) {
1218             /* TRACE("code=%d, f-value=%d, f-name=%s, l-value=%d, l-name=%s, l-len=%d,\n",
1219                code, first->value, first->name, last->value, last->name, last->len); */
1220             if (first->value == code) return first;
1221             if (last->value == code) return last;
1222             return NULL;
1223         }
1224         count = count / 2;
1225         test = first + count;
1226         /* TRACE("first=%p, last=%p, test=%p, t-value=%d, code=%d, count=%d\n",
1227            first, last, test, test->value, code, count); */
1228         if (test->value == code) return test;
1229         if (test->value < code)
1230             last = test - 1;
1231         else
1232             first = test + 1;
1233     }
1234     return NULL;
1235 }
1236
1237 /***********************************************************************
1238  *           SPY_DumpStructure
1239  */
1240 void SPY_DumpStructure (UINT msg, BOOL enter, LPARAM structure)
1241 {
1242     switch (msg)
1243         {
1244         case WM_DRAWITEM:
1245             if (!enter) break;
1246             {   
1247                 DRAWITEMSTRUCT *lpdis = (DRAWITEMSTRUCT*) structure;
1248                 TRACE("DRAWITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n", 
1249                       lpdis->CtlType, lpdis->CtlID);
1250                 TRACE("itemID=0x%08x itemAction=0x%08x itemState=0x%08x\n", 
1251                       lpdis->itemID, lpdis->itemAction, lpdis->itemState);
1252                 TRACE("hWnd=0x%04x hDC=0x%04x (%d,%d)-(%d,%d) itemData=0x%08lx\n",
1253                       lpdis->hwndItem, lpdis->hDC, lpdis->rcItem.left, 
1254                       lpdis->rcItem.top, lpdis->rcItem.right,
1255                       lpdis->rcItem.bottom, lpdis->itemData);
1256             }
1257             break;
1258         case WM_MEASUREITEM:
1259             {   
1260                 MEASUREITEMSTRUCT *lpmis = (MEASUREITEMSTRUCT*) structure;
1261                 TRACE("MEASUREITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n", 
1262                       lpmis->CtlType, lpmis->CtlID);
1263                 TRACE("itemID=0x%08x itemWidth=0x%08x itemHeight=0x%08x\n", 
1264                       lpmis->itemID, lpmis->itemWidth, lpmis->itemHeight);
1265                 TRACE("itemData=0x%08lx\n", lpmis->itemData);
1266             }
1267             break;
1268         case WM_STYLECHANGED:
1269             if (!enter) break;
1270         case WM_STYLECHANGING:
1271             {   
1272                 LPSTYLESTRUCT ss = (LPSTYLESTRUCT) structure;
1273                 TRACE("STYLESTRUCT: StyleOld=0x%08lx, StyleNew=0x%08lx\n",
1274                       ss->styleOld, ss->styleNew); 
1275             }
1276             break;
1277         case WM_NOTIFY:
1278             if (!enter) break;
1279             {   
1280                 NMHDR * pnmh = (NMHDR*) structure;
1281                 UINT *q;
1282                 const SPY_NOTIFY *p;
1283
1284                 p = SPY_Bsearch_Notify (&spnfy_array[0], end_spnfy_array, 
1285                                         pnmh->code);
1286                 if (p) {
1287                     TRACE("NMHDR hwndFrom=0x%08x idFrom=0x%08x code=%s<0x%08x>, extra=0x%x\n",
1288                           pnmh->hwndFrom, pnmh->idFrom, p->name, pnmh->code, p->len);
1289                     if (p->len > 0) {
1290                         int i;
1291                         q = (UINT *)(pnmh + 1);
1292                         for(i=0; i<p->len-12; i+=16) {
1293                             TRACE("NM extra [%04x] %08x %08x %08x %08x\n",
1294                                   i, *q, *(q+1), *(q+2), *(q+3));
1295                             q += 4;
1296                         }
1297                         switch (p->len - i) {
1298                         case 12:
1299                             TRACE("NM extra [%04x] %08x %08x %08x\n",
1300                                   i, *q, *(q+1), *(q+2));
1301                             break;
1302                         case 8:
1303                             TRACE("NM extra [%04x] %08x %08x\n",
1304                                   i, *q, *(q+1));
1305                             break;
1306                         case 4:
1307                             TRACE("NM extra [%04x] %08x\n",
1308                                   i, *q);
1309                             break;
1310                         default:
1311                             break;
1312                         }
1313                     }
1314                 }
1315                 else
1316                     TRACE("NMHDR hwndFrom=0x%08x idFrom=0x%08x code=0x%08x\n",
1317                           pnmh->hwndFrom, pnmh->idFrom, pnmh->code);
1318             }
1319         default:
1320             break;
1321         }
1322         
1323 }
1324 /***********************************************************************
1325  *           SPY_EnterMessage
1326  */
1327 void SPY_EnterMessage( INT iFlag, HWND hWnd, UINT msg,
1328                        WPARAM wParam, LPARAM lParam )
1329 {
1330     LPCSTR pname;
1331
1332     if (!TRACE_ON(message) || SPY_EXCLUDE(msg)) return;
1333
1334     /* each SPY_SENDMESSAGE must be complemented by call to SPY_ExitMessage */
1335     switch(iFlag)
1336     {
1337     case SPY_DISPATCHMESSAGE16:
1338         pname = SPY_GetWndName(hWnd);
1339         TRACE("%*s(%04x) %-16s message [%04x] %s dispatched  wp=%04x lp=%08lx\n",
1340                         SPY_IndentLevel, "", hWnd, pname, msg, SPY_GetMsgName( msg ),
1341                         wParam, lParam);
1342         break;
1343
1344     case SPY_DISPATCHMESSAGE:
1345         pname = SPY_GetWndName(hWnd);
1346         TRACE("%*s(%08x) %-16s message [%04x] %s dispatched  wp=%08x lp=%08lx\n",
1347                         SPY_IndentLevel, "", hWnd, pname, msg, SPY_GetMsgName( msg ),
1348                         wParam, lParam);
1349         break;
1350
1351     case SPY_SENDMESSAGE16:
1352     case SPY_SENDMESSAGE:
1353         {
1354             char taskName[30];
1355             HTASK16 hTask = GetWindowTask16(hWnd);
1356
1357             if (hTask == GetCurrentTask()) strcpy( taskName, "self" );
1358             else if (!hTask) strcpy( taskName, "Wine" );
1359             else
1360             {
1361                 sprintf( taskName, "task %04x ???", hTask );
1362                 GetModuleName16( hTask, taskName + 10, sizeof(taskName) - 10 );
1363             }
1364             pname = SPY_GetWndName(hWnd);
1365
1366             if (iFlag == SPY_SENDMESSAGE16)
1367                 TRACE("%*s(%04x) %-16s message [%04x] %s sent from %s wp=%04x lp=%08lx\n",
1368                              SPY_IndentLevel, "", hWnd, pname, msg, SPY_GetMsgName( msg ), 
1369                              taskName, wParam, lParam );
1370             else
1371             {   TRACE("%*s(%08x) %-16s message [%04x] %s sent from %s wp=%08x lp=%08lx\n",
1372                              SPY_IndentLevel, "", hWnd, pname, msg, SPY_GetMsgName( msg ), 
1373                              taskName, wParam, lParam );
1374                 SPY_DumpStructure(msg, TRUE, lParam);
1375             }
1376         }
1377         break;   
1378
1379     case SPY_DEFWNDPROC16:
1380         if( SPY_ExcludeDWP ) return;
1381         TRACE("%*s(%04x)  DefWindowProc16: %s [%04x]  wp=%04x lp=%08lx\n",
1382                         SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ),
1383                         msg, wParam, lParam );
1384         break;
1385
1386     case SPY_DEFWNDPROC:
1387         if( SPY_ExcludeDWP ) return;
1388         TRACE("%*s(%08x)  DefWindowProc32: %s [%04x]  wp=%08x lp=%08lx\n",
1389                         SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ),
1390                         msg, wParam, lParam );
1391         break;
1392     }  
1393     SPY_IndentLevel += SPY_INDENT_UNIT;
1394 }
1395
1396
1397 /***********************************************************************
1398  *           SPY_ExitMessage
1399  */
1400 void SPY_ExitMessage( INT iFlag, HWND hWnd, UINT msg, LRESULT lReturn,
1401                        WPARAM wParam, LPARAM lParam )
1402 {
1403     LPCSTR pname;
1404
1405     if (!TRACE_ON(message) || SPY_EXCLUDE(msg) ||
1406         (SPY_ExcludeDWP && (iFlag == SPY_RESULT_DEFWND16 || iFlag == SPY_RESULT_DEFWND)) )
1407         return;
1408
1409     if (SPY_IndentLevel) SPY_IndentLevel -= SPY_INDENT_UNIT;
1410
1411     switch(iFlag)
1412     {
1413     case SPY_RESULT_DEFWND16:
1414         TRACE(" %*s(%04x)  DefWindowProc16: %s [%04x] returned %08lx\n",
1415                         SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ), msg, lReturn );
1416         break;
1417
1418     case SPY_RESULT_DEFWND:
1419         TRACE(" %*s(%08x)  DefWindowProc32: %s [%04x] returned %08lx\n",
1420                         SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ), msg, lReturn );
1421         break;
1422
1423     case SPY_RESULT_OK16:
1424         pname = SPY_GetWndName(hWnd);
1425         TRACE(" %*s(%04x) %-16s message [%04x] %s returned %08lx\n",
1426                         SPY_IndentLevel, "", hWnd, pname, msg,
1427                         SPY_GetMsgName( msg ), lReturn );
1428         break;
1429
1430     case SPY_RESULT_OK:
1431         pname = SPY_GetWndName(hWnd);
1432         TRACE(" %*s(%08x) %-16s message [%04x] %s returned %08lx\n",
1433                         SPY_IndentLevel, "", hWnd, pname, msg,
1434                         SPY_GetMsgName( msg ), lReturn );
1435         SPY_DumpStructure(msg, FALSE, lParam);
1436         break; 
1437
1438     case SPY_RESULT_INVALIDHWND16:
1439         pname = SPY_GetWndName(hWnd);
1440         WARN(" %*s(%04x) %-16s message [%04x] %s HAS INVALID HWND\n",
1441                         SPY_IndentLevel, "", hWnd, pname, msg,
1442                         SPY_GetMsgName( msg ) );
1443         break;
1444
1445     case SPY_RESULT_INVALIDHWND:
1446         pname = SPY_GetWndName(hWnd);
1447         WARN(" %*s(%08x) %-16s message [%04x] %s HAS INVALID HWND\n",
1448                         SPY_IndentLevel, "", hWnd, pname, msg,
1449                         SPY_GetMsgName( msg ) );
1450         break;
1451    }
1452 }
1453
1454
1455 /***********************************************************************
1456  *           SPY_Init
1457  */
1458 int SPY_Init(void)
1459 {
1460     int i;
1461     char buffer[1024];
1462     const SPY_NOTIFY *p;
1463
1464     if (!TRACE_ON(message)) return TRUE;
1465
1466     PROFILE_GetWineIniString( "Spy", "Include", "", buffer, sizeof(buffer) );
1467     if (buffer[0] && strcmp( buffer, "INCLUDEALL" ))
1468     {
1469         TRACE("Include=%s\n", buffer );
1470         for (i = 0; i <= SPY_MAX_MSGNUM; i++)
1471             SPY_Exclude[i] = (MessageTypeNames[i] && !strstr(buffer,MessageTypeNames[i]));
1472     }
1473
1474     PROFILE_GetWineIniString( "Spy", "Exclude", "", buffer, sizeof(buffer) );
1475     if (buffer[0])
1476     {
1477         TRACE("Exclude=%s\n", buffer );
1478         if (!strcmp( buffer, "EXCLUDEALL" ))
1479             for (i = 0; i <= SPY_MAX_MSGNUM; i++) SPY_Exclude[i] = TRUE;
1480         else
1481             for (i = 0; i <= SPY_MAX_MSGNUM; i++)
1482                 SPY_Exclude[i] = (MessageTypeNames[i] && strstr(buffer,MessageTypeNames[i]));
1483     }
1484
1485     SPY_ExcludeDWP = PROFILE_GetWineIniInt( "Spy", "ExcludeDWP", 0 );
1486
1487     /* find last good entry in spy notify array and save addr for b-search */
1488     p = &spnfy_array[0];
1489     while (p->name) p++;
1490     p--;
1491     end_spnfy_array = p;
1492
1493     return 1;
1494 }