Moved command-line option handling out of the X11 driver.
[wine] / misc / 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 "module.h"
17 #include "options.h"
18 #include "debugtools.h"
19 #include "spy.h"
20 #include "commctrl.h"
21
22 DEFAULT_DEBUG_CHANNEL(message)
23
24 #define SPY_MAX_MSGNUM   WM_USER
25 #define SPY_INDENT_UNIT  4  /* 4 spaces */
26
27 static const char * const MessageTypeNames[SPY_MAX_MSGNUM + 1] =
28 {
29     "wm_null",                  /* 0x00 */
30     "WM_CREATE",        
31     "WM_DESTROY",    
32     "WM_MOVE",
33     "wm_sizewait",
34     "WM_SIZE",
35     "WM_ACTIVATE",
36     "WM_SETFOCUS",
37     "WM_KILLFOCUS",
38     "WM_SETVISIBLE",
39     "WM_ENABLE",
40     "WM_SETREDRAW",
41     "WM_SETTEXT",
42     "WM_GETTEXT",
43     "WM_GETTEXTLENGTH",
44     "WM_PAINT",
45     "WM_CLOSE",                 /* 0x10 */
46     "WM_QUERYENDSESSION",
47     "WM_QUIT",
48     "WM_QUERYOPEN",
49     "WM_ERASEBKGND",
50     "WM_SYSCOLORCHANGE",
51     "WM_ENDSESSION",
52     "wm_systemerror",
53     "WM_SHOWWINDOW",
54     "WM_CTLCOLOR",
55     "WM_WININICHANGE",
56     "WM_DEVMODECHANGE",
57     "WM_ACTIVATEAPP",
58     "WM_FONTCHANGE",
59     "WM_TIMECHANGE",
60     "WM_CANCELMODE",
61     "WM_SETCURSOR",             /* 0x20 */
62     "WM_MOUSEACTIVATE",
63     "WM_CHILDACTIVATE",
64     "WM_QUEUESYNC",
65     "WM_GETMINMAXINFO",
66     "wm_unused3",
67     "wm_painticon",
68     "WM_ICONERASEBKGND",
69     "WM_NEXTDLGCTL",
70     "wm_alttabactive",
71     "WM_SPOOLERSTATUS",
72     "WM_DRAWITEM",
73     "WM_MEASUREITEM",
74     "WM_DELETEITEM",
75     "WM_VKEYTOITEM",
76     "WM_CHARTOITEM",
77     "WM_SETFONT",               /* 0x30 */
78     "WM_GETFONT",
79     "WM_SETHOTKEY", 
80     "WM_GETHOTKEY", 
81     "wm_filesyschange", 
82     "wm_isactiveicon",
83     "wm_queryparkicon",
84     "WM_QUERYDRAGICON",
85     "wm_querysavestate",
86     "WM_COMPAREITEM", 
87     "wm_testing",
88     NULL, 
89     "wm_otherwindowcreated", 
90     "wm_otherwindowdestroyed", 
91     "wm_activateshellwindow",
92     NULL,
93
94     NULL,                       /* 0x40 */
95     "wm_compacting", NULL, NULL, 
96     "WM_COMMNOTIFY", NULL, 
97     "WM_WINDOWPOSCHANGING",     /* 0x0046 */
98     "WM_WINDOWPOSCHANGED",      /* 0x0047 */
99     "WM_POWER", NULL, 
100     "WM_COPYDATA", 
101     "WM_CANCELJOURNAL", NULL, NULL, 
102     "WM_NOTIFY", NULL,
103
104     /* 0x0050 */
105     "WM_INPUTLANGCHANGEREQUEST",
106     "WM_INPUTLANGCHANGE", 
107     "WM_TCARD", 
108     "WM_HELP", 
109     "WM_USERCHANGED", 
110     "WM_NOTIFYFORMAT", NULL, NULL, 
111     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
112
113     /* 0x0060 */
114     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
115     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
116
117     /* 0x0070 */
118     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
119     NULL, NULL, NULL, 
120     "WM_CONTEXTMENU", 
121     "WM_STYLECHANGING", 
122     "WM_STYLECHANGED", 
123     "WM_DISPLAYCHANGE", 
124     "WM_GETICON",
125
126     "WM_SETICON",               /* 0x0080 */
127     "WM_NCCREATE",              /* 0x0081 */
128     "WM_NCDESTROY",             /* 0x0082 */
129     "WM_NCCALCSIZE",            /* 0x0083 */
130     "WM_NCHITTEST",             /* 0x0084 */
131     "WM_NCPAINT",               /* 0x0085 */
132     "WM_NCACTIVATE",            /* 0x0086 */
133     "WM_GETDLGCODE",            /* 0x0087 */
134     "WM_SYNCPAINT", 
135     "WM_SYNCTASK", NULL, NULL, NULL, NULL, NULL, NULL,
136
137     /* 0x0090 */
138     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
139     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
140
141     /* 0x00A0 */
142     "WM_NCMOUSEMOVE",           /* 0x00A0 */
143     "WM_NCLBUTTONDOWN",         /* 0x00A1 */
144     "WM_NCLBUTTONUP",           /* 0x00A2 */
145     "WM_NCLBUTTONDBLCLK",       /* 0x00A3 */
146     "WM_NCRBUTTONDOWN",         /* 0x00A4 */
147     "WM_NCRBUTTONUP",           /* 0x00A5 */
148     "WM_NCRBUTTONDBLCLK",       /* 0x00A6 */
149     "WM_NCMBUTTONDOWN",         /* 0x00A7 */
150     "WM_NCMBUTTONUP",           /* 0x00A8 */
151     "WM_NCMBUTTONDBLCLK",       /* 0x00A9 */
152     NULL, NULL, NULL, NULL, NULL, NULL,
153
154     /* 0x00B0 - Win32 Edit controls */
155     "EM_GETSEL32",              /* 0x00b0 */
156     "EM_SETSEL32",              /* 0x00b1 */
157     "EM_GETRECT32",             /* 0x00b2 */
158     "EM_SETRECT32",             /* 0x00b3 */
159     "EM_SETRECTNP32",           /* 0x00b4 */
160     "EM_SCROLL32",              /* 0x00b5 */
161     "EM_LINESCROLL32",          /* 0x00b6 */
162     "EM_SCROLLCARET32",         /* 0x00b7 */
163     "EM_GETMODIFY32",           /* 0x00b8 */
164     "EM_SETMODIFY32",           /* 0x00b9 */
165     "EM_GETLINECOUNT32",        /* 0x00ba */
166     "EM_LINEINDEX32",           /* 0x00bb */
167     "EM_SETHANDLE32",           /* 0x00bc */
168     "EM_GETHANDLE32",           /* 0x00bd */
169     "EM_GETTHUMB32",            /* 0x00be */
170     NULL,                       /* 0x00bf */
171
172     NULL,                       /* 0x00c0 */
173     "EM_LINELENGTH32",          /* 0x00c1 */
174     "EM_REPLACESEL32",          /* 0x00c2 */
175     NULL,                       /* 0x00c3 */
176     "EM_GETLINE32",             /* 0x00c4 */
177     "EM_LIMITTEXT32",           /* 0x00c5 */
178     "EM_CANUNDO32",             /* 0x00c6 */
179     "EM_UNDO32",                /* 0x00c7 */
180     "EM_FMTLINES32",            /* 0x00c8 */
181     "EM_LINEFROMCHAR32",        /* 0x00c9 */
182     NULL,                       /* 0x00ca */
183     "EM_SETTABSTOPS32",         /* 0x00cb */
184     "EM_SETPASSWORDCHAR32",     /* 0x00cc */
185     "EM_EMPTYUNDOBUFFER32",     /* 0x00cd */
186     "EM_GETFIRSTVISIBLELINE32", /* 0x00ce */
187     "EM_SETREADONLY32",         /* 0x00cf */
188
189     "EM_SETWORDBREAKPROC32",    /* 0x00d0 */
190     "EM_GETWORDBREAKPROC32",    /* 0x00d1 */
191     "EM_GETPASSWORDCHAR32",     /* 0x00d2 */
192     "EM_SETMARGINS32",          /* 0x00d3 */
193     "EM_GETMARGINS32",          /* 0x00d4 */
194     "EM_GETLIMITTEXT32",        /* 0x00d5 */
195     "EM_POSFROMCHAR32",         /* 0x00d6 */
196     "EM_CHARFROMPOS32",         /* 0x00d7 */
197     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
198
199     /* 0x00E0 - Win32 Scrollbars */
200     "SBM_SETPOS32",             /* 0x00e0 */
201     "SBM_GETPOS32",             /* 0x00e1 */
202     "SBM_SETRANGE32",           /* 0x00e2 */
203     "SBM_GETRANGE32",           /* 0x00e3 */
204     "SBM_ENABLE_ARROWS32",      /* 0x00e4 */
205     NULL,
206     "SBM_SETRANGEREDRAW32",     /* 0x00e6 */
207     NULL, NULL,
208     "SBM_SETSCROLLINFO32",      /* 0x00e9 */
209     "SBM_GETSCROLLINFO32",      /* 0x00ea */
210     NULL, NULL, NULL, NULL, NULL,
211
212     /* 0x00F0 - Win32 Buttons */
213     "BM_GETCHECK32",            /* 0x00f0 */
214     "BM_SETCHECK32",            /* 0x00f1 */
215     "BM_GETSTATE32",            /* 0x00f2 */
216     "BM_SETSTATE32",            /* 0x00f3 */
217     "BM_SETSTYLE32",            /* 0x00f4 */
218     "BM_CLICK32",               /* 0x00f5 */
219     "BM_GETIMAGE32",            /* 0x00f6 */
220     "BM_SETIMAGE32",            /* 0x00f7 */
221     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
222
223     "WM_KEYDOWN",               /* 0x0100 */
224     "WM_KEYUP",                 /* 0x0101 */
225     "WM_CHAR",                  /* 0x0102 */
226     "WM_DEADCHAR",              /* 0x0103 */
227     "WM_SYSKEYDOWN",            /* 0x0104 */
228     "WM_SYSKEYUP",              /* 0x0105 */
229     "WM_SYSCHAR",               /* 0x0106 */
230     "WM_SYSDEADCHAR",           /* 0x0107 */
231     "WM_KEYLAST",               /* 0x0108 */
232     NULL,
233     "WM_CONVERTREQUEST",
234     "WM_CONVERTRESULT",
235     "WM_INTERIM",
236     "WM_IME_STARTCOMPOSITION",  /* 0x010d */
237     "WM_IME_ENDCOMPOSITION",    /* 0x010e */
238     "WM_IME_COMPOSITION",       /* 0x010f */
239
240     "WM_INITDIALOG",            /* 0x0110 */
241     "WM_COMMAND",               /* 0x0111 */
242     "WM_SYSCOMMAND",            /* 0x0112 */
243     "WM_TIMER",                 /* 0x0113 */
244     "WM_HSCROLL",               /* 0x0114 */
245     "WM_VSCROLL",               /* 0x0115 */
246     "WM_INITMENU",              /* 0x0116 */
247     "WM_INITMENUPOPUP",         /* 0x0117 */
248     "WM_SYSTIMER",              /* 0x0118 */
249     NULL, NULL, NULL, NULL, NULL, NULL,
250     "WM_MENUSELECT",            /* 0x011f */
251
252     "WM_MENUCHAR",              /* 0x0120 */
253     "WM_ENTERIDLE",             /* 0x0121 */
254     NULL, NULL, NULL, NULL, NULL, NULL,
255     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
256
257     /* 0x0130 */
258     NULL,
259     "WM_LBTRACKPOINT",          /* 0x0131 */
260     "WM_CTLCOLORMSGBOX",        /* 0x0132 */
261     "WM_CTLCOLOREDIT",          /* 0x0133 */
262     "WM_CTLCOLORLISTBOX",       /* 0x0134 */
263     "WM_CTLCOLORBTN",           /* 0x0135 */
264     "WM_CTLCOLORDLG",           /* 0x0136 */
265     "WM_CTLCOLORSCROLLBAR",     /* 0x0137 */
266     "WM_CTLCOLORSTATIC",        /* 0x0138 */
267     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
268
269     /* 0x0140 - Win32 Comboboxes */
270     "CB_GETEDITSEL32",          /* 0x0140 */
271     "CB_LIMITTEXT32",           /* 0x0141 */
272     "CB_SETEDITSEL32",          /* 0x0142 */
273     "CB_ADDSTRING32",           /* 0x0143 */
274     "CB_DELETESTRING32",        /* 0x0144 */
275     "CB_DIR32",                 /* 0x0145 */
276     "CB_GETCOUNT32",            /* 0x0146 */
277     "CB_GETCURSEL32",           /* 0x0147 */
278     "CB_GETLBTEXT32",           /* 0x0148 */
279     "CB_GETLBTEXTLEN32",        /* 0x0149 */
280     "CB_INSERTSTRING32",        /* 0x014a */
281     "CB_RESETCONTENT32",        /* 0x014b */
282     "CB_FINDSTRING32",          /* 0x014c */
283     "CB_SELECTSTRING32",        /* 0x014d */
284     "CB_SETCURSEL32",           /* 0x014e */
285     "CB_SHOWDROPDOWN32",        /* 0x014f */
286
287     "CB_GETITEMDATA32",         /* 0x0150 */
288     "CB_SETITEMDATA32",         /* 0x0151 */
289     "CB_GETDROPPEDCONTROLRECT32",/* 0x0152 */
290     "CB_SETITEMHEIGHT32",       /* 0x0153 */
291     "CB_GETITEMHEIGHT32",       /* 0x0154 */
292     "CB_SETEXTENDEDUI32",       /* 0x0155 */
293     "CB_GETEXTENDEDUI32",       /* 0x0156 */
294     "CB_GETDROPPEDSTATE32",     /* 0x0157 */
295     "CB_FINDSTRINGEXACT32",     /* 0x0158 */
296     "CB_SETLOCALE32",           /* 0x0159 */
297     "CB_GETLOCALE32",           /* 0x015a */
298     "CB_GETTOPINDEX32",         /* 0x015b */
299     "CB_SETTOPINDEX32",         /* 0x015c */
300     "CB_GETHORIZONTALEXTENT32", /* 0x015d */
301     "CB_SETHORIZONTALEXTENT32", /* 0x015e */
302     "CB_GETDROPPEDWIDTH32",     /* 0x015f */
303
304     "CB_SETDROPPEDWIDTH32",     /* 0x0160 */
305     "CB_INITSTORAGE32",         /* 0x0161 */
306     NULL, NULL, NULL, NULL, NULL, NULL,
307     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
308
309     /* 0x0170 - Win32 Static controls */
310     "STM_SETICON32",            /* 0x0170 */
311     "STM_GETICON32",            /* 0x0171 */
312     "STM_SETIMAGE32",           /* 0x0172 */
313     "STM_GETIMAGE32",           /* 0x0173 */
314     NULL, NULL, NULL, NULL, 
315     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
316
317     /* 0x0180 - Win32 Listboxes */
318     "LB_ADDSTRING32",           /* 0x0180 */
319     "LB_INSERTSTRING32",        /* 0x0181 */
320     "LB_DELETESTRING32",        /* 0x0182 */
321     "LB_SELITEMRANGEEX32",      /* 0x0183 */
322     "LB_RESETCONTENT32",        /* 0x0184 */
323     "LB_SETSEL32",              /* 0x0185 */
324     "LB_SETCURSEL32",           /* 0x0186 */
325     "LB_GETSEL32",              /* 0x0187 */
326     "LB_GETCURSEL32",           /* 0x0188 */
327     "LB_GETTEXT32",             /* 0x0189 */
328     "LB_GETTEXTLEN32",          /* 0x018a */
329     "LB_GETCOUNT32",            /* 0x018b */
330     "LB_SELECTSTRING32",        /* 0x018c */
331     "LB_DIR32",                 /* 0x018d */
332     "LB_GETTOPINDEX32",         /* 0x018e */
333     "LB_FINDSTRING32",          /* 0x018f */
334
335     "LB_GETSELCOUNT32",         /* 0x0190 */
336     "LB_GETSELITEMS32",         /* 0x0191 */
337     "LB_SETTABSTOPS32",         /* 0x0192 */
338     "LB_GETHORIZONTALEXTENT32", /* 0x0193 */
339     "LB_SETHORIZONTALEXTENT32", /* 0x0194 */
340     "LB_SETCOLUMNWIDTH32",      /* 0x0195 */
341     "LB_ADDFILE32",             /* 0x0196 */
342     "LB_SETTOPINDEX32",         /* 0x0197 */
343     "LB_GETITEMRECT32",         /* 0x0198 */
344     "LB_GETITEMDATA32",         /* 0x0199 */
345     "LB_SETITEMDATA32",         /* 0x019a */
346     "LB_SELITEMRANGE32",        /* 0x019b */
347     "LB_SETANCHORINDEX32",      /* 0x019c */
348     "LB_GETANCHORINDEX32",      /* 0x019d */
349     "LB_SETCARETINDEX32",       /* 0x019e */
350     "LB_GETCARETINDEX32",       /* 0x019f */
351
352     "LB_SETITEMHEIGHT32",       /* 0x01a0 */
353     "LB_GETITEMHEIGHT32",       /* 0x01a1 */
354     "LB_FINDSTRINGEXACT32",     /* 0x01a2 */
355     "LB_CARETON32",             /* 0x01a3 */
356     "LB_CARETOFF32",            /* 0x01a4 */
357     "LB_SETLOCALE32",           /* 0x01a5 */
358     "LB_GETLOCALE32",           /* 0x01a6 */
359     "LB_SETCOUNT32",            /* 0x01a7 */
360     "LB_INITSTORAGE32",         /* 0x01a8 */
361     "LB_ITEMFROMPOINT32",       /* 0x01a9 */
362     NULL, NULL, NULL, NULL, NULL, NULL,
363
364     /* 0x01B0 */
365     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
366     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
367
368     /* 0x01C0 */
369     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
370     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
371
372     /* 0x01D0 */
373     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
374     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
375
376     /* 0x01E0 */
377     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
378     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
379
380     /* 0x01F0 */
381     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
382     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
383
384     "WM_MOUSEMOVE",             /* 0x0200 */
385     "WM_LBUTTONDOWN",           /* 0x0201 */
386     "WM_LBUTTONUP",             /* 0x0202 */
387     "WM_LBUTTONDBLCLK",         /* 0x0203 */
388     "WM_RBUTTONDOWN",           /* 0x0204 */
389     "WM_RBUTTONUP",             /* 0x0205 */
390     "WM_RBUTTONDBLCLK",         /* 0x0206 */
391     "WM_MBUTTONDOWN",           /* 0x0207 */
392     "WM_MBUTTONUP",             /* 0x0208 */
393     "WM_MBUTTONDBLCLK",         /* 0x0209 */
394     NULL, 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 static BOOL16 SPY_Exclude[SPY_MAX_MSGNUM+1];
766 static BOOL16 SPY_ExcludeDWP = 0;
767 static int SPY_IndentLevel  = 0;
768
769 #define SPY_EXCLUDE(msg) \
770     (SPY_Exclude[(msg) > SPY_MAX_MSGNUM ? SPY_MAX_MSGNUM : (msg)])
771
772 /***********************************************************************
773  *           SPY_GetMsgName
774  */
775 const char *SPY_GetMsgName( UINT msg )
776 {
777     static char msg_buffer[20];
778
779     if (msg <= SPY_MAX_MSGNUM)
780     {
781         if (!MessageTypeNames[msg]) return "???";
782         return MessageTypeNames[msg];
783     }
784
785     if (msg >= LVM_FIRST && msg <= LVM_FIRST + SPY_MAX_LVMMSGNUM)
786     {
787         if (!LVMMessageTypeNames[msg-LVM_FIRST]) return "LVM_?";
788         return LVMMessageTypeNames[msg-LVM_FIRST];
789     }
790
791     if (msg >= CCM_FIRST && msg <= CCM_FIRST + SPY_MAX_CCMMSGNUM)
792     {
793         if (!CCMMessageTypeNames[msg-CCM_FIRST]) return "???";
794         return CCMMessageTypeNames[msg-CCM_FIRST];
795     }
796
797     sprintf( msg_buffer, "WM_USER+%04x", msg - WM_USER );
798     return msg_buffer;
799 }
800
801 /***********************************************************************
802  *           SPY_GetWndName
803  */
804 const char *SPY_GetWndName( HWND hwnd )
805 {
806     static char wnd_buffer[16];
807
808     WND* pWnd = WIN_FindWndPtr( hwnd );
809     if( pWnd )
810     {
811         INT n = sizeof(wnd_buffer) - 6;
812         LPSTR p = wnd_buffer;
813         LPSTR src;
814         
815         char  postfix;
816         
817         if( pWnd->text && pWnd->text[0] != '\0' )
818         {
819             src = pWnd->text;
820             *(p++) = postfix = '\"';
821             while ((n-- > 1) && *src) *p++ = *src++;
822         }
823         else /* get class name */
824         {
825             INT len;
826
827             *(p++)='{';
828             GlobalGetAtomNameA((ATOM) GetClassWord(pWnd->hwndSelf, GCW_ATOM), p, n + 1);
829             src = p += (len = lstrlenA(p));
830             if( len >= n ) src = wnd_buffer;    /* something nonzero */
831             postfix = '}';
832         }
833         if( *src ) for( n = 0; n < 3; n++ ) *(p++)='.';
834         *(p++) = postfix;
835         *(p++) = '\0';
836         WIN_ReleaseWndPtr(pWnd);
837
838     }
839     else lstrcpyA( wnd_buffer, "\"NULL\"" );
840     return wnd_buffer;
841 }
842 /***********************************************************************
843  *           SPY_DumpStructure
844  */
845 void SPY_DumpStructure (UINT msg, LPARAM structure)
846 {
847         switch (msg)
848         {
849             case WM_DRAWITEM:
850                 {   DRAWITEMSTRUCT *lpdis = (DRAWITEMSTRUCT*) structure;
851                     TRACE("DRAWITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n", lpdis->CtlType, lpdis->CtlID);
852                     TRACE("itemID=0x%08x itemAction=0x%08x itemState=0x%08x\n", lpdis->itemID, lpdis->itemAction, lpdis->itemState);
853                     TRACE("hWnd=0x%04x hDC=0x%04x (%d,%d)-(%d,%d) itemData=0x%08lx\n",
854                     lpdis->hwndItem, lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top, lpdis->rcItem.right, lpdis->rcItem.bottom, lpdis->itemData);
855                 }
856                 break;
857             case WM_MEASUREITEM:
858                 {   MEASUREITEMSTRUCT *lpmis = (MEASUREITEMSTRUCT*) structure;
859                     TRACE("MEASUREITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n", lpmis->CtlType, lpmis->CtlID);
860                     TRACE("itemID=0x%08x itemWidth=0x%08x itemHeight=0x%08x\n", lpmis->itemID, lpmis->itemWidth, lpmis->itemHeight);
861                     TRACE("itemData=0x%08lx\n", lpmis->itemData);
862                 }
863                 break;
864             case WM_NOTIFY:
865                 {   NMHDR * pnmh = (NMHDR*) structure;
866                     TRACE("NMHDR hwndFrom=0x%08x idFrom=0x%08x code=0x%08x\n", pnmh->hwndFrom, pnmh->idFrom, pnmh->code);
867                 }
868             default:
869                 break;
870         }
871         
872 }
873 /***********************************************************************
874  *           SPY_EnterMessage
875  */
876 void SPY_EnterMessage( INT iFlag, HWND hWnd, UINT msg,
877                        WPARAM wParam, LPARAM lParam )
878 {
879     LPCSTR pname;
880
881     if (!TRACE_ON(message) || SPY_EXCLUDE(msg)) return;
882
883     /* each SPY_SENDMESSAGE must be complemented by call to SPY_ExitMessage */
884     switch(iFlag)
885     {
886     case SPY_DISPATCHMESSAGE16:
887         pname = SPY_GetWndName(hWnd);
888         TRACE("%*s(%04x) %-16s message [%04x] %s dispatched  wp=%04x lp=%08lx\n",
889                         SPY_IndentLevel, "", hWnd, pname, msg, SPY_GetMsgName( msg ),
890                         wParam, lParam);
891         break;
892
893     case SPY_DISPATCHMESSAGE:
894         pname = SPY_GetWndName(hWnd);
895         TRACE("%*s(%08x) %-16s message [%04x] %s dispatched  wp=%08x lp=%08lx\n",
896                         SPY_IndentLevel, "", hWnd, pname, msg, SPY_GetMsgName( msg ),
897                         wParam, lParam);
898         break;
899
900     case SPY_SENDMESSAGE16:
901     case SPY_SENDMESSAGE:
902         {
903             char taskName[30];
904             HTASK16 hTask = GetWindowTask16(hWnd);
905
906             if (hTask == GetCurrentTask()) strcpy( taskName, "self" );
907             else if (!hTask) strcpy( taskName, "Wine" );
908             else
909             {
910                 sprintf( taskName, "task %04x ???", hTask );
911                 GetModuleName16( hTask, taskName + 10, sizeof(taskName) - 10 );
912             }
913             pname = SPY_GetWndName(hWnd);
914
915             if (iFlag == SPY_SENDMESSAGE16)
916                 TRACE("%*s(%04x) %-16s message [%04x] %s sent from %s wp=%04x lp=%08lx\n",
917                              SPY_IndentLevel, "", hWnd, pname, msg, SPY_GetMsgName( msg ), 
918                              taskName, wParam, lParam );
919             else
920             {   TRACE("%*s(%08x) %-16s message [%04x] %s sent from %s wp=%08x lp=%08lx\n",
921                              SPY_IndentLevel, "", hWnd, pname, msg, SPY_GetMsgName( msg ), 
922                              taskName, wParam, lParam );
923                 SPY_DumpStructure(msg, lParam);
924             }
925         }
926         break;   
927
928     case SPY_DEFWNDPROC16:
929         if( SPY_ExcludeDWP ) return;
930         TRACE("%*s(%04x)  DefWindowProc16: %s [%04x]  wp=%04x lp=%08lx\n",
931                         SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ),
932                         msg, wParam, lParam );
933         break;
934
935     case SPY_DEFWNDPROC:
936         if( SPY_ExcludeDWP ) return;
937         TRACE("%*s(%08x)  DefWindowProc32: %s [%04x]  wp=%08x lp=%08lx\n",
938                         SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ),
939                         msg, wParam, lParam );
940         break;
941     }  
942     SPY_IndentLevel += SPY_INDENT_UNIT;
943 }
944
945
946 /***********************************************************************
947  *           SPY_ExitMessage
948  */
949 void SPY_ExitMessage( INT iFlag, HWND hWnd, UINT msg, LRESULT lReturn )
950 {
951     LPCSTR pname;
952
953     if (!TRACE_ON(message) || SPY_EXCLUDE(msg) ||
954         (SPY_ExcludeDWP && (iFlag == SPY_RESULT_DEFWND16 || iFlag == SPY_RESULT_DEFWND)) )
955         return;
956
957     if (SPY_IndentLevel) SPY_IndentLevel -= SPY_INDENT_UNIT;
958
959     switch(iFlag)
960     {
961     case SPY_RESULT_DEFWND16:
962         TRACE(" %*s(%04x)  DefWindowProc16: %s [%04x] returned %08lx\n",
963                         SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ), msg, lReturn );
964         break;
965
966     case SPY_RESULT_DEFWND:
967         TRACE(" %*s(%08x)  DefWindowProc32: %s [%04x] returned %08lx\n",
968                         SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ), msg, lReturn );
969         break;
970
971     case SPY_RESULT_OK16:
972         pname = SPY_GetWndName(hWnd);
973         TRACE(" %*s(%04x) %-16s message [%04x] %s returned %08lx\n",
974                         SPY_IndentLevel, "", hWnd, pname, msg,
975                         SPY_GetMsgName( msg ), lReturn );
976         break;
977
978     case SPY_RESULT_OK:
979         pname = SPY_GetWndName(hWnd);
980         TRACE(" %*s(%08x) %-16s message [%04x] %s returned %08lx\n",
981                         SPY_IndentLevel, "", hWnd, pname, msg,
982                         SPY_GetMsgName( msg ), lReturn );
983         break; 
984
985     case SPY_RESULT_INVALIDHWND16:
986         pname = SPY_GetWndName(hWnd);
987         WARN(" %*s(%04x) %-16s message [%04x] %s HAS INVALID HWND\n",
988                         SPY_IndentLevel, "", hWnd, pname, msg,
989                         SPY_GetMsgName( msg ) );
990         break;
991
992     case SPY_RESULT_INVALIDHWND:
993         pname = SPY_GetWndName(hWnd);
994         WARN(" %*s(%08x) %-16s message [%04x] %s HAS INVALID HWND\n",
995                         SPY_IndentLevel, "", hWnd, pname, msg,
996                         SPY_GetMsgName( msg ) );
997         break;
998    }
999 }
1000
1001
1002 /***********************************************************************
1003  *           SPY_Init
1004  */
1005 int SPY_Init(void)
1006 {
1007     int i;
1008     char buffer[1024];
1009
1010     if (!TRACE_ON(message)) return TRUE;
1011
1012     PROFILE_GetWineIniString( "Spy", "Include", "", buffer, sizeof(buffer) );
1013     if (buffer[0] && strcmp( buffer, "INCLUDEALL" ))
1014     {
1015         TRACE("Include=%s\n", buffer );
1016         for (i = 0; i <= SPY_MAX_MSGNUM; i++)
1017             SPY_Exclude[i] = (MessageTypeNames[i] && !strstr(buffer,MessageTypeNames[i]));
1018     }
1019
1020     PROFILE_GetWineIniString( "Spy", "Exclude", "", buffer, sizeof(buffer) );
1021     if (buffer[0])
1022     {
1023         TRACE("Exclude=%s\n", buffer );
1024         if (!strcmp( buffer, "EXCLUDEALL" ))
1025             for (i = 0; i <= SPY_MAX_MSGNUM; i++) SPY_Exclude[i] = TRUE;
1026         else
1027             for (i = 0; i <= SPY_MAX_MSGNUM; i++)
1028                 SPY_Exclude[i] = (MessageTypeNames[i] && strstr(buffer,MessageTypeNames[i]));
1029     }
1030
1031     SPY_ExcludeDWP = PROFILE_GetWineIniInt( "Spy", "ExcludeDWP", 0 );
1032
1033     return 1;
1034 }