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