set most of trunk svn property eol-style:native
[reactos.git] / reactos / dll / win32 / user32 / windows / spy.c
index 8953dcb..3c24d56 100644 (file)
-/*\r
- * Message spying routines\r
- *\r
- * Copyright 1994, Bob Amstadt\r
- *           1995, Alex Korobka\r
- *\r
- * This library is free software; you can redistribute it and/or\r
- * modify it under the terms of the GNU Lesser General Public\r
- * License as published by the Free Software Foundation; either\r
- * version 2.1 of the License, or (at your option) any later version.\r
- *\r
- * This library is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
- * Lesser General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU Lesser General Public\r
- * License along with this library; if not, write to the Free Software\r
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA\r
- */\r
-\r
-#include <user32.h>\r
-#include <commctrl.h>\r
-#include <richedit.h>\r
-#include <prsht.h>\r
-\r
-//#define YDEBUG\r
-#include <wine/debug.h>\r
-\r
-WINE_DEFAULT_DEBUG_CHANNEL(message);\r
-\r
-#define SPY_MAX_MSGNUM   WM_USER\r
-#define SPY_INDENT_UNIT  4  /* 4 spaces */\r
-\r
-#define DEBUG_SPY 0\r
-\r
-static const char * const MessageTypeNames[SPY_MAX_MSGNUM + 1] =\r
-{\r
-    "WM_NULL",                  /* 0x00 */\r
-    "WM_CREATE",\r
-    "WM_DESTROY",\r
-    "WM_MOVE",\r
-    "wm_sizewait",\r
-    "WM_SIZE",\r
-    "WM_ACTIVATE",\r
-    "WM_SETFOCUS",\r
-    "WM_KILLFOCUS",\r
-    "WM_SETVISIBLE",\r
-    "WM_ENABLE",\r
-    "WM_SETREDRAW",\r
-    "WM_SETTEXT",\r
-    "WM_GETTEXT",\r
-    "WM_GETTEXTLENGTH",\r
-    "WM_PAINT",\r
-    "WM_CLOSE",                 /* 0x10 */\r
-    "WM_QUERYENDSESSION",\r
-    "WM_QUIT",\r
-    "WM_QUERYOPEN",\r
-    "WM_ERASEBKGND",\r
-    "WM_SYSCOLORCHANGE",\r
-    "WM_ENDSESSION",\r
-    "wm_systemerror",\r
-    "WM_SHOWWINDOW",\r
-    "WM_CTLCOLOR",\r
-    "WM_WININICHANGE",\r
-    "WM_DEVMODECHANGE",\r
-    "WM_ACTIVATEAPP",\r
-    "WM_FONTCHANGE",\r
-    "WM_TIMECHANGE",\r
-    "WM_CANCELMODE",\r
-    "WM_SETCURSOR",             /* 0x20 */\r
-    "WM_MOUSEACTIVATE",\r
-    "WM_CHILDACTIVATE",\r
-    "WM_QUEUESYNC",\r
-    "WM_GETMINMAXINFO",\r
-    "wm_unused3",\r
-    "wm_painticon",\r
-    "WM_ICONERASEBKGND",\r
-    "WM_NEXTDLGCTL",\r
-    "wm_alttabactive",\r
-    "WM_SPOOLERSTATUS",\r
-    "WM_DRAWITEM",\r
-    "WM_MEASUREITEM",\r
-    "WM_DELETEITEM",\r
-    "WM_VKEYTOITEM",\r
-    "WM_CHARTOITEM",\r
-    "WM_SETFONT",               /* 0x30 */\r
-    "WM_GETFONT",\r
-    "WM_SETHOTKEY",\r
-    "WM_GETHOTKEY",\r
-    "wm_filesyschange",\r
-    "wm_isactiveicon",\r
-    "wm_queryparkicon",\r
-    "WM_QUERYDRAGICON",\r
-    "wm_querysavestate",\r
-    "WM_COMPAREITEM",\r
-    "wm_testing",\r
-    NULL,\r
-    NULL,\r
-    "WM_GETOBJECT",             /* 0x3d */\r
-    "wm_activateshellwindow",\r
-    NULL,\r
-\r
-    NULL,                       /* 0x40 */\r
-    "wm_compacting", NULL, NULL,\r
-    "WM_COMMNOTIFY", NULL,\r
-    "WM_WINDOWPOSCHANGING",     /* 0x0046 */\r
-    "WM_WINDOWPOSCHANGED",      /* 0x0047 */\r
-    "WM_POWER", NULL,\r
-    "WM_COPYDATA",\r
-    "WM_CANCELJOURNAL", NULL, NULL,\r
-    "WM_NOTIFY", NULL,\r
-\r
-    /* 0x0050 */\r
-    "WM_INPUTLANGCHANGEREQUEST",\r
-    "WM_INPUTLANGCHANGE",\r
-    "WM_TCARD",\r
-    "WM_HELP",\r
-    "WM_USERCHANGED",\r
-    "WM_NOTIFYFORMAT", NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    /* 0x0060 */\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    /* 0x0070 */\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL,\r
-    "WM_CONTEXTMENU",\r
-    "WM_STYLECHANGING",\r
-    "WM_STYLECHANGED",\r
-    "WM_DISPLAYCHANGE",\r
-    "WM_GETICON",\r
-\r
-    "WM_SETICON",               /* 0x0080 */\r
-    "WM_NCCREATE",              /* 0x0081 */\r
-    "WM_NCDESTROY",             /* 0x0082 */\r
-    "WM_NCCALCSIZE",            /* 0x0083 */\r
-    "WM_NCHITTEST",             /* 0x0084 */\r
-    "WM_NCPAINT",               /* 0x0085 */\r
-    "WM_NCACTIVATE",            /* 0x0086 */\r
-    "WM_GETDLGCODE",            /* 0x0087 */\r
-    "WM_SYNCPAINT",\r
-    "WM_SYNCTASK", NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    /* 0x0090 */\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    /* 0x00A0 */\r
-    "WM_NCMOUSEMOVE",           /* 0x00a0 */\r
-    "WM_NCLBUTTONDOWN",         /* 0x00a1 */\r
-    "WM_NCLBUTTONUP",           /* 0x00a2 */\r
-    "WM_NCLBUTTONDBLCLK",       /* 0x00a3 */\r
-    "WM_NCRBUTTONDOWN",         /* 0x00a4 */\r
-    "WM_NCRBUTTONUP",           /* 0x00a5 */\r
-    "WM_NCRBUTTONDBLCLK",       /* 0x00a6 */\r
-    "WM_NCMBUTTONDOWN",         /* 0x00a7 */\r
-    "WM_NCMBUTTONUP",           /* 0x00a8 */\r
-    "WM_NCMBUTTONDBLCLK",       /* 0x00a9 */\r
-    NULL,                       /* 0x00aa */\r
-    "WM_NCXBUTTONDOWN",         /* 0x00ab */\r
-    "WM_NCXBUTTONUP",           /* 0x00ac */\r
-    "WM_NCXBUTTONDBLCLK",       /* 0x00ad */\r
-    NULL,                       /* 0x00ae */\r
-    NULL,                       /* 0x00af */\r
-\r
-    /* 0x00B0 - Win32 Edit controls */\r
-    "EM_GETSEL",                /* 0x00b0 */\r
-    "EM_SETSEL",                /* 0x00b1 */\r
-    "EM_GETRECT",               /* 0x00b2 */\r
-    "EM_SETRECT",               /* 0x00b3 */\r
-    "EM_SETRECTNP",             /* 0x00b4 */\r
-    "EM_SCROLL",                /* 0x00b5 */\r
-    "EM_LINESCROLL",            /* 0x00b6 */\r
-    "EM_SCROLLCARET",           /* 0x00b7 */\r
-    "EM_GETMODIFY",             /* 0x00b8 */\r
-    "EM_SETMODIFY",             /* 0x00b9 */\r
-    "EM_GETLINECOUNT",          /* 0x00ba */\r
-    "EM_LINEINDEX",             /* 0x00bb */\r
-    "EM_SETHANDLE",             /* 0x00bc */\r
-    "EM_GETHANDLE",             /* 0x00bd */\r
-    "EM_GETTHUMB",              /* 0x00be */\r
-    NULL,                       /* 0x00bf */\r
-\r
-    NULL,                       /* 0x00c0 */\r
-    "EM_LINELENGTH",            /* 0x00c1 */\r
-    "EM_REPLACESEL",            /* 0x00c2 */\r
-    NULL,                       /* 0x00c3 */\r
-    "EM_GETLINE",               /* 0x00c4 */\r
-    "EM_LIMITTEXT",             /* 0x00c5 */\r
-    "EM_CANUNDO",               /* 0x00c6 */\r
-    "EM_UNDO",                  /* 0x00c7 */\r
-    "EM_FMTLINES",              /* 0x00c8 */\r
-    "EM_LINEFROMCHAR",          /* 0x00c9 */\r
-    NULL,                       /* 0x00ca */\r
-    "EM_SETTABSTOPS",           /* 0x00cb */\r
-    "EM_SETPASSWORDCHAR",       /* 0x00cc */\r
-    "EM_EMPTYUNDOBUFFER",       /* 0x00cd */\r
-    "EM_GETFIRSTVISIBLELINE",   /* 0x00ce */\r
-    "EM_SETREADONLY",           /* 0x00cf */\r
-\r
-    "EM_SETWORDBREAKPROC",      /* 0x00d0 */\r
-    "EM_GETWORDBREAKPROC",      /* 0x00d1 */\r
-    "EM_GETPASSWORDCHAR",       /* 0x00d2 */\r
-    "EM_SETMARGINS",            /* 0x00d3 */\r
-    "EM_GETMARGINS",            /* 0x00d4 */\r
-    "EM_GETLIMITTEXT",          /* 0x00d5 */\r
-    "EM_POSFROMCHAR",           /* 0x00d6 */\r
-    "EM_CHARFROMPOS",           /* 0x00d7 */\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    /* 0x00E0 - Win32 Scrollbars */\r
-    "SBM_SETPOS",               /* 0x00e0 */\r
-    "SBM_GETPOS",               /* 0x00e1 */\r
-    "SBM_SETRANGE",             /* 0x00e2 */\r
-    "SBM_GETRANGE",             /* 0x00e3 */\r
-    "SBM_ENABLE_ARROWS",        /* 0x00e4 */\r
-    NULL,\r
-    "SBM_SETRANGEREDRAW",       /* 0x00e6 */\r
-    NULL, NULL,\r
-    "SBM_SETSCROLLINFO",        /* 0x00e9 */\r
-    "SBM_GETSCROLLINFO",        /* 0x00ea */\r
-    NULL, NULL, NULL, NULL, NULL,\r
-\r
-    /* 0x00F0 - Win32 Buttons */\r
-    "BM_GETCHECK",              /* 0x00f0 */\r
-    "BM_SETCHECK",              /* 0x00f1 */\r
-    "BM_GETSTATE",              /* 0x00f2 */\r
-    "BM_SETSTATE",              /* 0x00f3 */\r
-    "BM_SETSTYLE",              /* 0x00f4 */\r
-    "BM_CLICK",                 /* 0x00f5 */\r
-    "BM_GETIMAGE",              /* 0x00f6 */\r
-    "BM_SETIMAGE",              /* 0x00f7 */\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    "WM_KEYDOWN",               /* 0x0100 */\r
-    "WM_KEYUP",                 /* 0x0101 */\r
-    "WM_CHAR",                  /* 0x0102 */\r
-    "WM_DEADCHAR",              /* 0x0103 */\r
-    "WM_SYSKEYDOWN",            /* 0x0104 */\r
-    "WM_SYSKEYUP",              /* 0x0105 */\r
-    "WM_SYSCHAR",               /* 0x0106 */\r
-    "WM_SYSDEADCHAR",           /* 0x0107 */\r
-    "WM_KEYLAST",               /* 0x0108 */\r
-    NULL,\r
-    "WM_CONVERTREQUEST",\r
-    "WM_CONVERTRESULT",\r
-    "WM_INTERIM",\r
-    "WM_IME_STARTCOMPOSITION",  /* 0x010d */\r
-    "WM_IME_ENDCOMPOSITION",    /* 0x010e */\r
-    "WM_IME_COMPOSITION",       /* 0x010f */\r
-\r
-    "WM_INITDIALOG",            /* 0x0110 */\r
-    "WM_COMMAND",               /* 0x0111 */\r
-    "WM_SYSCOMMAND",            /* 0x0112 */\r
-    "WM_TIMER",                 /* 0x0113 */\r
-    "WM_HSCROLL",               /* 0x0114 */\r
-    "WM_VSCROLL",               /* 0x0115 */\r
-    "WM_INITMENU",              /* 0x0116 */\r
-    "WM_INITMENUPOPUP",         /* 0x0117 */\r
-    "WM_SYSTIMER",              /* 0x0118 */\r
-    NULL, NULL, NULL, NULL, NULL, NULL,\r
-    "WM_MENUSELECT",            /* 0x011f */\r
-\r
-    "WM_MENUCHAR",              /* 0x0120 */\r
-    "WM_ENTERIDLE",             /* 0x0121 */\r
-\r
-    "WM_MENURBUTTONUP",         /* 0x0122 */\r
-    "WM_MENUDRAG",              /* 0x0123 */\r
-    "WM_MENUGETOBJECT",         /* 0x0124 */\r
-    "WM_UNINITMENUPOPUP",       /* 0x0125 */\r
-    "WM_MENUCOMMAND",           /* 0x0126 */\r
-    "WM_CHANGEUISTATE",         /* 0x0127 */\r
-    "WM_UPDATEUISTATE",         /* 0x0128 */\r
-    "WM_QUERYUISTATE",          /* 0x0129 */\r
-\r
-    NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    /* 0x0130 */\r
-    NULL,\r
-    "WM_LBTRACKPOINT",          /* 0x0131 */\r
-    "WM_CTLCOLORMSGBOX",        /* 0x0132 */\r
-    "WM_CTLCOLOREDIT",          /* 0x0133 */\r
-    "WM_CTLCOLORLISTBOX",       /* 0x0134 */\r
-    "WM_CTLCOLORBTN",           /* 0x0135 */\r
-    "WM_CTLCOLORDLG",           /* 0x0136 */\r
-    "WM_CTLCOLORSCROLLBAR",     /* 0x0137 */\r
-    "WM_CTLCOLORSTATIC",        /* 0x0138 */\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    /* 0x0140 - Win32 Comboboxes */\r
-    "CB_GETEDITSEL",            /* 0x0140 */\r
-    "CB_LIMITTEXT",             /* 0x0141 */\r
-    "CB_SETEDITSEL",            /* 0x0142 */\r
-    "CB_ADDSTRING",             /* 0x0143 */\r
-    "CB_DELETESTRING",          /* 0x0144 */\r
-    "CB_DIR",                   /* 0x0145 */\r
-    "CB_GETCOUNT",              /* 0x0146 */\r
-    "CB_GETCURSEL",             /* 0x0147 */\r
-    "CB_GETLBTEXT",             /* 0x0148 */\r
-    "CB_GETLBTEXTLEN",          /* 0x0149 */\r
-    "CB_INSERTSTRING",          /* 0x014a */\r
-    "CB_RESETCONTENT",          /* 0x014b */\r
-    "CB_FINDSTRING",            /* 0x014c */\r
-    "CB_SELECTSTRING",          /* 0x014d */\r
-    "CB_SETCURSEL",             /* 0x014e */\r
-    "CB_SHOWDROPDOWN",          /* 0x014f */\r
-\r
-    "CB_GETITEMDATA",           /* 0x0150 */\r
-    "CB_SETITEMDATA",           /* 0x0151 */\r
-    "CB_GETDROPPEDCONTROLRECT", /* 0x0152 */\r
-    "CB_SETITEMHEIGHT",         /* 0x0153 */\r
-    "CB_GETITEMHEIGHT",         /* 0x0154 */\r
-    "CB_SETEXTENDEDUI",         /* 0x0155 */\r
-    "CB_GETEXTENDEDUI",         /* 0x0156 */\r
-    "CB_GETDROPPEDSTATE",       /* 0x0157 */\r
-    "CB_FINDSTRINGEXACT",       /* 0x0158 */\r
-    "CB_SETLOCALE",             /* 0x0159 */\r
-    "CB_GETLOCALE",             /* 0x015a */\r
-    "CB_GETTOPINDEX",           /* 0x015b */\r
-    "CB_SETTOPINDEX",           /* 0x015c */\r
-    "CB_GETHORIZONTALEXTENT",   /* 0x015d */\r
-    "CB_SETHORIZONTALEXTENT",   /* 0x015e */\r
-    "CB_GETDROPPEDWIDTH",       /* 0x015f */\r
-\r
-    "CB_SETDROPPEDWIDTH",       /* 0x0160 */\r
-    "CB_INITSTORAGE",           /* 0x0161 */\r
-    NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    /* 0x0170 - Win32 Static controls */\r
-    "STM_SETICON",              /* 0x0170 */\r
-    "STM_GETICON",              /* 0x0171 */\r
-    "STM_SETIMAGE",             /* 0x0172 */\r
-    "STM_GETIMAGE",             /* 0x0173 */\r
-    NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    /* 0x0180 - Win32 Listboxes */\r
-    "LB_ADDSTRING",             /* 0x0180 */\r
-    "LB_INSERTSTRING",          /* 0x0181 */\r
-    "LB_DELETESTRING",          /* 0x0182 */\r
-    "LB_SELITEMRANGEEX",        /* 0x0183 */\r
-    "LB_RESETCONTENT",          /* 0x0184 */\r
-    "LB_SETSEL",                /* 0x0185 */\r
-    "LB_SETCURSEL",             /* 0x0186 */\r
-    "LB_GETSEL",                /* 0x0187 */\r
-    "LB_GETCURSEL",             /* 0x0188 */\r
-    "LB_GETTEXT",               /* 0x0189 */\r
-    "LB_GETTEXTLEN",            /* 0x018a */\r
-    "LB_GETCOUNT",              /* 0x018b */\r
-    "LB_SELECTSTRING",          /* 0x018c */\r
-    "LB_DIR",                   /* 0x018d */\r
-    "LB_GETTOPINDEX",           /* 0x018e */\r
-    "LB_FINDSTRING",            /* 0x018f */\r
-\r
-    "LB_GETSELCOUNT",           /* 0x0190 */\r
-    "LB_GETSELITEMS",           /* 0x0191 */\r
-    "LB_SETTABSTOPS",           /* 0x0192 */\r
-    "LB_GETHORIZONTALEXTENT",   /* 0x0193 */\r
-    "LB_SETHORIZONTALEXTENT",   /* 0x0194 */\r
-    "LB_SETCOLUMNWIDTH",        /* 0x0195 */\r
-    "LB_ADDFILE",               /* 0x0196 */\r
-    "LB_SETTOPINDEX",           /* 0x0197 */\r
-    "LB_GETITEMRECT",           /* 0x0198 */\r
-    "LB_GETITEMDATA",           /* 0x0199 */\r
-    "LB_SETITEMDATA",           /* 0x019a */\r
-    "LB_SELITEMRANGE",          /* 0x019b */\r
-    "LB_SETANCHORINDEX",        /* 0x019c */\r
-    "LB_GETANCHORINDEX",        /* 0x019d */\r
-    "LB_SETCARETINDEX",         /* 0x019e */\r
-    "LB_GETCARETINDEX",         /* 0x019f */\r
-\r
-    "LB_SETITEMHEIGHT",         /* 0x01a0 */\r
-    "LB_GETITEMHEIGHT",         /* 0x01a1 */\r
-    "LB_FINDSTRINGEXACT",       /* 0x01a2 */\r
-    "LB_CARETON",               /* 0x01a3 */\r
-    "LB_CARETOFF",              /* 0x01a4 */\r
-    "LB_SETLOCALE",             /* 0x01a5 */\r
-    "LB_GETLOCALE",             /* 0x01a6 */\r
-    "LB_SETCOUNT",              /* 0x01a7 */\r
-    "LB_INITSTORAGE",           /* 0x01a8 */\r
-    "LB_ITEMFROMPOINT",         /* 0x01a9 */\r
-    NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    /* 0x01B0 */\r
-    NULL, NULL,\r
-    "LB_GETLISTBOXINFO",         /* 0x01b2 */\r
-    NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    /* 0x01C0 */\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    /* 0x01D0 */\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    /* 0x01E0 */\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    /* 0x01F0 */\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    "WM_MOUSEMOVE",             /* 0x0200 */\r
-    "WM_LBUTTONDOWN",           /* 0x0201 */\r
-    "WM_LBUTTONUP",             /* 0x0202 */\r
-    "WM_LBUTTONDBLCLK",         /* 0x0203 */\r
-    "WM_RBUTTONDOWN",           /* 0x0204 */\r
-    "WM_RBUTTONUP",             /* 0x0205 */\r
-    "WM_RBUTTONDBLCLK",         /* 0x0206 */\r
-    "WM_MBUTTONDOWN",           /* 0x0207 */\r
-    "WM_MBUTTONUP",             /* 0x0208 */\r
-    "WM_MBUTTONDBLCLK",         /* 0x0209 */\r
-    "WM_MOUSEWHEEL",            /* 0x020A */\r
-    "WM_XBUTTONDOWN",           /* 0x020B */\r
-    "WM_XBUTTONUP",             /* 0x020C */\r
-    "WM_XBUTTONDBLCLK",         /* 0x020D */\r
-    NULL, NULL,\r
-\r
-    "WM_PARENTNOTIFY",          /* 0x0210 */\r
-    "WM_ENTERMENULOOP",         /* 0x0211 */\r
-    "WM_EXITMENULOOP",          /* 0x0212 */\r
-    "WM_NEXTMENU",              /* 0x0213 */\r
-    "WM_SIZING",\r
-    "WM_CAPTURECHANGED",\r
-    "WM_MOVING", NULL,\r
-    "WM_POWERBROADCAST",\r
-    "WM_DEVICECHANGE", NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    "WM_MDICREATE",             /* 0x0220 */\r
-    "WM_MDIDESTROY",            /* 0x0221 */\r
-    "WM_MDIACTIVATE",           /* 0x0222 */\r
-    "WM_MDIRESTORE",            /* 0x0223 */\r
-    "WM_MDINEXT",               /* 0x0224 */\r
-    "WM_MDIMAXIMIZE",           /* 0x0225 */\r
-    "WM_MDITILE",               /* 0x0226 */\r
-    "WM_MDICASCADE",            /* 0x0227 */\r
-    "WM_MDIICONARRANGE",        /* 0x0228 */\r
-    "WM_MDIGETACTIVE",          /* 0x0229 */\r
-\r
-    "WM_DROPOBJECT",\r
-    "WM_QUERYDROPOBJECT",\r
-    "WM_BEGINDRAG",\r
-    "WM_DRAGLOOP",\r
-    "WM_DRAGSELECT",\r
-    "WM_DRAGMOVE",\r
-\r
-    /* 0x0230*/\r
-    "WM_MDISETMENU",            /* 0x0230 */\r
-    "WM_ENTERSIZEMOVE",         /* 0x0231 */\r
-    "WM_EXITSIZEMOVE",          /* 0x0232 */\r
-    "WM_DROPFILES",             /* 0x0233 */\r
-    "WM_MDIREFRESHMENU", NULL, NULL, NULL,\r
-    /* 0x0238*/\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    /* 0x0240 */\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    /* 0x0250 */\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    /* 0x0260 */\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    /* 0x0280 */\r
-    NULL,\r
-    "WM_IME_SETCONTEXT",        /* 0x0281 */\r
-    "WM_IME_NOTIFY",            /* 0x0282 */\r
-    "WM_IME_CONTROL",           /* 0x0283 */\r
-    "WM_IME_COMPOSITIONFULL",   /* 0x0284 */\r
-    "WM_IME_SELECT",            /* 0x0285 */\r
-    "WM_IME_CHAR",              /* 0x0286 */\r
-    NULL,\r
-    "WM_IME_REQUEST",           /* 0x0288 */\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    "WM_IME_KEYDOWN",           /* 0x0290 */\r
-    "WM_IME_KEYUP",             /* 0x0291 */\r
-    NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    /* 0x02a0 */\r
-    "WM_NCMOUSEHOVER",          /* 0x02A0 */\r
-    "WM_MOUSEHOVER",            /* 0x02A1 */\r
-    "WM_NCMOUSELEAVE",          /* 0x02A2 */\r
-    "WM_MOUSELEAVE",            /* 0x02A3 */\r
-    NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    "WM_WTSSESSION_CHANGE",     /* 0x02B1 */\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    /* 0x02c0 */\r
-    "WM_TABLET_FIRST",          /* 0x02c0 */\r
-    "WM_TABLET_FIRST+1",        /* 0x02c1 */\r
-    "WM_TABLET_FIRST+2",        /* 0x02c2 */\r
-    "WM_TABLET_FIRST+3",        /* 0x02c3 */\r
-    "WM_TABLET_FIRST+4",        /* 0x02c4 */\r
-    "WM_TABLET_FIRST+5",        /* 0x02c5 */\r
-    "WM_TABLET_FIRST+7",        /* 0x02c6 */\r
-    "WM_TABLET_FIRST+8",        /* 0x02c7 */\r
-    "WM_TABLET_FIRST+9",        /* 0x02c8 */\r
-    "WM_TABLET_FIRST+10",       /* 0x02c9 */\r
-    "WM_TABLET_FIRST+11",       /* 0x02ca */\r
-    "WM_TABLET_FIRST+12",       /* 0x02cb */\r
-    "WM_TABLET_FIRST+13",       /* 0x02cc */\r
-    "WM_TABLET_FIRST+14",       /* 0x02cd */\r
-    "WM_TABLET_FIRST+15",       /* 0x02ce */\r
-    "WM_TABLET_FIRST+16",       /* 0x02cf */\r
-    "WM_TABLET_FIRST+17",       /* 0x02d0 */\r
-    "WM_TABLET_FIRST+18",       /* 0x02d1 */\r
-    "WM_TABLET_FIRST+19",       /* 0x02d2 */\r
-    "WM_TABLET_FIRST+20",       /* 0x02d3 */\r
-    "WM_TABLET_FIRST+21",       /* 0x02d4 */\r
-    "WM_TABLET_FIRST+22",       /* 0x02d5 */\r
-    "WM_TABLET_FIRST+23",       /* 0x02d6 */\r
-    "WM_TABLET_FIRST+24",       /* 0x02d7 */\r
-    "WM_TABLET_FIRST+25",       /* 0x02d8 */\r
-    "WM_TABLET_FIRST+26",       /* 0x02d9 */\r
-    "WM_TABLET_FIRST+27",       /* 0x02da */\r
-    "WM_TABLET_FIRST+28",       /* 0x02db */\r
-    "WM_TABLET_FIRST+29",       /* 0x02dc */\r
-    "WM_TABLET_FIRST+30",       /* 0x02dd */\r
-    "WM_TABLET_FIRST+31",       /* 0x02de */\r
-    "WM_TABLET_LAST",           /* 0x02df */\r
-\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    "WM_CUT",                   /* 0x0300 */\r
-    "WM_COPY",\r
-    "WM_PASTE",\r
-    "WM_CLEAR",\r
-    "WM_UNDO",\r
-    "WM_RENDERFORMAT",\r
-    "WM_RENDERALLFORMATS",\r
-    "WM_DESTROYCLIPBOARD",\r
-    "WM_DRAWCLIPBOARD",\r
-    "WM_PAINTCLIPBOARD",\r
-    "WM_VSCROLLCLIPBOARD",\r
-    "WM_SIZECLIPBOARD",\r
-    "WM_ASKCBFORMATNAME",\r
-    "WM_CHANGECBCHAIN",\r
-    "WM_HSCROLLCLIPBOARD",\r
-    "WM_QUERYNEWPALETTE",       /* 0x030f*/\r
-\r
-    "WM_PALETTEISCHANGING",\r
-    "WM_PALETTECHANGED",\r
-    "WM_HOTKEY",                /* 0x0312 */\r
-          NULL, NULL, NULL, NULL,\r
-    "WM_PRINT",\r
-    "WM_PRINTCLIENT",\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    /* 0x0340 */\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    "WM_QUERYAFXWNDPROC",   /*  0x0360 */\r
-    "WM_SIZEPARENT",        /*  0x0361 */\r
-    "WM_SETMESSAGESTRING",  /*  0x0362 */\r
-    "WM_IDLEUPDATECMDUI",   /*  0x0363 */\r
-    "WM_INITIALUPDATE",     /*  0x0364 */\r
-    "WM_COMMANDHELP",       /*  0x0365 */\r
-    "WM_HELPHITTEST",       /*  0x0366 */\r
-    "WM_EXITHELPMODE",      /*  0x0367 */\r
-    "WM_RECALCPARENT",      /*  0x0368 */\r
-    "WM_SIZECHILD",         /*  0x0369 */\r
-    "WM_KICKIDLE",          /*  0x036A */\r
-    "WM_QUERYCENTERWND",    /*  0x036B */\r
-    "WM_DISABLEMODAL",      /*  0x036C */\r
-    "WM_FLOATSTATUS",       /*  0x036D */\r
-    "WM_ACTIVATETOPLEVEL",  /*  0x036E */\r
-    "WM_QUERY3DCONTROLS",   /*  0x036F */\r
-    NULL,NULL,NULL,\r
-    "WM_SOCKET_NOTIFY",     /*  0x0373 */\r
-    "WM_SOCKET_DEAD",       /*  0x0374 */\r
-    "WM_POPMESSAGESTRING",  /*  0x0375 */\r
-    "WM_OCC_LOADFROMSTREAM",     /* 0x0376 */\r
-    "WM_OCC_LOADFROMSTORAGE",    /* 0x0377 */\r
-    "WM_OCC_INITNEW",            /* 0x0378 */\r
-    "WM_QUEUE_SENTINEL",         /* 0x0379 */\r
-    "WM_OCC_LOADFROMSTREAM_EX",  /* 0x037A */\r
-    "WM_OCC_LOADFROMSTORAGE_EX", /* 0x037B */\r
-\r
-    NULL,NULL,NULL,NULL,\r
-\r
-    "WM_PENWINFIRST",           /* 0x0380 */\r
-    "WM_RCRESULT",              /* 0x0381 */\r
-    "WM_HOOKRCRESULT",          /* 0x0382 */\r
-    "WM_GLOBALRCCHANGE",        /* 0x0383 */\r
-    "WM_SKB",                   /* 0x0384 */\r
-    "WM_HEDITCTL",              /* 0x0385 */\r
-    NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    "WM_PENWINLAST",            /* 0x038F */\r
-\r
-    "WM_COALESCE_FIRST",        /* 0x0390 */\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    "WM_COALESCE_LAST",         /* 0x039F */\r
-\r
-    /* 0x03a0 */\r
-    "MM_JOY1MOVE",\r
-    "MM_JOY2MOVE",\r
-    "MM_JOY1ZMOVE",\r
-    "MM_JOY2ZMOVE",\r
-                            NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    /* 0x03b0 */\r
-    NULL, NULL, NULL, NULL, NULL,\r
-    "MM_JOY1BUTTONDOWN",\r
-    "MM_JOY2BUTTONDOWN",\r
-    "MM_JOY1BUTTONUP",\r
-    "MM_JOY2BUTTONUP",\r
-    "MM_MCINOTIFY",\r
-                NULL,\r
-    "MM_WOM_OPEN",\r
-    "MM_WOM_CLOSE",\r
-    "MM_WOM_DONE",\r
-    "MM_WIM_OPEN",\r
-    "MM_WIM_CLOSE",\r
-\r
-    /* 0x03c0 */\r
-    "MM_WIM_DATA",\r
-    "MM_MIM_OPEN",\r
-    "MM_MIM_CLOSE",\r
-    "MM_MIM_DATA",\r
-    "MM_MIM_LONGDATA",\r
-    "MM_MIM_ERROR",\r
-    "MM_MIM_LONGERROR",\r
-    "MM_MOM_OPEN",\r
-    "MM_MOM_CLOSE",\r
-    "MM_MOM_DONE",\r
-                NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    /* 0x03e0 */\r
-    "WM_DDE_INITIATE",  /* 0x3E0 */\r
-    "WM_DDE_TERMINATE", /* 0x3E1 */\r
-    "WM_DDE_ADVISE",    /* 0x3E2 */\r
-    "WM_DDE_UNADVISE",  /* 0x3E3 */\r
-    "WM_DDE_ACK",       /* 0x3E4 */\r
-    "WM_DDE_DATA",      /* 0x3E5 */\r
-    "WM_DDE_REQUEST",   /* 0x3E6 */\r
-    "WM_DDE_POKE",      /* 0x3E7 */\r
-    "WM_DDE_EXECUTE",   /* 0x3E8 */\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-\r
-    /* 0x03f0 */\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\r
-\r
-    "WM_USER"                   /* 0x0400 */\r
-};\r
-\r
-\r
-#define SPY_MAX_LVMMSGNUM   140\r
-static const char * const LVMMessageTypeNames[SPY_MAX_LVMMSGNUM + 1] =\r
-{\r
-    "LVM_GETBKCOLOR",           /* 1000 */\r
-    "LVM_SETBKCOLOR",\r
-    "LVM_GETIMAGELIST",\r
-    "LVM_SETIMAGELIST",\r
-    "LVM_GETITEMCOUNT",\r
-    "LVM_GETITEMA",\r
-    "LVM_SETITEMA",\r
-    "LVM_INSERTITEMA",\r
-    "LVM_DELETEITEM",\r
-    "LVM_DELETEALLITEMS",\r
-    "LVM_GETCALLBACKMASK",\r
-    "LVM_SETCALLBACKMASK",\r
-    "LVM_GETNEXTITEM",\r
-    "LVM_FINDITEMA",\r
-    "LVM_GETITEMRECT",\r
-    "LVM_SETITEMPOSITION",\r
-    "LVM_GETITEMPOSITION",\r
-    "LVM_GETSTRINGWIDTHA",\r
-    "LVM_HITTEST",\r
-    "LVM_ENSUREVISIBLE",\r
-    "LVM_SCROLL",\r
-    "LVM_REDRAWITEMS",\r
-    "LVM_ARRANGE",\r
-    "LVM_EDITLABELA",\r
-    "LVM_GETEDITCONTROL",\r
-    "LVM_GETCOLUMNA",\r
-    "LVM_SETCOLUMNA",\r
-    "LVM_INSERTCOLUMNA",\r
-    "LVM_DELETECOLUMN",\r
-    "LVM_GETCOLUMNWIDTH",\r
-    "LVM_SETCOLUMNWIDTH",\r
-    "LVM_GETHEADER",\r
-    NULL,\r
-    "LVM_CREATEDRAGIMAGE",\r
-    "LVM_GETVIEWRECT",\r
-    "LVM_GETTEXTCOLOR",\r
-    "LVM_SETTEXTCOLOR",\r
-    "LVM_GETTEXTBKCOLOR",\r
-    "LVM_SETTEXTBKCOLOR",\r
-    "LVM_GETTOPINDEX",\r
-    "LVM_GETCOUNTPERPAGE",\r
-    "LVM_GETORIGIN",\r
-    "LVM_UPDATE",\r
-    "LVM_SETITEMSTATE",\r
-    "LVM_GETITEMSTATE",\r
-    "LVM_GETITEMTEXTA",\r
-    "LVM_SETITEMTEXTA",\r
-    "LVM_SETITEMCOUNT",\r
-    "LVM_SORTITEMS",\r
-    "LVM_SETITEMPOSITION32",\r
-    "LVM_GETSELECTEDCOUNT",\r
-    "LVM_GETITEMSPACING",\r
-    "LVM_GETISEARCHSTRINGA",\r
-    "LVM_SETICONSPACING",\r
-    "LVM_SETEXTENDEDLISTVIEWSTYLE",\r
-    "LVM_GETEXTENDEDLISTVIEWSTYLE",\r
-    "LVM_GETSUBITEMRECT",\r
-    "LVM_SUBITEMHITTEST",\r
-    "LVM_SETCOLUMNORDERARRAY",\r
-    "LVM_GETCOLUMNORDERARRAY",\r
-    "LVM_SETHOTITEM",\r
-    "LVM_GETHOTITEM",\r
-    "LVM_SETHOTCURSOR",\r
-    "LVM_GETHOTCURSOR",\r
-    "LVM_APPROXIMATEVIEWRECT",\r
-    "LVM_SETWORKAREAS",\r
-    "LVM_GETSELECTIONMARK",\r
-    "LVM_SETSELECTIONMARK",\r
-    "LVM_SETBKIMAGEA",\r
-    "LVM_GETBKIMAGEA",\r
-    "LVM_GETWORKAREAS",\r
-    "LVM_SETHOVERTIME",\r
-    "LVM_GETHOVERTIME",\r
-    "LVM_GETNUMBEROFWORKAREAS",\r
-    "LVM_SETTOOLTIPS",\r
-    "LVM_GETITEMW",\r
-    "LVM_SETITEMW",\r
-    "LVM_INSERTITEMW",\r
-    "LVM_GETTOOLTIPS",\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    "LVM_FINDITEMW",\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    "LVM_GETSTRINGWIDTHW",\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    "LVM_GETCOLUMNW",\r
-    "LVM_SETCOLUMNW",\r
-    "LVM_INSERTCOLUMNW",\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    "LVM_GETITEMTEXTW",\r
-    "LVM_SETITEMTEXTW",\r
-    "LVM_GETISEARCHSTRINGW",\r
-    "LVM_EDITLABELW",\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    "LVM_SETBKIMAGEW",\r
-    "LVM_GETBKIMAGEW"   /* 0x108B */\r
-};\r
-\r
-\r
-#define SPY_MAX_TVMSGNUM   65\r
-static const char * const TVMessageTypeNames[SPY_MAX_TVMSGNUM + 1] =\r
-{\r
-    "TVM_INSERTITEMA",          /* 1100 */\r
-    "TVM_DELETEITEM",\r
-    "TVM_EXPAND",\r
-    NULL,\r
-    "TVM_GETITEMRECT",\r
-    "TVM_GETCOUNT",\r
-    "TVM_GETINDENT",\r
-    "TVM_SETINDENT",\r
-    "TVM_GETIMAGELIST",\r
-    "TVM_SETIMAGELIST",\r
-    "TVM_GETNEXTITEM",\r
-    "TVM_SELECTITEM",\r
-    "TVM_GETITEMA",\r
-    "TVM_SETITEMA",\r
-    "TVM_EDITLABELA",\r
-    "TVM_GETEDITCONTROL",\r
-    "TVM_GETVISIBLECOUNT",\r
-    "TVM_HITTEST",\r
-    "TVM_CREATEDRAGIMAGE",\r
-    "TVM_SORTCHILDREN",\r
-    "TVM_ENSUREVISIBLE",\r
-    "TVM_SORTCHILDRENCB",\r
-    "TVM_ENDEDITLABELNOW",\r
-    "TVM_GETISEARCHSTRINGA",\r
-    "TVM_SETTOOLTIPS",\r
-    "TVM_GETTOOLTIPS",\r
-    "TVM_SETINSERTMARK",\r
-    "TVM_SETITEMHEIGHT",\r
-    "TVM_GETITEMHEIGHT",\r
-    "TVM_SETBKCOLOR",\r
-    "TVM_SETTEXTCOLOR",\r
-    "TVM_GETBKCOLOR",\r
-    "TVM_GETTEXTCOLOR",\r
-    "TVM_SETSCROLLTIME",\r
-    "TVM_GETSCROLLTIME",\r
-    "TVM_UNKNOWN35",\r
-    "TVM_UNKNOWN36",\r
-    "TVM_SETINSERTMARKCOLOR",\r
-    "TVM_GETINSERTMARKCOLOR",\r
-    "TVM_GETITEMSTATE",\r
-    "TVM_SETLINECOLOR",\r
-    "TVM_GETLINECOLOR",\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    "TVM_INSERTITEMW",\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    "TVM_GETITEMW",\r
-    "TVM_SETITEMW",\r
-    "TVM_GETISEARCHSTRINGW",\r
-    "TVM_EDITLABELW"\r
-};\r
-\r
-\r
-#define SPY_MAX_HDMMSGNUM   19\r
-static const char * const HDMMessageTypeNames[SPY_MAX_HDMMSGNUM + 1] =\r
-{\r
-    "HDM_GETITEMCOUNT",         /* 1200 */\r
-    "HDM_INSERTITEMA",\r
-    "HDM_DELETEITEM",\r
-    "HDM_GETITEMA",\r
-    "HDM_SETITEMA",\r
-    "HDM_LAYOUT",\r
-    "HDM_HITTEST",\r
-    "HDM_GETITEMRECT",\r
-    "HDM_SETIMAGELIST",\r
-    "HDM_GETIMAGELIST",\r
-    "HDM_INSERTITEMW",\r
-    "HDM_GETITEMW",\r
-    "HDM_SETITEMW",\r
-    NULL,\r
-    NULL,\r
-    "HDM_ORDERTOINDEX",\r
-    "HDM_CREATEDRAGIMAGE",\r
-    "GETORDERARRAYINDEX",\r
-    "SETORDERARRAYINDEX",\r
-    "SETHOTDIVIDER"\r
-};\r
-\r
-\r
-#define SPY_MAX_TCMMSGNUM   62\r
-static const char * const TCMMessageTypeNames[SPY_MAX_TCMMSGNUM + 1] =\r
-{\r
-    NULL,               /* 1300 */\r
-    NULL,\r
-    "TCM_SETIMAGELIST",\r
-    "TCM_GETIMAGELIST",\r
-    "TCM_GETITEMCOUNT",\r
-    "TCM_GETITEMA",\r
-    "TCM_SETITEMA",\r
-    "TCM_INSERTITEMA",\r
-    "TCM_DELETEITEM",\r
-    "TCM_DELETEALLITEMS",\r
-    "TCM_GETITEMRECT",\r
-    "TCM_GETCURSEL",\r
-    "TCM_SETCURSEL",\r
-    "TCM_HITTEST",\r
-    "TCM_SETITEMEXTRA",\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    "TCM_ADJUSTRECT",\r
-    "TCM_SETITEMSIZE",\r
-    "TCM_REMOVEIMAGE",\r
-    "TCM_SETPADDING",\r
-    "TCM_GETROWCOUNT",\r
-    "TCM_GETTOOLTIPS",\r
-    "TCM_SETTOOLTIPS",\r
-    "TCM_GETCURFOCUS",\r
-    "TCM_SETCURFOCUS",\r
-    "TCM_SETMINTABWIDTH",\r
-    "TCM_DESELECTALL",\r
-    "TCM_HIGHLIGHTITEM",\r
-    "TCM_SETEXTENDEDSTYLE",\r
-    "TCM_GETEXTENDEDSTYLE",\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    NULL,\r
-    "TCM_GETITEMW",\r
-    "TCM_SETITEMW",\r
-    "TCM_INSERTITEMW"\r
-};\r
-\r
-#define SPY_MAX_PGMMSGNUM   13\r
-static const char * const PGMMessageTypeNames[SPY_MAX_PGMMSGNUM + 1] =\r
-{\r
-    NULL,               /* 1400 */\r
-    "PGM_SETCHILD",\r
-    "PGM_RECALCSIZE",\r
-    "PGM_FORWARDMOUSE",\r
-    "PGM_SETBKCOLOR",\r
-    "PGM_GETBKCOLOR",\r
-    "PGM_SETBORDER",\r
-    "PGM_GETBORDER",\r
-    "PGM_SETPOS",\r
-    "PGM_GETPOS",\r
-    "PGM_SETBUTTONSIZE",\r
-    "PGM_GETBUTTONSIZE",\r
-    "PGM_GETBUTTONSTATE",\r
-    "PGM_GETDROPTARGET"\r
-};\r
-\r
-\r
-#define SPY_MAX_CCMMSGNUM   9\r
-static const char * const CCMMessageTypeNames[SPY_MAX_CCMMSGNUM + 1] =\r
-{\r
-    NULL,               /* 0x2000 */\r
-    "CCM_SETBKCOLOR",\r
-    "CCM_SETCOLORSCHEME",\r
-    "CCM_GETCOLORSCHEME",\r
-    "CCM_GETDROPTARGET",\r
-    "CCM_SETUNICODEFORMAT",\r
-    "CCM_GETUNICODEFORMAT",\r
-    "CCM_SETVERSION",\r
-    "CCM_GETVERSION",\r
-    "CCM_SETNOTIFYWINDOW"\r
-};\r
-\r
-#define SPY_MAX_WINEMSGNUM   6\r
-static const char * const WINEMessageTypeNames[SPY_MAX_WINEMSGNUM + 1] =\r
-{\r
-    "WM_WINE_DESTROYWINDOW",\r
-    "WM_WINE_SETWINDOWPOS",\r
-    "WM_WINE_SHOWWINDOW",\r
-    "WM_WINE_SETPARENT",\r
-    "WM_WINE_SETWINDOWLONG",\r
-    "WM_WINE_ENABLEWINDOW"\r
-};\r
-\r
-/* Virtual key names */\r
-#define SPY_MAX_VKKEYSNUM 255\r
-static const char * const VK_KeyNames[SPY_MAX_VKKEYSNUM + 1] =\r
-{\r
-    NULL,               /* 0x00 */\r
-    "VK_LBUTTON",       /* 0x01 */\r
-    "VK_RBUTTON",       /* 0x02 */\r
-    "VK_CANCEL",        /* 0x03 */\r
-    "VK_MBUTTON",       /* 0x04 */\r
-    "VK_XBUTTON1",      /* 0x05 */\r
-    "VK_XBUTTON2",      /* 0x06 */\r
-    NULL,               /* 0x07 */\r
-    "VK_BACK",          /* 0x08 */\r
-    "VK_TAB",           /* 0x09 */\r
-    NULL,               /* 0x0A */\r
-    NULL,               /* 0x0B */\r
-    "VK_CLEAR",         /* 0x0C */\r
-    "VK_RETURN",        /* 0x0D */\r
-    NULL,               /* 0x0E */\r
-    NULL,               /* 0x0F */\r
-    "VK_SHIFT",         /* 0x10 */\r
-    "VK_CONTROL",       /* 0x11 */\r
-    "VK_MENU",          /* 0x12 */\r
-    "VK_PAUSE",         /* 0x13 */\r
-    "VK_CAPITAL",       /* 0x14 */\r
-    NULL,               /* 0x15 */\r
-    NULL,               /* 0x16 */\r
-    NULL,               /* 0x17 */\r
-    NULL,               /* 0x18 */\r
-    NULL,               /* 0x19 */\r
-    NULL,               /* 0x1A */\r
-    "VK_ESCAPE",        /* 0x1B */\r
-    NULL,               /* 0x1C */\r
-    NULL,               /* 0x1D */\r
-    NULL,               /* 0x1E */\r
-    NULL,               /* 0x1F */\r
-    "VK_SPACE",         /* 0x20 */\r
-    "VK_PRIOR",         /* 0x21 */\r
-    "VK_NEXT",          /* 0x22 */\r
-    "VK_END",           /* 0x23 */\r
-    "VK_HOME",          /* 0x24 */\r
-    "VK_LEFT",          /* 0x25 */\r
-    "VK_UP",            /* 0x26 */\r
-    "VK_RIGHT",         /* 0x27 */\r
-    "VK_DOWN",          /* 0x28 */\r
-    "VK_SELECT",        /* 0x29 */\r
-    "VK_PRINT",         /* 0x2A */\r
-    "VK_EXECUTE",       /* 0x2B */\r
-    "VK_SNAPSHOT",      /* 0x2C */\r
-    "VK_INSERT",        /* 0x2D */\r
-    "VK_DELETE",        /* 0x2E */\r
-    "VK_HELP",          /* 0x2F */\r
-    "VK_0",             /* 0x30 */\r
-    "VK_1",             /* 0x31 */\r
-    "VK_2",             /* 0x32 */\r
-    "VK_3",             /* 0x33 */\r
-    "VK_4",             /* 0x34 */\r
-    "VK_5",             /* 0x35 */\r
-    "VK_6",             /* 0x36 */\r
-    "VK_7",             /* 0x37 */\r
-    "VK_8",             /* 0x38 */\r
-    "VK_9",             /* 0x39 */\r
-    NULL,               /* 0x3A */\r
-    NULL,               /* 0x3B */\r
-    NULL,               /* 0x3C */\r
-    NULL,               /* 0x3D */\r
-    NULL,               /* 0x3E */\r
-    NULL,               /* 0x3F */\r
-    NULL,               /* 0x40 */\r
-    "VK_A",             /* 0x41 */\r
-    "VK_B",             /* 0x42 */\r
-    "VK_C",             /* 0x43 */\r
-    "VK_D",             /* 0x44 */\r
-    "VK_E",             /* 0x45 */\r
-    "VK_F",             /* 0x46 */\r
-    "VK_G",             /* 0x47 */\r
-    "VK_H",             /* 0x48 */\r
-    "VK_I",             /* 0x49 */\r
-    "VK_J",             /* 0x4A */\r
-    "VK_K",             /* 0x4B */\r
-    "VK_L",             /* 0x4C */\r
-    "VK_M",             /* 0x4D */\r
-    "VK_N",             /* 0x4E */\r
-    "VK_O",             /* 0x4F */\r
-    "VK_P",             /* 0x50 */\r
-    "VK_Q",             /* 0x51 */\r
-    "VK_R",             /* 0x52 */\r
-    "VK_S",             /* 0x53 */\r
-    "VK_T",             /* 0x54 */\r
-    "VK_U",             /* 0x55 */\r
-    "VK_V",             /* 0x56 */\r
-    "VK_W",             /* 0x57 */\r
-    "VK_X",             /* 0x58 */\r
-    "VK_Y",             /* 0x59 */\r
-    "VK_Z",             /* 0x5A */\r
-    "VK_LWIN",          /* 0x5B */\r
-    "VK_RWIN",          /* 0x5C */\r
-    "VK_APPS",          /* 0x5D */\r
-    NULL,               /* 0x5E */\r
-    NULL,               /* 0x5F */\r
-    "VK_NUMPAD0",       /* 0x60 */\r
-    "VK_NUMPAD1",       /* 0x61 */\r
-    "VK_NUMPAD2",       /* 0x62 */\r
-    "VK_NUMPAD3",       /* 0x63 */\r
-    "VK_NUMPAD4",       /* 0x64 */\r
-    "VK_NUMPAD5",       /* 0x65 */\r
-    "VK_NUMPAD6",       /* 0x66 */\r
-    "VK_NUMPAD7",       /* 0x67 */\r
-    "VK_NUMPAD8",       /* 0x68 */\r
-    "VK_NUMPAD9",       /* 0x69 */\r
-    "VK_MULTIPLY",      /* 0x6A */\r
-    "VK_ADD",           /* 0x6B */\r
-    "VK_SEPARATOR",     /* 0x6C */\r
-    "VK_SUBTRACT",      /* 0x6D */\r
-    "VK_DECIMAL",       /* 0x6E */\r
-    "VK_DIVIDE",        /* 0x6F */\r
-    "VK_F1",            /* 0x70 */\r
-    "VK_F2",            /* 0x71 */\r
-    "VK_F3",            /* 0x72 */\r
-    "VK_F4",            /* 0x73 */\r
-    "VK_F5",            /* 0x74 */\r
-    "VK_F6",            /* 0x75 */\r
-    "VK_F7",            /* 0x76 */\r
-    "VK_F8",            /* 0x77 */\r
-    "VK_F9",            /* 0x78 */\r
-    "VK_F10",           /* 0x79 */\r
-    "VK_F11",           /* 0x7A */\r
-    "VK_F12",           /* 0x7B */\r
-    "VK_F13",           /* 0x7C */\r
-    "VK_F14",           /* 0x7D */\r
-    "VK_F15",           /* 0x7E */\r
-    "VK_F16",           /* 0x7F */\r
-    "VK_F17",           /* 0x80 */\r
-    "VK_F18",           /* 0x81 */\r
-    "VK_F19",           /* 0x82 */\r
-    "VK_F20",           /* 0x83 */\r
-    "VK_F21",           /* 0x84 */\r
-    "VK_F22",           /* 0x85 */\r
-    "VK_F23",           /* 0x86 */\r
-    "VK_F24",           /* 0x87 */\r
-    NULL,               /* 0x88 */\r
-    NULL,               /* 0x89 */\r
-    NULL,               /* 0x8A */\r
-    NULL,               /* 0x8B */\r
-    NULL,               /* 0x8C */\r
-    NULL,               /* 0x8D */\r
-    NULL,               /* 0x8E */\r
-    NULL,               /* 0x8F */\r
-    "VK_NUMLOCK",       /* 0x90 */\r
-    "VK_SCROLL",        /* 0x91 */\r
-    NULL,               /* 0x92 */\r
-    NULL,               /* 0x93 */\r
-    NULL,               /* 0x94 */\r
-    NULL,               /* 0x95 */\r
-    NULL,               /* 0x96 */\r
-    NULL,               /* 0x97 */\r
-    NULL,               /* 0x98 */\r
-    NULL,               /* 0x99 */\r
-    NULL,               /* 0x9A */\r
-    NULL,               /* 0x9B */\r
-    NULL,               /* 0x9C */\r
-    NULL,               /* 0x9D */\r
-    NULL,               /* 0x9E */\r
-    NULL,               /* 0x9F */\r
-    "VK_LSHIFT",        /* 0xA0 */\r
-    "VK_RSHIFT",        /* 0xA1 */\r
-    "VK_LCONTROL",      /* 0xA2 */\r
-    "VK_RCONTROL",      /* 0xA3 */\r
-    "VK_LMENU",         /* 0xA4 */\r
-    "VK_RMENU",         /* 0xA5 */\r
-    NULL,               /* 0xA6 */\r
-    NULL,               /* 0xA7 */\r
-    NULL,               /* 0xA8 */\r
-    NULL,               /* 0xA9 */\r
-    NULL,               /* 0xAA */\r
-    NULL,               /* 0xAB */\r
-    NULL,               /* 0xAC */\r
-    NULL,               /* 0xAD */\r
-    NULL,               /* 0xAE */\r
-    NULL,               /* 0xAF */\r
-    NULL,               /* 0xB0 */\r
-    NULL,               /* 0xB1 */\r
-    NULL,               /* 0xB2 */\r
-    NULL,               /* 0xB3 */\r
-    NULL,               /* 0xB4 */\r
-    NULL,               /* 0xB5 */\r
-    NULL,               /* 0xB6 */\r
-    NULL,               /* 0xB7 */\r
-    NULL,               /* 0xB8 */\r
-    NULL,               /* 0xB9 */\r
-    "VK_OEM_1",         /* 0xBA */\r
-    "VK_OEM_PLUS",      /* 0xBB */\r
-    "VK_OEM_COMMA",     /* 0xBC */\r
-    "VK_OEM_MINUS",     /* 0xBD */\r
-    "VK_OEM_PERIOD",    /* 0xBE */\r
-    "VK_OEM_2",         /* 0xBF */\r
-    "VK_OEM_3",         /* 0xC0 */\r
-    NULL,               /* 0xC1 */\r
-    NULL,               /* 0xC2 */\r
-    NULL,               /* 0xC3 */\r
-    NULL,               /* 0xC4 */\r
-    NULL,               /* 0xC5 */\r
-    NULL,               /* 0xC6 */\r
-    NULL,               /* 0xC7 */\r
-    NULL,               /* 0xC8 */\r
-    NULL,               /* 0xC9 */\r
-    NULL,               /* 0xCA */\r
-    NULL,               /* 0xCB */\r
-    NULL,               /* 0xCC */\r
-    NULL,               /* 0xCD */\r
-    NULL,               /* 0xCE */\r
-    NULL,               /* 0xCF */\r
-    NULL,               /* 0xD0 */\r
-    NULL,               /* 0xD1 */\r
-    NULL,               /* 0xD2 */\r
-    NULL,               /* 0xD3 */\r
-    NULL,               /* 0xD4 */\r
-    NULL,               /* 0xD5 */\r
-    NULL,               /* 0xD6 */\r
-    NULL,               /* 0xD7 */\r
-    NULL,               /* 0xD8 */\r
-    NULL,               /* 0xD9 */\r
-    NULL,               /* 0xDA */\r
-    "VK_OEM_4",         /* 0xDB */\r
-    "VK_OEM_5",         /* 0xDC */\r
-    "VK_OEM_6",         /* 0xDD */\r
-    "VK_OEM_7",         /* 0xDE */\r
-    "VK_OEM_8",         /* 0xDF */\r
-    NULL,               /* 0xE0 */\r
-    "VK_OEM_AX",        /* 0xE1 */\r
-    "VK_OEM_102",       /* 0xE2 */\r
-    "VK_ICO_HELP",      /* 0xE3 */\r
-    "VK_ICO_00",        /* 0xE4 */\r
-    "VK_PROCESSKEY",    /* 0xE5 */\r
-    NULL,               /* 0xE6 */\r
-    NULL,               /* 0xE7 */\r
-    NULL,               /* 0xE8 */\r
-    NULL,               /* 0xE9 */\r
-    NULL,               /* 0xEA */\r
-    NULL,               /* 0xEB */\r
-    NULL,               /* 0xEC */\r
-    NULL,               /* 0xED */\r
-    NULL,               /* 0xEE */\r
-    NULL,               /* 0xEF */\r
-    NULL,               /* 0xF0 */\r
-    NULL,               /* 0xF1 */\r
-    NULL,               /* 0xF2 */\r
-    NULL,               /* 0xF3 */\r
-    NULL,               /* 0xF4 */\r
-    NULL,               /* 0xF5 */\r
-    "VK_ATTN",          /* 0xF6 */\r
-    "VK_CRSEL",         /* 0xF7 */\r
-    "VK_EXSEL",         /* 0xF8 */\r
-    "VK_EREOF",         /* 0xF9 */\r
-    "VK_PLAY",          /* 0xFA */\r
-    "VK_ZOOM",          /* 0xFB */\r
-    "VK_NONAME",        /* 0xFC */\r
-    "VK_PA1",           /* 0xFD */\r
-    "VK_OEM_CLEAR",     /* 0xFE */\r
-    NULL                /* 0xFF */\r
-};\r
-\r
-\r
-/************************************************************************/\r
-\r
-\r
-/* WM_USER+n message values for "common controls" */\r
-\r
-typedef struct\r
-{\r
-    const char *name;      /* name of control message           */\r
-    UINT        value;     /* message number (0x0401-0x0fff     */\r
-    UINT        len;       /* length of space at lParam to dump */\r
-} USER_MSG;\r
-\r
-\r
-typedef struct\r
-{\r
-const WCHAR      *classname;  /* class name to match                  */\r
-const USER_MSG   *classmsg;   /* pointer to first USER_MSG for class  */\r
-const USER_MSG   *lastmsg;    /* pointer to last USER_MSG for class   */\r
-} CONTROL_CLASS;\r
-\r
-#define USM(a,b) { #a ,a,b}\r
-#define SZOF(a)  sizeof(a)\r
-\r
-/* To dump memory at the lParam for any of these messages,  */\r
-/* replace the "0" with a "SZOF(structure)", or with a      */\r
-/* number. (First method preferred.)                         */\r
-\r
-#define RB_GETBANDINFO_OLD (WM_USER+5) /* obsoleted after IE3, but we have to support it anyway */\r
-\r
-static const USER_MSG rebar_array[] = {\r
-          USM(RB_INSERTBANDA,          0),\r
-          USM(RB_DELETEBAND,           0),\r
-          USM(RB_GETBARINFO,           0),\r
-          USM(RB_SETBARINFO,           0),\r
-          USM(RB_GETBANDINFO_OLD,      0),\r
-          USM(RB_SETBANDINFOA,         0),\r
-          USM(RB_SETPARENT,            0),\r
-          USM(RB_HITTEST,              0),\r
-          USM(RB_GETRECT,              0),\r
-          USM(RB_INSERTBANDW,          0),\r
-          USM(RB_SETBANDINFOW,         0),\r
-          USM(RB_GETBANDCOUNT,         0),\r
-          USM(RB_GETROWCOUNT,          0),\r
-          USM(RB_GETROWHEIGHT,         0),\r
-          USM(RB_IDTOINDEX,            0),\r
-          USM(RB_GETTOOLTIPS,          0),\r
-          USM(RB_SETTOOLTIPS,          0),\r
-          USM(RB_SETBKCOLOR,           0),\r
-          USM(RB_GETBKCOLOR,           0),\r
-          USM(RB_SETTEXTCOLOR,         0),\r
-          USM(RB_GETTEXTCOLOR,         0),\r
-          USM(RB_SIZETORECT,           0),\r
-          USM(RB_BEGINDRAG,            0),\r
-          USM(RB_ENDDRAG,              0),\r
-          USM(RB_DRAGMOVE,             0),\r
-          USM(RB_GETBARHEIGHT,         0),\r
-          USM(RB_GETBANDINFOW,         0),\r
-          USM(RB_GETBANDINFOA,         0),\r
-          USM(RB_MINIMIZEBAND,         0),\r
-          USM(RB_MAXIMIZEBAND,         0),\r
-          USM(RB_GETBANDBORDERS,       0),\r
-          USM(RB_SHOWBAND,             0),\r
-          USM(RB_SETPALETTE,           0),\r
-          USM(RB_GETPALETTE,           0),\r
-          USM(RB_MOVEBAND,             0),\r
-          {0,0,0} };\r
-\r
-static const USER_MSG toolbar_array[] = {\r
-          USM(TB_ENABLEBUTTON          ,0),\r
-          USM(TB_CHECKBUTTON           ,0),\r
-          USM(TB_PRESSBUTTON           ,0),\r
-          USM(TB_HIDEBUTTON            ,0),\r
-          USM(TB_INDETERMINATE         ,0),\r
-          USM(TB_MARKBUTTON            ,0),\r
-          USM(TB_ISBUTTONENABLED       ,0),\r
-          USM(TB_ISBUTTONCHECKED       ,0),\r
-          USM(TB_ISBUTTONPRESSED       ,0),\r
-          USM(TB_ISBUTTONHIDDEN        ,0),\r
-          USM(TB_ISBUTTONINDETERMINATE ,0),\r
-          USM(TB_ISBUTTONHIGHLIGHTED   ,0),\r
-          USM(TB_SETSTATE              ,0),\r
-          USM(TB_GETSTATE              ,0),\r
-          USM(TB_ADDBITMAP             ,0),\r
-          USM(TB_ADDBUTTONSA           ,0),\r
-          USM(TB_INSERTBUTTONA         ,0),\r
-          USM(TB_DELETEBUTTON          ,0),\r
-          USM(TB_GETBUTTON             ,0),\r
-          USM(TB_BUTTONCOUNT           ,0),\r
-          USM(TB_COMMANDTOINDEX        ,0),\r
-          USM(TB_SAVERESTOREA          ,0),\r
-          USM(TB_CUSTOMIZE             ,0),\r
-          USM(TB_ADDSTRINGA            ,0),\r
-          USM(TB_GETITEMRECT           ,0),\r
-          USM(TB_BUTTONSTRUCTSIZE      ,0),\r
-          USM(TB_SETBUTTONSIZE         ,0),\r
-          USM(TB_SETBITMAPSIZE         ,0),\r
-          USM(TB_AUTOSIZE              ,0),\r
-          USM(TB_GETTOOLTIPS           ,0),\r
-          USM(TB_SETTOOLTIPS           ,0),\r
-          USM(TB_SETPARENT             ,0),\r
-          USM(TB_SETROWS               ,0),\r
-          USM(TB_GETROWS               ,0),\r
-          USM(TB_GETBITMAPFLAGS        ,0),\r
-          USM(TB_SETCMDID              ,0),\r
-          USM(TB_CHANGEBITMAP          ,0),\r
-          USM(TB_GETBITMAP             ,0),\r
-          USM(TB_GETBUTTONTEXTA        ,0),\r
-          USM(TB_REPLACEBITMAP         ,0),\r
-          USM(TB_SETINDENT             ,0),\r
-          USM(TB_SETIMAGELIST          ,0),\r
-          USM(TB_GETIMAGELIST          ,0),\r
-          USM(TB_LOADIMAGES            ,0),\r
-          USM(TB_GETRECT               ,0),\r
-          USM(TB_SETHOTIMAGELIST       ,0),\r
-          USM(TB_GETHOTIMAGELIST       ,0),\r
-          USM(TB_SETDISABLEDIMAGELIST  ,0),\r
-          USM(TB_GETDISABLEDIMAGELIST  ,0),\r
-          USM(TB_SETSTYLE              ,0),\r
-          USM(TB_GETSTYLE              ,0),\r
-          USM(TB_GETBUTTONSIZE         ,0),\r
-          USM(TB_SETBUTTONWIDTH        ,0),\r
-          USM(TB_SETMAXTEXTROWS        ,0),\r
-          USM(TB_GETTEXTROWS           ,0),\r
-          USM(TB_GETOBJECT             ,0),\r
-          USM(TB_GETBUTTONINFOW        ,0),\r
-          USM(TB_SETBUTTONINFOW        ,0),\r
-          USM(TB_GETBUTTONINFOA        ,0),\r
-          USM(TB_SETBUTTONINFOA        ,0),\r
-          USM(TB_INSERTBUTTONW         ,0),\r
-          USM(TB_ADDBUTTONSW           ,0),\r
-          USM(TB_HITTEST               ,0),\r
-          USM(TB_SETDRAWTEXTFLAGS      ,0),\r
-          USM(TB_GETHOTITEM            ,0),\r
-          USM(TB_SETHOTITEM            ,0),\r
-          USM(TB_SETANCHORHIGHLIGHT    ,0),\r
-          USM(TB_GETANCHORHIGHLIGHT    ,0),\r
-          USM(TB_GETBUTTONTEXTW        ,0),\r
-          USM(TB_SAVERESTOREW          ,0),\r
-          USM(TB_ADDSTRINGW            ,0),\r
-          USM(TB_MAPACCELERATORA       ,0),\r
-          USM(TB_GETINSERTMARK         ,0),\r
-          USM(TB_SETINSERTMARK         ,0),\r
-          USM(TB_INSERTMARKHITTEST     ,0),\r
-          USM(TB_MOVEBUTTON            ,0),\r
-          USM(TB_GETMAXSIZE            ,0),\r
-          USM(TB_SETEXTENDEDSTYLE      ,0),\r
-          USM(TB_GETEXTENDEDSTYLE      ,0),\r
-          USM(TB_GETPADDING            ,0),\r
-          USM(TB_SETPADDING            ,0),\r
-          USM(TB_SETINSERTMARKCOLOR    ,0),\r
-          USM(TB_GETINSERTMARKCOLOR    ,0),\r
-          USM(TB_MAPACCELERATORW       ,0),\r
-          USM(TB_GETSTRINGW            ,0),\r
-          USM(TB_GETSTRINGA            ,0),\r
-          USM(TB_UNKWN45D              ,8),\r
-          USM(TB_UNKWN45E              ,0),\r
-          USM(TB_UNKWN460              ,0),\r
-          USM(TB_UNKWN463              ,8),\r
-          USM(TB_UNKWN464              ,0),\r
-          {0,0,0} };\r
-\r
-static const USER_MSG tooltips_array[] = {\r
-          USM(TTM_ACTIVATE             ,0),\r
-          USM(TTM_SETDELAYTIME         ,0),\r
-          USM(TTM_ADDTOOLA             ,0),\r
-          USM(TTM_DELTOOLA             ,0),\r
-          USM(TTM_NEWTOOLRECTA         ,0),\r
-          USM(TTM_RELAYEVENT           ,0),\r
-          USM(TTM_GETTOOLINFOA         ,0),\r
-          USM(TTM_HITTESTA             ,0),\r
-          USM(TTM_GETTEXTA             ,0),\r
-          USM(TTM_UPDATETIPTEXTA       ,0),\r
-          USM(TTM_GETTOOLCOUNT         ,0),\r
-          USM(TTM_ENUMTOOLSA           ,0),\r
-          USM(TTM_GETCURRENTTOOLA      ,0),\r
-          USM(TTM_WINDOWFROMPOINT      ,0),\r
-          USM(TTM_TRACKACTIVATE        ,0),\r
-          USM(TTM_TRACKPOSITION        ,0),\r
-          USM(TTM_SETTIPBKCOLOR        ,0),\r
-          USM(TTM_SETTIPTEXTCOLOR      ,0),\r
-          USM(TTM_GETDELAYTIME         ,0),\r
-          USM(TTM_GETTIPBKCOLOR        ,0),\r
-          USM(TTM_GETTIPTEXTCOLOR      ,0),\r
-          USM(TTM_SETMAXTIPWIDTH       ,0),\r
-          USM(TTM_GETMAXTIPWIDTH       ,0),\r
-          USM(TTM_SETMARGIN            ,0),\r
-          USM(TTM_GETMARGIN            ,0),\r
-          USM(TTM_POP                  ,0),\r
-          USM(TTM_UPDATE               ,0),\r
-          USM(TTM_GETBUBBLESIZE        ,0),\r
-          USM(TTM_ADDTOOLW             ,0),\r
-          USM(TTM_DELTOOLW             ,0),\r
-          USM(TTM_NEWTOOLRECTW         ,0),\r
-          USM(TTM_GETTOOLINFOW         ,0),\r
-          USM(TTM_SETTOOLINFOW         ,0),\r
-          USM(TTM_HITTESTW             ,0),\r
-          USM(TTM_GETTEXTW             ,0),\r
-          USM(TTM_UPDATETIPTEXTW       ,0),\r
-          USM(TTM_ENUMTOOLSW           ,0),\r
-          USM(TTM_GETCURRENTTOOLW      ,0),\r
-          {0,0,0} };\r
-\r
-static const USER_MSG comboex_array[] = {\r
-          USM(CBEM_INSERTITEMA        ,0),\r
-          USM(CBEM_SETIMAGELIST       ,0),\r
-          USM(CBEM_GETIMAGELIST       ,0),\r
-          USM(CBEM_GETITEMA           ,0),\r
-          USM(CBEM_SETITEMA           ,0),\r
-          USM(CBEM_GETCOMBOCONTROL    ,0),\r
-          USM(CBEM_GETEDITCONTROL     ,0),\r
-          USM(CBEM_SETEXSTYLE         ,0),\r
-          USM(CBEM_GETEXTENDEDSTYLE   ,0),\r
-          USM(CBEM_HASEDITCHANGED     ,0),\r
-          USM(CBEM_INSERTITEMW        ,0),\r
-          USM(CBEM_SETITEMW           ,0),\r
-          USM(CBEM_GETITEMW           ,0),\r
-          USM(CBEM_SETEXTENDEDSTYLE   ,0),\r
-          {0,0,0} };\r
-\r
-static const USER_MSG propsht_array[] = {\r
-          USM(PSM_SETCURSEL           ,0),\r
-          USM(PSM_REMOVEPAGE          ,0),\r
-          USM(PSM_ADDPAGE             ,0),\r
-          USM(PSM_CHANGED             ,0),\r
-          USM(PSM_RESTARTWINDOWS      ,0),\r
-          USM(PSM_REBOOTSYSTEM        ,0),\r
-          USM(PSM_CANCELTOCLOSE       ,0),\r
-          USM(PSM_QUERYSIBLINGS       ,0),\r
-          USM(PSM_UNCHANGED           ,0),\r
-          USM(PSM_APPLY               ,0),\r
-          USM(PSM_SETTITLEA           ,0),\r
-          USM(PSM_SETWIZBUTTONS       ,0),\r
-          USM(PSM_PRESSBUTTON         ,0),\r
-          USM(PSM_SETCURSELID         ,0),\r
-          USM(PSM_SETFINISHTEXTA      ,0),\r
-          USM(PSM_GETTABCONTROL       ,0),\r
-          USM(PSM_ISDIALOGMESSAGE     ,0),\r
-          USM(PSM_GETCURRENTPAGEHWND  ,0),\r
-          USM(PSM_SETTITLEW           ,0),\r
-          USM(PSM_SETFINISHTEXTW      ,0),\r
-          {0,0,0} };\r
-const WCHAR PropSheetInfoStr[] =\r
-    {'P','r','o','p','e','r','t','y','S','h','e','e','t','I','n','f','o',0 };\r
-\r
-static const USER_MSG updown_array[] = {\r
-          USM(UDM_SETRANGE            ,0),\r
-          USM(UDM_GETRANGE            ,0),\r
-          USM(UDM_SETPOS              ,0),\r
-          USM(UDM_GETPOS              ,0),\r
-          USM(UDM_SETBUDDY            ,0),\r
-          USM(UDM_GETBUDDY            ,0),\r
-          USM(UDM_SETACCEL            ,0),\r
-          USM(UDM_GETACCEL            ,0),\r
-          USM(UDM_SETBASE             ,0),\r
-          USM(UDM_GETBASE             ,0),\r
-          USM(UDM_SETRANGE32          ,0),\r
-          USM(UDM_GETRANGE32          ,0),\r
-          USM(UDM_SETPOS32            ,0),\r
-          USM(UDM_GETPOS32            ,0),\r
-          {0,0,0} };\r
-\r
-/* generated from:\r
- * $ for i in `grep EM_ include/richedit.h | cut -d' ' -f2 | cut -f1`; do echo -e "          USM($i\t\t,0),"; done\r
- */\r
-static const USER_MSG richedit_array[] = {\r
-          {"EM_SCROLLCARET", WM_USER+49 ,0},\r
-          USM(EM_CANPASTE               ,0),\r
-          USM(EM_DISPLAYBAND            ,0),\r
-          USM(EM_EXGETSEL               ,0),\r
-          USM(EM_EXLIMITTEXT            ,0),\r
-          USM(EM_EXLINEFROMCHAR         ,0),\r
-          USM(EM_EXSETSEL               ,0),\r
-          USM(EM_FINDTEXT               ,0),\r
-          USM(EM_FORMATRANGE            ,0),\r
-          USM(EM_GETCHARFORMAT          ,0),\r
-          USM(EM_GETEVENTMASK           ,0),\r
-          USM(EM_GETOLEINTERFACE        ,0),\r
-          USM(EM_GETPARAFORMAT          ,0),\r
-          USM(EM_GETSELTEXT             ,0),\r
-          USM(EM_HIDESELECTION          ,0),\r
-          USM(EM_PASTESPECIAL           ,0),\r
-          USM(EM_REQUESTRESIZE          ,0),\r
-          USM(EM_SELECTIONTYPE          ,0),\r
-          USM(EM_SETBKGNDCOLOR          ,0),\r
-          USM(EM_SETCHARFORMAT          ,0),\r
-          USM(EM_SETEVENTMASK           ,0),\r
-          USM(EM_SETOLECALLBACK         ,0),\r
-          USM(EM_SETPARAFORMAT          ,0),\r
-          USM(EM_SETTARGETDEVICE        ,0),\r
-          USM(EM_STREAMIN               ,0),\r
-          USM(EM_STREAMOUT              ,0),\r
-          USM(EM_GETTEXTRANGE           ,0),\r
-          USM(EM_FINDWORDBREAK          ,0),\r
-          USM(EM_SETOPTIONS             ,0),\r
-          USM(EM_GETOPTIONS             ,0),\r
-          USM(EM_FINDTEXTEX             ,0),\r
-          USM(EM_GETWORDBREAKPROCEX     ,0),\r
-          USM(EM_SETWORDBREAKPROCEX     ,0),\r
-          USM(EM_SETUNDOLIMIT           ,0),\r
-          USM(EM_REDO                   ,0),\r
-          USM(EM_CANREDO                ,0),\r
-          USM(EM_GETUNDONAME            ,0),\r
-          USM(EM_GETREDONAME            ,0),\r
-          USM(EM_STOPGROUPTYPING        ,0),\r
-          USM(EM_SETTEXTMODE            ,0),\r
-          USM(EM_GETTEXTMODE            ,0),\r
-          USM(EM_AUTOURLDETECT          ,0),\r
-          USM(EM_GETAUTOURLDETECT       ,0),\r
-          USM(EM_SETPALETTE             ,0),\r
-          USM(EM_GETTEXTEX              ,0),\r
-          USM(EM_GETTEXTLENGTHEX        ,0),\r
-          USM(EM_SHOWSCROLLBAR          ,0),\r
-          USM(EM_SETTEXTEX              ,0),\r
-          USM(EM_SETPUNCTUATION         ,0),\r
-          USM(EM_GETPUNCTUATION         ,0),\r
-          USM(EM_SETWORDWRAPMODE        ,0),\r
-          USM(EM_GETWORDWRAPMODE        ,0),\r
-          USM(EM_SETIMECOLOR            ,0),\r
-          USM(EM_GETIMECOLOR            ,0),\r
-          USM(EM_SETIMEOPTIONS          ,0),\r
-          USM(EM_GETIMEOPTIONS          ,0),\r
-          USM(EM_CONVPOSITION           ,0),\r
-          USM(EM_SETLANGOPTIONS         ,0),\r
-          USM(EM_GETLANGOPTIONS         ,0),\r
-          USM(EM_GETIMECOMPMODE         ,0),\r
-          USM(EM_FINDTEXTW              ,0),\r
-          USM(EM_FINDTEXTEXW            ,0),\r
-          USM(EM_RECONVERSION           ,0),\r
-          USM(EM_SETIMEMODEBIAS         ,0),\r
-          USM(EM_GETIMEMODEBIAS         ,0),\r
-          USM(EM_SETBIDIOPTIONS         ,0),\r
-          USM(EM_GETBIDIOPTIONS         ,0),\r
-          USM(EM_SETTYPOGRAPHYOPTIONS   ,0),\r
-          USM(EM_GETTYPOGRAPHYOPTIONS   ,0),\r
-          USM(EM_SETEDITSTYLE           ,0),\r
-          USM(EM_GETEDITSTYLE           ,0),\r
-          USM(EM_OUTLINE                ,0),\r
-          USM(EM_GETSCROLLPOS           ,0),\r
-          USM(EM_SETSCROLLPOS           ,0),\r
-          USM(EM_SETFONTSIZE            ,0),\r
-          USM(EM_GETZOOM                ,0),\r
-          USM(EM_SETZOOM                ,0),\r
-          {0,0,0} };\r
-\r
-#undef SZOF\r
-#undef USM\r
-\r
-static CONTROL_CLASS  cc_array[] = {\r
-    {WC_COMBOBOXEXW,    comboex_array,  0},\r
-    {WC_PROPSHEETW,     propsht_array,  0},\r
-    {REBARCLASSNAMEW,   rebar_array,    0},\r
-    {TOOLBARCLASSNAMEW, toolbar_array,  0},\r
-    {TOOLTIPS_CLASSW,   tooltips_array, 0},\r
-    {UPDOWN_CLASSW,     updown_array,   0},\r
-    {RICHEDIT_CLASS20W, richedit_array, 0},\r
-    {0, 0, 0} };\r
-\r
-\r
-/************************************************************************/\r
-\r
-\r
-/* WM_NOTIFY function codes display */\r
-\r
-typedef struct\r
-{\r
-    const char *name;     /* name of notify message        */\r
-    UINT        value;     /* notify code value             */\r
-    UINT        len;       /* length of extra space to dump */\r
-} SPY_NOTIFY;\r
-\r
-#define SPNFY(a,b) { #a ,a,sizeof(b)-sizeof(NMHDR)}\r
-\r
-/* Array MUST be in descending order by the 'value' field  */\r
-/* (since value is UNSIGNED, 0xffffffff is largest and     */\r
-/*  0xfffffffe is smaller). A binary search is used to     */\r
-/* locate the correct 'value'.                             */\r
-static const SPY_NOTIFY spnfy_array[] = {\r
-    /*  common        0U       to  0U-99U  */\r
-    SPNFY(NM_OUTOFMEMORY,        NMHDR),\r
-    SPNFY(NM_CLICK,              NMHDR),\r
-    SPNFY(NM_DBLCLK,             NMHDR),\r
-    SPNFY(NM_RETURN,             NMHDR),\r
-    SPNFY(NM_RCLICK,             NMHDR),\r
-    SPNFY(NM_RDBLCLK,            NMHDR),\r
-    SPNFY(NM_SETFOCUS,           NMHDR),\r
-    SPNFY(NM_KILLFOCUS,          NMHDR),\r
-    SPNFY(NM_CUSTOMDRAW,         NMCUSTOMDRAW),\r
-    SPNFY(NM_HOVER,              NMHDR),\r
-    SPNFY(NM_NCHITTEST,          NMMOUSE),\r
-    SPNFY(NM_KEYDOWN,            NMKEY),\r
-    SPNFY(NM_RELEASEDCAPTURE,    NMHDR),\r
-    SPNFY(NM_SETCURSOR,          NMMOUSE),\r
-    SPNFY(NM_CHAR,               NMCHAR),\r
-    SPNFY(NM_TOOLTIPSCREATED,    NMTOOLTIPSCREATED),\r
-    /* Listview       0U-100U  to  0U-199U  */\r
-    SPNFY(LVN_ITEMCHANGING,      NMLISTVIEW),\r
-    SPNFY(LVN_ITEMCHANGED,       NMLISTVIEW),\r
-    SPNFY(LVN_INSERTITEM,        NMLISTVIEW),\r
-    SPNFY(LVN_DELETEITEM,        NMLISTVIEW),\r
-    SPNFY(LVN_DELETEALLITEMS,    NMLISTVIEW),\r
-    SPNFY(LVN_BEGINLABELEDITA,   NMLVDISPINFOA),\r
-    SPNFY(LVN_ENDLABELEDITA,     NMLVDISPINFOA),\r
-    SPNFY(LVN_COLUMNCLICK,       NMLISTVIEW),\r
-    SPNFY(LVN_BEGINDRAG,         NMLISTVIEW),\r
-    SPNFY(LVN_BEGINRDRAG,        NMLISTVIEW),\r
-    SPNFY(LVN_ODCACHEHINT,       NMLVCACHEHINT),\r
-    SPNFY(LVN_ITEMACTIVATE,      NMITEMACTIVATE),\r
-    SPNFY(LVN_ODSTATECHANGED,    NMLVODSTATECHANGE),\r
-    SPNFY(LVN_HOTTRACK,          NMLISTVIEW),\r
-    SPNFY(LVN_GETDISPINFOA,      NMLVDISPINFOA),\r
-    SPNFY(LVN_SETDISPINFOA,      NMLVDISPINFOA),\r
-    SPNFY(LVN_ODFINDITEMA,       NMLVFINDITEMA),\r
-    SPNFY(LVN_KEYDOWN,           NMLVKEYDOWN),\r
-    SPNFY(LVN_MARQUEEBEGIN,      NMLISTVIEW),\r
-    SPNFY(LVN_GETINFOTIPA,       NMLVGETINFOTIPA),\r
-    SPNFY(LVN_GETINFOTIPW,       NMLVGETINFOTIPW),\r
-    SPNFY(LVN_BEGINLABELEDITW,   NMLVDISPINFOW),\r
-    SPNFY(LVN_ENDLABELEDITW,     NMLVDISPINFOW),\r
-    SPNFY(LVN_GETDISPINFOW,      NMLVDISPINFOW),\r
-    SPNFY(LVN_SETDISPINFOW,      NMLVDISPINFOW),\r
-    SPNFY(LVN_ODFINDITEMW,       NMLVFINDITEMW),\r
-    /* PropertySheet  0U-200U  to  0U-299U  */\r
-    SPNFY(PSN_SETACTIVE,         PSHNOTIFY),\r
-    SPNFY(PSN_KILLACTIVE,        PSHNOTIFY),\r
-    SPNFY(PSN_APPLY,             PSHNOTIFY),\r
-    SPNFY(PSN_RESET,             PSHNOTIFY),\r
-    SPNFY(PSN_HELP,              PSHNOTIFY),\r
-    SPNFY(PSN_WIZBACK,           PSHNOTIFY),\r
-    SPNFY(PSN_WIZNEXT,           PSHNOTIFY),\r
-    SPNFY(PSN_WIZFINISH,         PSHNOTIFY),\r
-    SPNFY(PSN_QUERYCANCEL,       PSHNOTIFY),\r
-    SPNFY(PSN_GETOBJECT,         NMOBJECTNOTIFY),\r
-    SPNFY(PSN_TRANSLATEACCELERATOR, PSHNOTIFY),\r
-    SPNFY(PSN_QUERYINITIALFOCUS, PSHNOTIFY),\r
-    /* Header         0U-300U  to  0U-399U  */\r
-    SPNFY(HDN_ITEMCHANGINGA,     NMHEADERA),\r
-    SPNFY(HDN_ITEMCHANGEDA,      NMHEADERA),\r
-    SPNFY(HDN_ITEMCLICKA,        NMHEADERA),\r
-    SPNFY(HDN_ITEMDBLCLICKA,     NMHEADERA),\r
-    SPNFY(HDN_DIVIDERDBLCLICKA,  NMHEADERA),\r
-    SPNFY(HDN_BEGINTRACKA,       NMHEADERA),\r
-    SPNFY(HDN_ENDTRACKA,         NMHEADERA),\r
-    SPNFY(HDN_TRACKA,            NMHEADERA),\r
-    SPNFY(HDN_GETDISPINFOA,      NMHEADERA),\r
-    SPNFY(HDN_BEGINDRAG,         NMHDR),\r
-    SPNFY(HDN_ENDDRAG,           NMHDR),\r
-    SPNFY(HDN_ITEMCHANGINGW,     NMHDR),\r
-    SPNFY(HDN_ITEMCHANGEDW,      NMHDR),\r
-    SPNFY(HDN_ITEMCLICKW,        NMHDR),\r
-    SPNFY(HDN_ITEMDBLCLICKW,     NMHDR),\r
-    SPNFY(HDN_DIVIDERDBLCLICKW,  NMHDR),\r
-    SPNFY(HDN_BEGINTRACKW,       NMHDR),\r
-    SPNFY(HDN_ENDTRACKW,         NMHDR),\r
-    SPNFY(HDN_TRACKW,            NMHDR),\r
-    SPNFY(HDN_GETDISPINFOW,      NMHDR),\r
-    /* Treeview       0U-400U  to  0U-499U  */\r
-    SPNFY(TVN_SELCHANGINGA,      NMTREEVIEWA),\r
-    SPNFY(TVN_SELCHANGEDA,       NMTREEVIEWA),\r
-    SPNFY(TVN_GETDISPINFOA,      NMTVDISPINFOA),\r
-    SPNFY(TVN_SETDISPINFOA,      NMTVDISPINFOA),\r
-    SPNFY(TVN_ITEMEXPANDINGA,    NMTREEVIEWA),\r
-    SPNFY(TVN_ITEMEXPANDEDA,     NMTREEVIEWA),\r
-    SPNFY(TVN_BEGINDRAGA,        NMTREEVIEWA),\r
-    SPNFY(TVN_BEGINRDRAGA,       NMTREEVIEWA),\r
-    SPNFY(TVN_DELETEITEMA,       NMTREEVIEWA),\r
-    SPNFY(TVN_BEGINLABELEDITA,   NMTVDISPINFOA),\r
-    SPNFY(TVN_ENDLABELEDITA,     NMTVDISPINFOA),\r
-    SPNFY(TVN_KEYDOWN,           NMTVKEYDOWN),\r
-    SPNFY(TVN_SELCHANGINGW,      NMTREEVIEWW),\r
-    SPNFY(TVN_SELCHANGEDW,       NMTREEVIEWW),\r
-    SPNFY(TVN_GETDISPINFOW,      NMTVDISPINFOW),\r
-    SPNFY(TVN_SETDISPINFOW,      NMTVDISPINFOW),\r
-    SPNFY(TVN_ITEMEXPANDINGW,    NMTREEVIEWW),\r
-    SPNFY(TVN_ITEMEXPANDEDW,     NMTREEVIEWW),\r
-    SPNFY(TVN_BEGINDRAGW,        NMTREEVIEWW),\r
-    SPNFY(TVN_BEGINRDRAGW,       NMTREEVIEWW),\r
-    SPNFY(TVN_DELETEITEMW,       NMTREEVIEWW),\r
-    SPNFY(TVN_BEGINLABELEDITW,   NMTVDISPINFOW),\r
-    SPNFY(TVN_ENDLABELEDITW,     NMTVDISPINFOW),\r
-    /* Tooltips       0U-520U  to  0U-549U  */\r
-    SPNFY(TTN_GETDISPINFOA,      NMHDR),\r
-    SPNFY(TTN_SHOW,              NMHDR),\r
-    SPNFY(TTN_POP,               NMHDR),\r
-    SPNFY(TTN_GETDISPINFOW,      NMHDR),\r
-    /* Tab            0U-550U  to  0U-580U  */\r
-    SPNFY(TCN_KEYDOWN,           NMHDR),\r
-    SPNFY(TCN_SELCHANGE,         NMHDR),\r
-    SPNFY(TCN_SELCHANGING,       NMHDR),\r
-    SPNFY(TCN_GETOBJECT,         NMHDR),\r
-    /* Common Dialog  0U-601U  to  0U-699U  */\r
-    SPNFY(CDN_INITDONE,          OFNOTIFYA),\r
-    SPNFY(CDN_SELCHANGE,         OFNOTIFYA),\r
-    SPNFY(CDN_FOLDERCHANGE,      OFNOTIFYA),\r
-    SPNFY(CDN_SHAREVIOLATION,    OFNOTIFYA),\r
-    SPNFY(CDN_HELP,              OFNOTIFYA),\r
-    SPNFY(CDN_FILEOK,            OFNOTIFYA),\r
-    SPNFY(CDN_TYPECHANGE,        OFNOTIFYA),\r
-    /* Toolbar        0U-700U  to  0U-720U  */\r
-    SPNFY(TBN_GETBUTTONINFOA,    NMTOOLBARA),\r
-    SPNFY(TBN_BEGINDRAG,         NMTOOLBARA),\r
-    SPNFY(TBN_ENDDRAG,           NMTOOLBARA),\r
-    SPNFY(TBN_BEGINADJUST,       NMHDR),\r
-    SPNFY(TBN_ENDADJUST,         NMHDR),\r
-    SPNFY(TBN_RESET,             NMHDR),\r
-    SPNFY(TBN_QUERYINSERT,       NMTOOLBARA),\r
-    SPNFY(TBN_QUERYDELETE,       NMTOOLBARA),\r
-    SPNFY(TBN_TOOLBARCHANGE,     NMHDR),\r
-    SPNFY(TBN_CUSTHELP,          NMHDR),\r
-    SPNFY(TBN_DROPDOWN,          NMTOOLBARA),\r
-    SPNFY(TBN_GETOBJECT,         NMOBJECTNOTIFY),\r
-    SPNFY(TBN_HOTITEMCHANGE,     NMTBHOTITEM),\r
-    SPNFY(TBN_DRAGOUT,           NMTOOLBARA),\r
-    SPNFY(TBN_DELETINGBUTTON,    NMTOOLBARA),\r
-    SPNFY(TBN_GETDISPINFOA,      NMTBDISPINFOA),\r
-    SPNFY(TBN_GETDISPINFOW,      NMTBDISPINFOW),\r
-    SPNFY(TBN_GETINFOTIPA,       NMTBGETINFOTIPA),\r
-    SPNFY(TBN_GETINFOTIPW,       NMTBGETINFOTIPW),\r
-    SPNFY(TBN_GETBUTTONINFOW,    NMTOOLBARW),\r
-    /* Up/Down        0U-721U  to  0U-740U  */\r
-    SPNFY(UDN_DELTAPOS,          NM_UPDOWN),\r
-    /* Month Calendar 0U-750U  to  0U-759U  */\r
-    /* ******************* WARNING ***************************** */\r
-    /* The following appear backwards but needs to be this way.  */\r
-    /* The reason is that MS (and us) define the MCNs as         */\r
-    /*         MCN_FIRST + n                                     */\r
-    /* instead of the way ALL other notifications are            */\r
-    /*         TBN_FIRST - n                                     */\r
-    /* The only place that this is important is in this list     */\r
-    /*                                                           */\r
-    /* Also since the same error was made with the DTN_ items,   */\r
-    /* they overlay the MCN_ and need to be inserted in the      */\r
-    /* other section of the table so that it is in order for     */\r
-    /* the binary search.                                        */\r
-    /*                                                           */\r
-    /* Thank you MS for your obvious quality control!!           */\r
-    /* ******************* WARNING ***************************** */\r
-    /* Date/Time      0U-760U  to  0U-799U  */\r
-    /* SPNFY(MCN_SELECT,            NMHDR), */\r
-    /* SPNFY(MCN_GETDAYSTATE,       NMHDR), */\r
-    /* SPNFY(MCN_SELCHANGE,         NMHDR), */\r
-    /* ******************* WARNING ***************************** */\r
-    /* The following appear backwards but needs to be this way.  */\r
-    /* The reason is that MS (and us) define the MCNs as         */\r
-    /*         DTN_FIRST + n                                     */\r
-    /* instead of the way ALL other notifications are            */\r
-    /*         TBN_FIRST - n                                     */\r
-    /* The only place that this is important is in this list     */\r
-    /* ******************* WARNING ***************************** */\r
-    SPNFY(DTN_FORMATQUERYW,      NMHDR),\r
-    SPNFY(DTN_FORMATW,           NMHDR),\r
-    SPNFY(DTN_WMKEYDOWNW,        NMHDR),\r
-    SPNFY(DTN_USERSTRINGW,       NMHDR),\r
-    SPNFY(MCN_SELECT,            NMHDR),\r
-    SPNFY(MCN_GETDAYSTATE,       NMHDR),\r
-    SPNFY(MCN_SELCHANGE,         NMHDR),\r
-    SPNFY(DTN_CLOSEUP,           NMHDR),\r
-    SPNFY(DTN_DROPDOWN,          NMHDR),\r
-    SPNFY(DTN_FORMATQUERYA,      NMHDR),\r
-    SPNFY(DTN_FORMATA,           NMHDR),\r
-    SPNFY(DTN_WMKEYDOWNA,        NMHDR),\r
-    SPNFY(DTN_USERSTRINGA,       NMHDR),\r
-    SPNFY(DTN_DATETIMECHANGE,    NMHDR),\r
-    /* ComboBoxEx     0U-800U  to  0U-830U  */\r
-    SPNFY(CBEN_GETDISPINFOA,     NMCOMBOBOXEXA),\r
-    SPNFY(CBEN_INSERTITEM,       NMCOMBOBOXEXA),\r
-    SPNFY(CBEN_DELETEITEM,       NMCOMBOBOXEXA),\r
-    SPNFY(CBEN_BEGINEDIT,        NMHDR),\r
-    SPNFY(CBEN_ENDEDITA,         NMCBEENDEDITA),\r
-    SPNFY(CBEN_ENDEDITW,         NMCBEENDEDITW),\r
-    SPNFY(CBEN_GETDISPINFOW,     NMCOMBOBOXEXW),\r
-    SPNFY(CBEN_DRAGBEGINA,       NMCBEDRAGBEGINA),\r
-    SPNFY(CBEN_DRAGBEGINW,       NMCBEDRAGBEGINW),\r
-    /* Rebar          0U-831U  to  0U-859U  */\r
-    SPNFY(RBN_HEIGHTCHANGE,      NMHDR),\r
-    SPNFY(RBN_GETOBJECT,         NMOBJECTNOTIFY),\r
-    SPNFY(RBN_LAYOUTCHANGED,     NMHDR),\r
-    SPNFY(RBN_AUTOSIZE,          NMRBAUTOSIZE),\r
-    SPNFY(RBN_BEGINDRAG,         NMREBAR),\r
-    SPNFY(RBN_ENDDRAG,           NMREBAR),\r
-    SPNFY(RBN_DELETINGBAND,      NMREBAR),\r
-    SPNFY(RBN_DELETEDBAND,       NMREBAR),\r
-    SPNFY(RBN_CHILDSIZE,         NMREBARCHILDSIZE),\r
-    /* IP Adderss     0U-860U  to  0U-879U  */\r
-    SPNFY(IPN_FIELDCHANGED,      NMHDR),\r
-    /* Status bar     0U-880U  to  0U-899U  */\r
-    SPNFY(SBN_SIMPLEMODECHANGE,  NMHDR),\r
-    /* Pager          0U-900U  to  0U-950U  */\r
-    SPNFY(PGN_SCROLL,            NMPGSCROLL),\r
-    SPNFY(PGN_CALCSIZE,          NMPGCALCSIZE),\r
-    {0,0,0}};\r
-static const SPY_NOTIFY *end_spnfy_array;     /* ptr to last good entry in array */\r
-#undef SPNFY\r
-\r
-static BOOL SPY_Exclude[SPY_MAX_MSGNUM+1];\r
-static BOOL SPY_ExcludeDWP = 0;\r
-\r
-#define SPY_EXCLUDE(msg) \\r
-    (SPY_Exclude[(msg) > SPY_MAX_MSGNUM ? SPY_MAX_MSGNUM : (msg)])\r
-\r
-\r
-typedef struct\r
-{\r
-    UINT       msgnum;           /* message number */\r
-    HWND       msg_hwnd;         /* window handle for message          */\r
-    WPARAM     wParam;           /* message parameter                  */\r
-    LPARAM     lParam;           /* message parameter                  */\r
-    INT        data_len;         /* length of data to dump             */\r
-    char       msg_name[60];     /* message name (see SPY_GetMsgName)  */\r
-    WCHAR      wnd_class[60];    /* window class name (full)           */\r
-    WCHAR      wnd_name[16];     /* window name for message            */\r
-} SPY_INSTANCE;\r
-\r
-static int indent_tls_index;\r
-\r
-/***********************************************************************\r
- *           get_indent_level\r
- */\r
-inline static INT_PTR get_indent_level(void)\r
-{\r
-    return (INT_PTR)TlsGetValue( indent_tls_index );\r
-}\r
-\r
-\r
-/***********************************************************************\r
- *           set_indent_level\r
- */\r
-inline static void set_indent_level( INT_PTR level )\r
-{\r
-    TlsSetValue( indent_tls_index, (void *)level );\r
-}\r
-\r
-\r
-/***********************************************************************\r
- *           SPY_GetMsgInternal\r
- */\r
-static const char *SPY_GetMsgInternal( UINT msg )\r
-{\r
-    if (msg <= SPY_MAX_MSGNUM)\r
-        return MessageTypeNames[msg];\r
-\r
-    if (msg >= LVM_FIRST && msg <= LVM_FIRST + SPY_MAX_LVMMSGNUM)\r
-        return LVMMessageTypeNames[msg-LVM_FIRST];\r
-\r
-    if (msg >= TV_FIRST && msg <= TV_FIRST + SPY_MAX_TVMSGNUM)\r
-        return TVMessageTypeNames[msg-TV_FIRST];\r
-\r
-    if (msg >= HDM_FIRST && msg <= HDM_FIRST + SPY_MAX_HDMMSGNUM)\r
-        return HDMMessageTypeNames[msg-HDM_FIRST];\r
-\r
-    if (msg >= TCM_FIRST && msg <= TCM_FIRST + SPY_MAX_TCMMSGNUM)\r
-        return TCMMessageTypeNames[msg-TCM_FIRST];\r
-\r
-    if (msg >= PGM_FIRST && msg <= PGM_FIRST + SPY_MAX_PGMMSGNUM)\r
-        return PGMMessageTypeNames[msg-PGM_FIRST];\r
-\r
-    if (msg >= CCM_FIRST && msg <= CCM_FIRST + SPY_MAX_CCMMSGNUM)\r
-        return CCMMessageTypeNames[msg-CCM_FIRST];\r
-#ifndef __REACTOS__\r
-    if (msg >= WM_WINE_DESTROYWINDOW && msg <= WM_WINE_DESTROYWINDOW + SPY_MAX_WINEMSGNUM)\r
-        return WINEMessageTypeNames[msg-WM_WINE_DESTROYWINDOW];\r
-#endif\r
-    return NULL;\r
-}\r
-\r
-/***********************************************************************\r
- *           SPY_Bsearch_Msg\r
- */\r
-static const USER_MSG *SPY_Bsearch_Msg( const USER_MSG *first, const USER_MSG *last, UINT code)\r
-{\r
-    INT count;\r
-    const USER_MSG *test;\r
-\r
-    while (last >= first) {\r
-        count = 1 + last - first;\r
-        if (count < 3) {\r
-#if DEBUG_SPY\r
-            TRACE("code=%d, f-value=%d, f-name=%s, l-value=%d, l-name=%s, l-len=%d,\n",\r
-               code, first->value, first->name, last->value, last->name, last->len);\r
-#endif\r
-            if (first->value == code) return first;\r
-            if (last->value == code) return last;\r
-            return NULL;\r
-        }\r
-        count = count / 2;\r
-        test = first + count;\r
-#if DEBUG_SPY\r
-        TRACE("first=%p, last=%p, test=%p, t-value=%d, code=%d, count=%d\n",\r
-           first, last, test, test->value, code, count);\r
-#endif\r
-        if (test->value == code) return test;\r
-        if (test->value > code)\r
-            last = test - 1;\r
-        else\r
-            first = test + 1;\r
-    }\r
-    return NULL;\r
-}\r
-\r
-/***********************************************************************\r
- *           SPY_GetClassName\r
- *\r
- *  Sets the value of "wnd_class" member of the instance structure.\r
- */\r
-static void SPY_GetClassName( SPY_INSTANCE *sp_e )\r
-{\r
-    DWORD save_error;\r
-\r
-    /* save and restore error code over the next call */\r
-    save_error = GetLastError();\r
-    /* special code to detect a property sheet dialog   */\r
-    if ((GetClassLongW(sp_e->msg_hwnd, GCW_ATOM) == (LONG)WC_DIALOG) &&\r
-        (GetPropW(sp_e->msg_hwnd, PropSheetInfoStr))) {\r
-        strcpyW(sp_e->wnd_class, WC_PROPSHEETW);\r
-    }\r
-    else {\r
-        GetClassNameW(sp_e->msg_hwnd, sp_e->wnd_class, sizeof(sp_e->wnd_class)/sizeof(WCHAR));\r
-    }\r
-    SetLastError(save_error);\r
-}\r
-\r
-/***********************************************************************\r
- *           SPY_GetMsgStuff\r
- *\r
- *  Get message name and other information for dumping\r
- */\r
-static void SPY_GetMsgStuff( SPY_INSTANCE *sp_e )\r
-{\r
-    const USER_MSG *p;\r
-    const char *msg_name = SPY_GetMsgInternal( sp_e->msgnum );\r
-\r
-    sp_e->data_len = 0;\r
-    if (!msg_name)\r
-    {\r
-        INT i = 0;\r
-\r
-        if (sp_e->msgnum >= 0xc000)\r
-        {\r
-            if (GlobalGetAtomNameA( sp_e->msgnum, sp_e->msg_name+1, sizeof(sp_e->msg_name)-2 ))\r
-            {\r
-                sp_e->msg_name[0] = '\"';\r
-                strcat( sp_e->msg_name, "\"" );\r
-                return;\r
-            }\r
-        }\r
-        if (!sp_e->wnd_class[0]) SPY_GetClassName(sp_e);\r
-\r
-#if DEBUG_SPY\r
-        TRACE("looking class %s\n", debugstr_w(sp_e->wnd_class));\r
-#endif\r
-\r
-        while (cc_array[i].classname &&\r
-               strcmpiW(cc_array[i].classname, sp_e->wnd_class) != 0) i++;\r
-\r
-        if (cc_array[i].classname)\r
-        {\r
-#if DEBUG_SPY\r
-            TRACE("process class %s, first %p, last %p\n",\r
-                  debugstr_w(cc_array[i].classname), cc_array[i].classmsg,\r
-                  cc_array[i].lastmsg);\r
-#endif\r
-            p = SPY_Bsearch_Msg (cc_array[i].classmsg, cc_array[i].lastmsg,\r
-                                 sp_e->msgnum);\r
-            if (p) {\r
-                lstrcpynA (sp_e->msg_name, p->name, sizeof(sp_e->msg_name));\r
-                sp_e->data_len = p->len;\r
-                return;\r
-            }\r
-        }\r
-        if (sp_e->msgnum >= WM_USER && sp_e->msgnum <= WM_APP)\r
-            sprintf( sp_e->msg_name, "WM_USER+%d", sp_e->msgnum - WM_USER );\r
-        else\r
-            sprintf( sp_e->msg_name, "%04x", sp_e->msgnum );\r
-    }\r
-    else\r
-    {\r
-        lstrcpynA(sp_e->msg_name, msg_name, sizeof(sp_e->msg_name));\r
-    }\r
-}\r
-\r
-/***********************************************************************\r
- *           SPY_GetWndName\r
- *\r
- *  Sets the value of "wnd_name" and "wnd_class" members of the\r
- *  instance structure.\r
- *\r
- */\r
-static void SPY_GetWndName( SPY_INSTANCE *sp_e )\r
-{\r
-    INT len;\r
-\r
-    SPY_GetClassName( sp_e );\r
-\r
-    len = InternalGetWindowText(sp_e->msg_hwnd, sp_e->wnd_name, sizeof(sp_e->wnd_name)/sizeof(WCHAR));\r
-    if(!len) /* get class name */\r
-    {\r
-        LPWSTR dst = sp_e->wnd_name;\r
-        LPWSTR src = sp_e->wnd_class;\r
-        int n = sizeof(sp_e->wnd_name)/sizeof(WCHAR) - 3;\r
-        *dst++ = '{';\r
-        while ((n-- > 0) && *src) *dst++ = *src++;\r
-        *dst++ = '}';\r
-        *dst = 0;\r
-    }\r
-}\r
-\r
-/***********************************************************************\r
- *           SPY_GetMsgName\r
- *\r
- *  ****  External function  ****\r
- *\r
- *  Get message name\r
- */\r
-const char *SPY_GetMsgName( UINT msg, HWND hWnd )\r
-{\r
-    SPY_INSTANCE ext_sp_e;\r
-\r
-    ext_sp_e.msgnum = msg;\r
-    ext_sp_e.msg_hwnd   = hWnd;\r
-    ext_sp_e.lParam = 0;\r
-    ext_sp_e.wParam = 0;\r
-    ext_sp_e.wnd_class[0] = 0;\r
-    SPY_GetMsgStuff(&ext_sp_e);\r
-    return wine_dbg_sprintf("%s", ext_sp_e.msg_name);\r
-}\r
-\r
-/***********************************************************************\r
- *           SPY_GetVKeyName\r
- */\r
-const char *SPY_GetVKeyName(WPARAM wParam)\r
-{\r
-    const char *vk_key_name;\r
-\r
-    if(wParam <= SPY_MAX_VKKEYSNUM && VK_KeyNames[wParam])\r
-        vk_key_name = VK_KeyNames[wParam];\r
-    else\r
-        vk_key_name = "VK_???";\r
-\r
-    return vk_key_name;\r
-}\r
-\r
-/***********************************************************************\r
- *           SPY_Bsearch_Notify\r
- */\r
-static const SPY_NOTIFY *SPY_Bsearch_Notify( const SPY_NOTIFY *first, const SPY_NOTIFY *last, UINT code)\r
-{\r
-    INT count;\r
-    const SPY_NOTIFY *test;\r
-\r
-    while (last >= first) {\r
-        count = 1 + last - first;\r
-        if (count < 3) {\r
-#if DEBUG_SPY\r
-            TRACE("code=%d, f-value=%d, f-name=%s, l-value=%d, l-name=%s, l-len=%d,\n",\r
-               code, first->value, first->name, last->value, last->name, last->len);\r
-#endif\r
-            if (first->value == code) return first;\r
-            if (last->value == code) return last;\r
-            return NULL;\r
-        }\r
-        count = count / 2;\r
-        test = first + count;\r
-#if DEBUG_SPY\r
-        TRACE("first=%p, last=%p, test=%p, t-value=%d, code=%d, count=%d\n",\r
-           first, last, test, test->value, code, count);\r
-#endif\r
-        if (test->value == code) return test;\r
-        if (test->value < code)\r
-            last = test - 1;\r
-        else\r
-            first = test + 1;\r
-    }\r
-    return NULL;\r
-}\r
-\r
-/***********************************************************************\r
- *           SPY_DumpMem\r
- */\r
-static void SPY_DumpMem (LPCSTR header, const UINT *q, INT len)\r
-{\r
-    int i;\r
-\r
-    for(i=0; i<len-12; i+=16) {\r
-        TRACE("%s [%04x] %08x %08x %08x %08x\n",\r
-              header, i, *q, *(q+1), *(q+2), *(q+3));\r
-        q += 4;\r
-    }\r
-    switch ((len - i + 3) & (~3)) {\r
-    case 16:\r
-        TRACE("%s [%04x] %08x %08x %08x %08x\n",\r
-              header, i, *q, *(q+1), *(q+2), *(q+3));\r
-        break;\r
-    case 12:\r
-        TRACE("%s [%04x] %08x %08x %08x\n",\r
-              header, i, *q, *(q+1), *(q+2));\r
-        break;\r
-    case 8:\r
-        TRACE("%s [%04x] %08x %08x\n",\r
-              header, i, *q, *(q+1));\r
-        break;\r
-    case 4:\r
-        TRACE("%s [%04x] %08x\n",\r
-              header, i, *q);\r
-        break;\r
-    default:\r
-        break;\r
-    }\r
-}\r
-\r
-/***********************************************************************\r
- *           SPY_DumpStructure\r
- */\r
-static void SPY_DumpStructure(const SPY_INSTANCE *sp_e, BOOL enter)\r
-{\r
-    switch (sp_e->msgnum)\r
-        {\r
-        case LVM_INSERTITEMW:\r
-        case LVM_INSERTITEMA:\r
-        case LVM_SETITEMW:\r
-        case LVM_SETITEMA:\r
-            if (!enter) break;\r
-            /* fall through */\r
-        case LVM_GETITEMW:\r
-        case LVM_GETITEMA:\r
-            {\r
-                LPLVITEMA item = (LPLVITEMA) sp_e->lParam;\r
-                if (item) {\r
-                    SPY_DumpMem ("LVITEM", (UINT*)item, sizeof(LVITEMA));\r
-                }\r
-                break;\r
-            }\r
-        case TCM_INSERTITEMW:\r
-        case TCM_INSERTITEMA:\r
-        case TCM_SETITEMW:\r
-        case TCM_SETITEMA:\r
-            if (!enter) break;\r
-            /* fall through */\r
-        case TCM_GETITEMW:\r
-        case TCM_GETITEMA:\r
-            {\r
-                TCITEMA *item = (TCITEMA *) sp_e->lParam;\r
-                if (item) {\r
-                    SPY_DumpMem ("TCITEM", (UINT*)item, sizeof(TCITEMA));\r
-                }\r
-                break;\r
-            }\r
-        case TCM_ADJUSTRECT:\r
-        case LVM_GETITEMRECT:\r
-        case LVM_GETSUBITEMRECT:\r
-            {\r
-                LPRECT rc = (LPRECT) sp_e->lParam;\r
-                if (rc) {\r
-                    TRACE("lParam rect (%ld,%ld)-(%ld,%ld)\n",\r
-                          rc->left, rc->top, rc->right, rc->bottom);\r
-                }\r
-                break;\r
-            }\r
-        case LVM_SETITEMPOSITION32:\r
-            if (!enter) break;\r
-            /* fall through */\r
-        case LVM_GETITEMPOSITION:\r
-        case LVM_GETORIGIN:\r
-            {\r
-                LPPOINT point = (LPPOINT) sp_e->lParam;\r
-                if (point) {\r
-                    TRACE("lParam point x=%ld, y=%ld\n", point->x, point->y);\r
-                }\r
-                break;\r
-            }\r
-        case SBM_SETRANGE:\r
-            if (!enter && (sp_e->msgnum == SBM_SETRANGE)) break;\r
-            TRACE("min=%d max=%d\n", (INT)sp_e->wParam, (INT)sp_e->lParam);\r
-            break;\r
-        case SBM_GETRANGE:\r
-            if ((enter && (sp_e->msgnum == SBM_GETRANGE)) ||\r
-                (!enter && (sp_e->msgnum == SBM_SETRANGE))) break;\r
-            {\r
-                LPINT ptmin = (LPINT) sp_e->wParam;\r
-                LPINT ptmax = (LPINT) sp_e->lParam;\r
-                if (ptmin && ptmax)\r
-                    TRACE("min=%d max=%d\n", *ptmin, *ptmax);\r
-                else if (ptmin)\r
-                    TRACE("min=%d max=n/a\n", *ptmin);\r
-                else if (ptmax)\r
-                    TRACE("min=n/a max=%d\n", *ptmax);\r
-                break;\r
-            }\r
-        case EM_EXSETSEL:\r
-            if (enter && sp_e->lParam)\r
-            {\r
-                CHARRANGE *cr = (CHARRANGE *) sp_e->lParam;\r
-                TRACE("CHARRANGE: cpMin=%ld cpMax=%ld\n", cr->cpMin, cr->cpMax);\r
-            }\r
-            break;\r
-        case EM_SETCHARFORMAT:\r
-            if (enter && sp_e->lParam)\r
-            {\r
-                CHARFORMATW *cf = (CHARFORMATW *) sp_e->lParam;\r
-                TRACE("CHARFORMAT: dwMask=0x%08lx dwEffects=", cf->dwMask);\r
-                if ((cf->dwMask & CFM_BOLD) && (cf->dwEffects & CFE_BOLD))\r
-                    TRACE(" CFE_BOLD");\r
-                if ((cf->dwMask & CFM_COLOR) && (cf->dwEffects & CFE_AUTOCOLOR))\r
-                    TRACE(" CFE_AUTOCOLOR");\r
-                if ((cf->dwMask & CFM_ITALIC) && (cf->dwEffects & CFE_ITALIC))\r
-                    TRACE(" CFE_ITALIC");\r
-                if ((cf->dwMask & CFM_PROTECTED) && (cf->dwEffects & CFE_PROTECTED))\r
-                    TRACE(" CFE_PROTECTED");\r
-                if ((cf->dwMask & CFM_STRIKEOUT) && (cf->dwEffects & CFE_STRIKEOUT))\r
-                    TRACE(" CFE_STRIKEOUT");\r
-                if ((cf->dwMask & CFM_UNDERLINE) && (cf->dwEffects & CFE_UNDERLINE))\r
-                    TRACE(" CFE_UNDERLINE");\r
-                TRACE("\n");\r
-                if (cf->dwMask & CFM_SIZE)\r
-                    TRACE("yHeight=%ld\n", cf->yHeight);\r
-                if (cf->dwMask & CFM_OFFSET)\r
-                    TRACE("yOffset=%ld\n", cf->yOffset);\r
-                if ((cf->dwMask & CFM_COLOR) && !(cf->dwEffects & CFE_AUTOCOLOR))\r
-                    TRACE("crTextColor=%lx\n", cf->crTextColor);\r
-                TRACE("bCharSet=%x bPitchAndFamily=%x\n", cf->bCharSet, cf->bPitchAndFamily);\r
-                /* FIXME: we should try to be a bit more intelligent about\r
-                 * whether this is in ANSI or Unicode (it could be either) */\r
-                if (cf->dwMask & CFM_FACE)\r
-                    TRACE("szFaceName=%s\n", debugstr_wn(cf->szFaceName, LF_FACESIZE));\r
-                /* FIXME: handle CHARFORMAT2 too */\r
-            }\r
-            break;\r
-        case WM_DRAWITEM:\r
-            if (!enter) break;\r
-            {\r
-                DRAWITEMSTRUCT *lpdis = (DRAWITEMSTRUCT*) sp_e->lParam;\r
-                TRACE("DRAWITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n",\r
-                      lpdis->CtlType, lpdis->CtlID);\r
-                TRACE("itemID=0x%08x itemAction=0x%08x itemState=0x%08x\n",\r
-                      lpdis->itemID, lpdis->itemAction, lpdis->itemState);\r
-                TRACE("hWnd=%p hDC=%p (%ld,%ld)-(%ld,%ld) itemData=0x%08lx\n",\r
-                      lpdis->hwndItem, lpdis->hDC, lpdis->rcItem.left,\r
-                      lpdis->rcItem.top, lpdis->rcItem.right,\r
-                      lpdis->rcItem.bottom, lpdis->itemData);\r
-            }\r
-            break;\r
-        case WM_MEASUREITEM:\r
-            {\r
-                MEASUREITEMSTRUCT *lpmis = (MEASUREITEMSTRUCT*) sp_e->lParam;\r
-                TRACE("MEASUREITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n",\r
-                      lpmis->CtlType, lpmis->CtlID);\r
-                TRACE("itemID=0x%08x itemWidth=0x%08x itemHeight=0x%08x\n",\r
-                      lpmis->itemID, lpmis->itemWidth, lpmis->itemHeight);\r
-                TRACE("itemData=0x%08lx\n", lpmis->itemData);\r
-            }\r
-            break;\r
-        case WM_SIZE:\r
-            if (!enter) break;\r
-            TRACE("cx=%d cy=%d\n", LOWORD(sp_e->lParam), HIWORD(sp_e->lParam));\r
-            break;\r
-        case WM_WINDOWPOSCHANGED:\r
-            if (!enter) break;\r
-        case WM_WINDOWPOSCHANGING:\r
-            {\r
-                WINDOWPOS *lpwp = (WINDOWPOS *)sp_e->lParam;\r
-                TRACE("WINDOWPOS hwnd=%p, after=%p, at (%d,%d) w=%d h=%d, flags=0x%08x\n",\r
-                      lpwp->hwnd, lpwp->hwndInsertAfter, lpwp->x, lpwp->y,\r
-                      lpwp->cx, lpwp->cy, lpwp->flags);\r
-            }\r
-            break;\r
-        case WM_STYLECHANGED:\r
-            if (!enter) break;\r
-        case WM_STYLECHANGING:\r
-            {\r
-                LPSTYLESTRUCT ss = (LPSTYLESTRUCT) sp_e->lParam;\r
-                TRACE("STYLESTRUCT: StyleOld=0x%08lx, StyleNew=0x%08lx\n",\r
-                      ss->styleOld, ss->styleNew);\r
-            }\r
-            break;\r
-        case WM_NCCALCSIZE:\r
-            {\r
-                RECT *rc = (RECT *)sp_e->lParam;\r
-                TRACE("Rect (%ld,%ld)-(%ld,%ld)\n",\r
-                      rc->left, rc->top, rc->right, rc->bottom);\r
-            }\r
-            break;\r
-        case WM_NOTIFY:\r
-            /* if (!enter) break; */\r
-            {\r
-                NMHDR * pnmh = (NMHDR*) sp_e->lParam;\r
-                UINT *q, dumplen;\r
-                const SPY_NOTIFY *p;\r
-                WCHAR from_class[60];\r
-                DWORD save_error;\r
-\r
-                p = SPY_Bsearch_Notify (&spnfy_array[0], end_spnfy_array,\r
-                                        pnmh->code);\r
-                if (p) {\r
-                    TRACE("NMHDR hwndFrom=%p idFrom=0x%08x code=%s<0x%08x>, extra=0x%x\n",\r
-                          pnmh->hwndFrom, pnmh->idFrom, p->name, pnmh->code, p->len);\r
-                    dumplen = p->len;\r
-\r
-                    /* for CUSTOMDRAW, dump all the data for TOOLBARs */\r
-                    if (pnmh->code == NM_CUSTOMDRAW) {\r
-                        /* save and restore error code over the next call */\r
-                        save_error = GetLastError();\r
-                        GetClassNameW(pnmh->hwndFrom, from_class,\r
-                                      sizeof(from_class)/sizeof(WCHAR));\r
-                        SetLastError(save_error);\r
-                        if (strcmpW(TOOLBARCLASSNAMEW, from_class) == 0)\r
-                            dumplen = sizeof(NMTBCUSTOMDRAW)-sizeof(NMHDR);\r
-                    } else if ((pnmh->code >= HDN_ITEMCHANGINGA) && (pnmh->code <= HDN_ENDDRAG)) {\r
-                        dumplen = sizeof(NMHEADERA)-sizeof(NMHDR);\r
-                    }\r
-                    if (dumplen > 0) {\r
-                        q = (UINT *)(pnmh + 1);\r
-                        SPY_DumpMem ("NM extra", q, (INT)dumplen);\r
-                    }\r
-                }\r
-                else\r
-                    TRACE("NMHDR hwndFrom=%p idFrom=0x%08x code=0x%08x\n",\r
-                          pnmh->hwndFrom, pnmh->idFrom, pnmh->code);\r
-            }\r
-        default:\r
-            if (sp_e->data_len > 0)\r
-                SPY_DumpMem ("MSG lParam", (UINT *)sp_e->lParam, sp_e->data_len);\r
-            break;\r
-        }\r
-\r
-}\r
-/***********************************************************************\r
- *           SPY_EnterMessage\r
- */\r
-void SPY_EnterMessage( INT iFlag, HWND hWnd, UINT msg,\r
-                       WPARAM wParam, LPARAM lParam )\r
-{\r
-    SPY_INSTANCE sp_e;\r
-    int indent;\r
-\r
-    if (!TRACE_ON(message) || SPY_EXCLUDE(msg)) return;\r
-\r
-    sp_e.msgnum = msg;\r
-    sp_e.msg_hwnd = hWnd;\r
-    sp_e.lParam = lParam;\r
-    sp_e.wParam = wParam;\r
-    SPY_GetWndName(&sp_e);\r
-    SPY_GetMsgStuff(&sp_e);\r
-    indent = get_indent_level();\r
-\r
-    /* each SPY_SENDMESSAGE must be complemented by call to SPY_ExitMessage */\r
-    switch(iFlag)\r
-    {\r
-#ifndef __REACTOS__\r
-    case SPY_DISPATCHMESSAGE16:\r
-        TRACE("%*s(%04x) %-16s message [%04x] %s dispatched  wp=%04x lp=%08lx\n",\r
-              indent, "", HWND_16(hWnd),\r
-              debugstr_w(sp_e.wnd_name), msg, sp_e.msg_name, wParam, lParam);\r
-        break;\r
-#endif\r
-    case SPY_DISPATCHMESSAGE:\r
-        TRACE("%*s(%p) %-16s message [%04x] %s dispatched  wp=%08x lp=%08lx\n",\r
-                        indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,\r
-                        sp_e.msg_name, wParam, lParam);\r
-        break;\r
-\r
-//    case SPY_SENDMESSAGE16:\r
-    case SPY_SENDMESSAGE:\r
-        {\r
-            char taskName[20];\r
-            DWORD tid = GetWindowThreadProcessId( hWnd, NULL );\r
-\r
-            if (tid == GetCurrentThreadId()) strcpy( taskName, "self" );\r
-            else sprintf( taskName, "tid %04lx", GetCurrentThreadId() );\r
-#ifndef __REACTOS__\r
-            if (iFlag == SPY_SENDMESSAGE16)\r
-                TRACE("%*s(%04x) %-16s message [%04x] %s sent from %s wp=%04x lp=%08lx\n",\r
-                      indent, "", HWND_16(hWnd), debugstr_w(sp_e.wnd_name), msg,\r
-                      sp_e.msg_name, taskName, wParam, lParam );\r
-            else\r
-#endif\r
-            {   TRACE("%*s(%p) %-16s message [%04x] %s sent from %s wp=%08x lp=%08lx\n",\r
-                             indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,\r
-                             sp_e.msg_name, taskName, wParam, lParam );\r
-                SPY_DumpStructure(&sp_e, TRUE);\r
-            }\r
-        }\r
-        break;\r
-\r
-#ifndef __REACTOS__\r
-    case SPY_DEFWNDPROC16:\r
-        if( SPY_ExcludeDWP ) return;\r
-        TRACE("%*s(%04x)  DefWindowProc16: %s [%04x]  wp=%04x lp=%08lx\n",\r
-              indent, "", HWND_16(hWnd), sp_e.msg_name, msg, wParam, lParam );\r
-        break;\r
-#endif\r
-\r
-    case SPY_DEFWNDPROC:\r
-        if( SPY_ExcludeDWP ) return;\r
-        TRACE("%*s(%p)  DefWindowProc32: %s [%04x]  wp=%08x lp=%08lx\n",\r
-                        indent, "", hWnd, sp_e.msg_name,\r
-                        msg, wParam, lParam );\r
-        break;\r
-    }\r
-    set_indent_level( indent + SPY_INDENT_UNIT );\r
-}\r
-\r
-\r
-/***********************************************************************\r
- *           SPY_ExitMessage\r
- */\r
-void SPY_ExitMessage( INT iFlag, HWND hWnd, UINT msg, LRESULT lReturn,\r
-                       WPARAM wParam, LPARAM lParam )\r
-{\r
-    SPY_INSTANCE sp_e;\r
-    int indent;\r
-\r
-    if (!TRACE_ON(message) || SPY_EXCLUDE(msg) ||\r
-        (SPY_ExcludeDWP && (/*iFlag == SPY_RESULT_DEFWND16 || */iFlag == SPY_RESULT_DEFWND)) )\r
-        return;\r
-\r
-    sp_e.msgnum = msg;\r
-    sp_e.msg_hwnd   = hWnd;\r
-    sp_e.lParam = lParam;\r
-    sp_e.wParam = wParam;\r
-    SPY_GetWndName(&sp_e);\r
-    SPY_GetMsgStuff(&sp_e);\r
-\r
-    if ((indent = get_indent_level()))\r
-    {\r
-        indent -= SPY_INDENT_UNIT;\r
-        set_indent_level( indent );\r
-    }\r
-\r
-    switch(iFlag)\r
-    {\r
-#ifndef __REACTOS__\r
-    case SPY_RESULT_DEFWND16:\r
-        TRACE(" %*s(%04x)  DefWindowProc16: %s [%04x] returned %08lx\n",\r
-              indent, "", HWND_16(hWnd), sp_e.msg_name, msg, lReturn );\r
-        break;\r
-#endif\r
-\r
-    case SPY_RESULT_DEFWND:\r
-        TRACE(" %*s(%p)  DefWindowProc32: %s [%04x] returned %08lx\n",\r
-                        indent, "", hWnd, sp_e.msg_name, msg, lReturn );\r
-        break;\r
-\r
-#ifndef __REACTOS__\r
-    case SPY_RESULT_OK16:\r
-        TRACE(" %*s(%04x) %-16s message [%04x] %s returned %08lx\n",\r
-              indent, "", HWND_16(hWnd), debugstr_w(sp_e.wnd_name), msg,\r
-              sp_e.msg_name, lReturn );\r
-        break;\r
-#endif\r
-\r
-    case SPY_RESULT_OK:\r
-        TRACE(" %*s(%p) %-16s message [%04x] %s returned %08lx\n",\r
-                        indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,\r
-                        sp_e.msg_name, lReturn );\r
-        SPY_DumpStructure(&sp_e, FALSE);\r
-        break;\r
-\r
-#ifndef __REACTOS__\r
-    case SPY_RESULT_INVALIDHWND16:\r
-        WARN(" %*s(%04x) %-16s message [%04x] %s HAS INVALID HWND\n",\r
-             indent, "", HWND_16(hWnd), debugstr_w(sp_e.wnd_name), msg, sp_e.msg_name );\r
-        break;\r
-#endif\r
-\r
-    case SPY_RESULT_INVALIDHWND:\r
-        WARN(" %*s(%p) %-16s message [%04x] %s HAS INVALID HWND\n",\r
-                        indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,\r
-                        sp_e.msg_name );\r
-        break;\r
-   }\r
-}\r
-\r
-\r
-/***********************************************************************\r
- *           SPY_Init\r
- */\r
-int SPY_Init(void)\r
-{\r
-    int i, j;\r
-    char buffer[1024];\r
-    const SPY_NOTIFY *p;\r
-    const USER_MSG *q;\r
-    HKEY hkey;\r
-\r
-    if (!TRACE_ON(message)) return TRUE;\r
-\r
-    indent_tls_index = TlsAlloc();\r
-    /* @@ Wine registry key: HKCU\Software\Wine\Debug */\r
-    if(!RegOpenKeyA(HKEY_CURRENT_USER, "Software\\ReactOS\\Debug", &hkey))\r
-    {\r
-        DWORD type, count = sizeof(buffer);\r
-\r
-        buffer[0] = 0;\r
-        if (!RegQueryValueExA(hkey, "SpyInclude", 0, &type, (LPBYTE) buffer, &count) &&\r
-            strcmp( buffer, "INCLUDEALL" ))\r
-        {\r
-            TRACE("Include=%s\n", buffer );\r
-            for (i = 0; i <= SPY_MAX_MSGNUM; i++)\r
-                SPY_Exclude[i] = (MessageTypeNames[i] && !strstr(buffer,MessageTypeNames[i]));\r
-        }\r
-\r
-        count = sizeof(buffer);\r
-        buffer[0] = 0;\r
-        if (!RegQueryValueExA(hkey, "SpyExclude", 0, &type, (LPBYTE) buffer, &count))\r
-        {\r
-            TRACE("Exclude=%s\n", buffer );\r
-            if (!strcmp( buffer, "EXCLUDEALL" ))\r
-                for (i = 0; i <= SPY_MAX_MSGNUM; i++) SPY_Exclude[i] = TRUE;\r
-            else\r
-                for (i = 0; i <= SPY_MAX_MSGNUM; i++)\r
-                    SPY_Exclude[i] = (MessageTypeNames[i] && strstr(buffer,MessageTypeNames[i]));\r
-        }\r
-\r
-        SPY_ExcludeDWP = 0;\r
-        count = sizeof(buffer);\r
-        if(!RegQueryValueExA(hkey, "SpyExcludeDWP", 0, &type, (LPBYTE) buffer, &count))\r
-            SPY_ExcludeDWP = atoi(buffer);\r
-\r
-        RegCloseKey(hkey);\r
-    }\r
-\r
-    /* find last good entry in spy notify array and save addr for b-search */\r
-    p = &spnfy_array[0];\r
-    j = 0xffffffff;\r
-    while (p->name) {\r
-        if ((UINT)p->value > (UINT)j) {\r
-            ERR("Notify message array out of order\n");\r
-            ERR("  between values [%08x] %s and [%08x] %s\n",\r
-                j, (p-1)->name, p->value, p->name);\r
-            break;\r
-        }\r
-        j = p->value;\r
-        p++;\r
-    }\r
-    p--;\r
-    end_spnfy_array = p;\r
-\r
-    /* find last good entry in each common control message array\r
-     *  and save addr for b-search.\r
-     */\r
-    i = 0;\r
-    while (cc_array[i].classname) {\r
-\r
-        j = 0x0400; /* minimum entry in array */\r
-        q = cc_array[i].classmsg;\r
-        while(q->name) {\r
-            if (q->value <= j) {\r
-                ERR("Class message array out of order for class %s\n",\r
-                    debugstr_w(cc_array[i].classname));\r
-                ERR("  between values [%04x] %s and [%04x] %s\n",\r
-                    j, (q-1)->name, q->value, q->name);\r
-                break;\r
-            }\r
-            j = q->value;\r
-            q++;\r
-        }\r
-        q--;\r
-        cc_array[i].lastmsg = (USER_MSG *)q;\r
-\r
-        i++;\r
-    }\r
-\r
-    return 1;\r
-}\r
+/*
+ * Message spying routines
+ *
+ * Copyright 1994, Bob Amstadt
+ *           1995, Alex Korobka
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <user32.h>
+#include <commctrl.h>
+#include <richedit.h>
+#include <prsht.h>
+
+//#define YDEBUG
+#include <wine/debug.h>
+
+WINE_DEFAULT_DEBUG_CHANNEL(message);
+
+#define SPY_MAX_MSGNUM   WM_USER
+#define SPY_INDENT_UNIT  4  /* 4 spaces */
+
+#define DEBUG_SPY 0
+
+static const char * const MessageTypeNames[SPY_MAX_MSGNUM + 1] =
+{
+    "WM_NULL",                  /* 0x00 */
+    "WM_CREATE",
+    "WM_DESTROY",
+    "WM_MOVE",
+    "wm_sizewait",
+    "WM_SIZE",
+    "WM_ACTIVATE",
+    "WM_SETFOCUS",
+    "WM_KILLFOCUS",
+    "WM_SETVISIBLE",
+    "WM_ENABLE",
+    "WM_SETREDRAW",
+    "WM_SETTEXT",
+    "WM_GETTEXT",
+    "WM_GETTEXTLENGTH",
+    "WM_PAINT",
+    "WM_CLOSE",                 /* 0x10 */
+    "WM_QUERYENDSESSION",
+    "WM_QUIT",
+    "WM_QUERYOPEN",
+    "WM_ERASEBKGND",
+    "WM_SYSCOLORCHANGE",
+    "WM_ENDSESSION",
+    "wm_systemerror",
+    "WM_SHOWWINDOW",
+    "WM_CTLCOLOR",
+    "WM_WININICHANGE",
+    "WM_DEVMODECHANGE",
+    "WM_ACTIVATEAPP",
+    "WM_FONTCHANGE",
+    "WM_TIMECHANGE",
+    "WM_CANCELMODE",
+    "WM_SETCURSOR",             /* 0x20 */
+    "WM_MOUSEACTIVATE",
+    "WM_CHILDACTIVATE",
+    "WM_QUEUESYNC",
+    "WM_GETMINMAXINFO",
+    "wm_unused3",
+    "wm_painticon",
+    "WM_ICONERASEBKGND",
+    "WM_NEXTDLGCTL",
+    "wm_alttabactive",
+    "WM_SPOOLERSTATUS",
+    "WM_DRAWITEM",
+    "WM_MEASUREITEM",
+    "WM_DELETEITEM",
+    "WM_VKEYTOITEM",
+    "WM_CHARTOITEM",
+    "WM_SETFONT",               /* 0x30 */
+    "WM_GETFONT",
+    "WM_SETHOTKEY",
+    "WM_GETHOTKEY",
+    "wm_filesyschange",
+    "wm_isactiveicon",
+    "wm_queryparkicon",
+    "WM_QUERYDRAGICON",
+    "wm_querysavestate",
+    "WM_COMPAREITEM",
+    "wm_testing",
+    NULL,
+    NULL,
+    "WM_GETOBJECT",             /* 0x3d */
+    "wm_activateshellwindow",
+    NULL,
+
+    NULL,                       /* 0x40 */
+    "wm_compacting", NULL, NULL,
+    "WM_COMMNOTIFY", NULL,
+    "WM_WINDOWPOSCHANGING",     /* 0x0046 */
+    "WM_WINDOWPOSCHANGED",      /* 0x0047 */
+    "WM_POWER", NULL,
+    "WM_COPYDATA",
+    "WM_CANCELJOURNAL", NULL, NULL,
+    "WM_NOTIFY", NULL,
+
+    /* 0x0050 */
+    "WM_INPUTLANGCHANGEREQUEST",
+    "WM_INPUTLANGCHANGE",
+    "WM_TCARD",
+    "WM_HELP",
+    "WM_USERCHANGED",
+    "WM_NOTIFYFORMAT", NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+    /* 0x0060 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+    /* 0x0070 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL,
+    "WM_CONTEXTMENU",
+    "WM_STYLECHANGING",
+    "WM_STYLECHANGED",
+    "WM_DISPLAYCHANGE",
+    "WM_GETICON",
+
+    "WM_SETICON",               /* 0x0080 */
+    "WM_NCCREATE",              /* 0x0081 */
+    "WM_NCDESTROY",             /* 0x0082 */
+    "WM_NCCALCSIZE",            /* 0x0083 */
+    "WM_NCHITTEST",             /* 0x0084 */
+    "WM_NCPAINT",               /* 0x0085 */
+    "WM_NCACTIVATE",            /* 0x0086 */
+    "WM_GETDLGCODE",            /* 0x0087 */
+    "WM_SYNCPAINT",
+    "WM_SYNCTASK", NULL, NULL, NULL, NULL, NULL, NULL,
+
+    /* 0x0090 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+    /* 0x00A0 */
+    "WM_NCMOUSEMOVE",           /* 0x00a0 */
+    "WM_NCLBUTTONDOWN",         /* 0x00a1 */
+    "WM_NCLBUTTONUP",           /* 0x00a2 */
+    "WM_NCLBUTTONDBLCLK",       /* 0x00a3 */
+    "WM_NCRBUTTONDOWN",         /* 0x00a4 */
+    "WM_NCRBUTTONUP",           /* 0x00a5 */
+    "WM_NCRBUTTONDBLCLK",       /* 0x00a6 */
+    "WM_NCMBUTTONDOWN",         /* 0x00a7 */
+    "WM_NCMBUTTONUP",           /* 0x00a8 */
+    "WM_NCMBUTTONDBLCLK",       /* 0x00a9 */
+    NULL,                       /* 0x00aa */
+    "WM_NCXBUTTONDOWN",         /* 0x00ab */
+    "WM_NCXBUTTONUP",           /* 0x00ac */
+    "WM_NCXBUTTONDBLCLK",       /* 0x00ad */
+    NULL,                       /* 0x00ae */
+    NULL,                       /* 0x00af */
+
+    /* 0x00B0 - Win32 Edit controls */
+    "EM_GETSEL",                /* 0x00b0 */
+    "EM_SETSEL",                /* 0x00b1 */
+    "EM_GETRECT",               /* 0x00b2 */
+    "EM_SETRECT",               /* 0x00b3 */
+    "EM_SETRECTNP",             /* 0x00b4 */
+    "EM_SCROLL",                /* 0x00b5 */
+    "EM_LINESCROLL",            /* 0x00b6 */
+    "EM_SCROLLCARET",           /* 0x00b7 */
+    "EM_GETMODIFY",             /* 0x00b8 */
+    "EM_SETMODIFY",             /* 0x00b9 */
+    "EM_GETLINECOUNT",          /* 0x00ba */
+    "EM_LINEINDEX",             /* 0x00bb */
+    "EM_SETHANDLE",             /* 0x00bc */
+    "EM_GETHANDLE",             /* 0x00bd */
+    "EM_GETTHUMB",              /* 0x00be */
+    NULL,                       /* 0x00bf */
+
+    NULL,                       /* 0x00c0 */
+    "EM_LINELENGTH",            /* 0x00c1 */
+    "EM_REPLACESEL",            /* 0x00c2 */
+    NULL,                       /* 0x00c3 */
+    "EM_GETLINE",               /* 0x00c4 */
+    "EM_LIMITTEXT",             /* 0x00c5 */
+    "EM_CANUNDO",               /* 0x00c6 */
+    "EM_UNDO",                  /* 0x00c7 */
+    "EM_FMTLINES",              /* 0x00c8 */
+    "EM_LINEFROMCHAR",          /* 0x00c9 */
+    NULL,                       /* 0x00ca */
+    "EM_SETTABSTOPS",           /* 0x00cb */
+    "EM_SETPASSWORDCHAR",       /* 0x00cc */
+    "EM_EMPTYUNDOBUFFER",       /* 0x00cd */
+    "EM_GETFIRSTVISIBLELINE",   /* 0x00ce */
+    "EM_SETREADONLY",           /* 0x00cf */
+
+    "EM_SETWORDBREAKPROC",      /* 0x00d0 */
+    "EM_GETWORDBREAKPROC",      /* 0x00d1 */
+    "EM_GETPASSWORDCHAR",       /* 0x00d2 */
+    "EM_SETMARGINS",            /* 0x00d3 */
+    "EM_GETMARGINS",            /* 0x00d4 */
+    "EM_GETLIMITTEXT",          /* 0x00d5 */
+    "EM_POSFROMCHAR",           /* 0x00d6 */
+    "EM_CHARFROMPOS",           /* 0x00d7 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+    /* 0x00E0 - Win32 Scrollbars */
+    "SBM_SETPOS",               /* 0x00e0 */
+    "SBM_GETPOS",               /* 0x00e1 */
+    "SBM_SETRANGE",             /* 0x00e2 */
+    "SBM_GETRANGE",             /* 0x00e3 */
+    "SBM_ENABLE_ARROWS",        /* 0x00e4 */
+    NULL,
+    "SBM_SETRANGEREDRAW",       /* 0x00e6 */
+    NULL, NULL,
+    "SBM_SETSCROLLINFO",        /* 0x00e9 */
+    "SBM_GETSCROLLINFO",        /* 0x00ea */
+    NULL, NULL, NULL, NULL, NULL,
+
+    /* 0x00F0 - Win32 Buttons */
+    "BM_GETCHECK",              /* 0x00f0 */
+    "BM_SETCHECK",              /* 0x00f1 */
+    "BM_GETSTATE",              /* 0x00f2 */
+    "BM_SETSTATE",              /* 0x00f3 */
+    "BM_SETSTYLE",              /* 0x00f4 */
+    "BM_CLICK",                 /* 0x00f5 */
+    "BM_GETIMAGE",              /* 0x00f6 */
+    "BM_SETIMAGE",              /* 0x00f7 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+    "WM_KEYDOWN",               /* 0x0100 */
+    "WM_KEYUP",                 /* 0x0101 */
+    "WM_CHAR",                  /* 0x0102 */
+    "WM_DEADCHAR",              /* 0x0103 */
+    "WM_SYSKEYDOWN",            /* 0x0104 */
+    "WM_SYSKEYUP",              /* 0x0105 */
+    "WM_SYSCHAR",               /* 0x0106 */
+    "WM_SYSDEADCHAR",           /* 0x0107 */
+    "WM_KEYLAST",               /* 0x0108 */
+    NULL,
+    "WM_CONVERTREQUEST",
+    "WM_CONVERTRESULT",
+    "WM_INTERIM",
+    "WM_IME_STARTCOMPOSITION",  /* 0x010d */
+    "WM_IME_ENDCOMPOSITION",    /* 0x010e */
+    "WM_IME_COMPOSITION",       /* 0x010f */
+
+    "WM_INITDIALOG",            /* 0x0110 */
+    "WM_COMMAND",               /* 0x0111 */
+    "WM_SYSCOMMAND",            /* 0x0112 */
+    "WM_TIMER",                 /* 0x0113 */
+    "WM_HSCROLL",               /* 0x0114 */
+    "WM_VSCROLL",               /* 0x0115 */
+    "WM_INITMENU",              /* 0x0116 */
+    "WM_INITMENUPOPUP",         /* 0x0117 */
+    "WM_SYSTIMER",              /* 0x0118 */
+    NULL, NULL, NULL, NULL, NULL, NULL,
+    "WM_MENUSELECT",            /* 0x011f */
+
+    "WM_MENUCHAR",              /* 0x0120 */
+    "WM_ENTERIDLE",             /* 0x0121 */
+
+    "WM_MENURBUTTONUP",         /* 0x0122 */
+    "WM_MENUDRAG",              /* 0x0123 */
+    "WM_MENUGETOBJECT",         /* 0x0124 */
+    "WM_UNINITMENUPOPUP",       /* 0x0125 */
+    "WM_MENUCOMMAND",           /* 0x0126 */
+    "WM_CHANGEUISTATE",         /* 0x0127 */
+    "WM_UPDATEUISTATE",         /* 0x0128 */
+    "WM_QUERYUISTATE",          /* 0x0129 */
+
+    NULL, NULL, NULL, NULL, NULL, NULL,
+
+    /* 0x0130 */
+    NULL,
+    "WM_LBTRACKPOINT",          /* 0x0131 */
+    "WM_CTLCOLORMSGBOX",        /* 0x0132 */
+    "WM_CTLCOLOREDIT",          /* 0x0133 */
+    "WM_CTLCOLORLISTBOX",       /* 0x0134 */
+    "WM_CTLCOLORBTN",           /* 0x0135 */
+    "WM_CTLCOLORDLG",           /* 0x0136 */
+    "WM_CTLCOLORSCROLLBAR",     /* 0x0137 */
+    "WM_CTLCOLORSTATIC",        /* 0x0138 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+    /* 0x0140 - Win32 Comboboxes */
+    "CB_GETEDITSEL",            /* 0x0140 */
+    "CB_LIMITTEXT",             /* 0x0141 */
+    "CB_SETEDITSEL",            /* 0x0142 */
+    "CB_ADDSTRING",             /* 0x0143 */
+    "CB_DELETESTRING",          /* 0x0144 */
+    "CB_DIR",                   /* 0x0145 */
+    "CB_GETCOUNT",              /* 0x0146 */
+    "CB_GETCURSEL",             /* 0x0147 */
+    "CB_GETLBTEXT",             /* 0x0148 */
+    "CB_GETLBTEXTLEN",          /* 0x0149 */
+    "CB_INSERTSTRING",          /* 0x014a */
+    "CB_RESETCONTENT",          /* 0x014b */
+    "CB_FINDSTRING",            /* 0x014c */
+    "CB_SELECTSTRING",          /* 0x014d */
+    "CB_SETCURSEL",             /* 0x014e */
+    "CB_SHOWDROPDOWN",          /* 0x014f */
+
+    "CB_GETITEMDATA",           /* 0x0150 */
+    "CB_SETITEMDATA",           /* 0x0151 */
+    "CB_GETDROPPEDCONTROLRECT", /* 0x0152 */
+    "CB_SETITEMHEIGHT",         /* 0x0153 */
+    "CB_GETITEMHEIGHT",         /* 0x0154 */
+    "CB_SETEXTENDEDUI",         /* 0x0155 */
+    "CB_GETEXTENDEDUI",         /* 0x0156 */
+    "CB_GETDROPPEDSTATE",       /* 0x0157 */
+    "CB_FINDSTRINGEXACT",       /* 0x0158 */
+    "CB_SETLOCALE",             /* 0x0159 */
+    "CB_GETLOCALE",             /* 0x015a */
+    "CB_GETTOPINDEX",           /* 0x015b */
+    "CB_SETTOPINDEX",           /* 0x015c */
+    "CB_GETHORIZONTALEXTENT",   /* 0x015d */
+    "CB_SETHORIZONTALEXTENT",   /* 0x015e */
+    "CB_GETDROPPEDWIDTH",       /* 0x015f */
+
+    "CB_SETDROPPEDWIDTH",       /* 0x0160 */
+    "CB_INITSTORAGE",           /* 0x0161 */
+    NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+    /* 0x0170 - Win32 Static controls */
+    "STM_SETICON",              /* 0x0170 */
+    "STM_GETICON",              /* 0x0171 */
+    "STM_SETIMAGE",             /* 0x0172 */
+    "STM_GETIMAGE",             /* 0x0173 */
+    NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+    /* 0x0180 - Win32 Listboxes */
+    "LB_ADDSTRING",             /* 0x0180 */
+    "LB_INSERTSTRING",          /* 0x0181 */
+    "LB_DELETESTRING",          /* 0x0182 */
+    "LB_SELITEMRANGEEX",        /* 0x0183 */
+    "LB_RESETCONTENT",          /* 0x0184 */
+    "LB_SETSEL",                /* 0x0185 */
+    "LB_SETCURSEL",             /* 0x0186 */
+    "LB_GETSEL",                /* 0x0187 */
+    "LB_GETCURSEL",             /* 0x0188 */
+    "LB_GETTEXT",               /* 0x0189 */
+    "LB_GETTEXTLEN",            /* 0x018a */
+    "LB_GETCOUNT",              /* 0x018b */
+    "LB_SELECTSTRING",          /* 0x018c */
+    "LB_DIR",                   /* 0x018d */
+    "LB_GETTOPINDEX",           /* 0x018e */
+    "LB_FINDSTRING",            /* 0x018f */
+
+    "LB_GETSELCOUNT",           /* 0x0190 */
+    "LB_GETSELITEMS",           /* 0x0191 */
+    "LB_SETTABSTOPS",           /* 0x0192 */
+    "LB_GETHORIZONTALEXTENT",   /* 0x0193 */
+    "LB_SETHORIZONTALEXTENT",   /* 0x0194 */
+    "LB_SETCOLUMNWIDTH",        /* 0x0195 */
+    "LB_ADDFILE",               /* 0x0196 */
+    "LB_SETTOPINDEX",           /* 0x0197 */
+    "LB_GETITEMRECT",           /* 0x0198 */
+    "LB_GETITEMDATA",           /* 0x0199 */
+    "LB_SETITEMDATA",           /* 0x019a */
+    "LB_SELITEMRANGE",          /* 0x019b */
+    "LB_SETANCHORINDEX",        /* 0x019c */
+    "LB_GETANCHORINDEX",        /* 0x019d */
+    "LB_SETCARETINDEX",         /* 0x019e */
+    "LB_GETCARETINDEX",         /* 0x019f */
+
+    "LB_SETITEMHEIGHT",         /* 0x01a0 */
+    "LB_GETITEMHEIGHT",         /* 0x01a1 */
+    "LB_FINDSTRINGEXACT",       /* 0x01a2 */
+    "LB_CARETON",               /* 0x01a3 */
+    "LB_CARETOFF",              /* 0x01a4 */
+    "LB_SETLOCALE",             /* 0x01a5 */
+    "LB_GETLOCALE",             /* 0x01a6 */
+    "LB_SETCOUNT",              /* 0x01a7 */
+    "LB_INITSTORAGE",           /* 0x01a8 */
+    "LB_ITEMFROMPOINT",         /* 0x01a9 */
+    NULL, NULL, NULL, NULL, NULL, NULL,
+
+    /* 0x01B0 */
+    NULL, NULL,
+    "LB_GETLISTBOXINFO",         /* 0x01b2 */
+    NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+    /* 0x01C0 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+    /* 0x01D0 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+    /* 0x01E0 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+    /* 0x01F0 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+    "WM_MOUSEMOVE",             /* 0x0200 */
+    "WM_LBUTTONDOWN",           /* 0x0201 */
+    "WM_LBUTTONUP",             /* 0x0202 */
+    "WM_LBUTTONDBLCLK",         /* 0x0203 */
+    "WM_RBUTTONDOWN",           /* 0x0204 */
+    "WM_RBUTTONUP",             /* 0x0205 */
+    "WM_RBUTTONDBLCLK",         /* 0x0206 */
+    "WM_MBUTTONDOWN",           /* 0x0207 */
+    "WM_MBUTTONUP",             /* 0x0208 */
+    "WM_MBUTTONDBLCLK",         /* 0x0209 */
+    "WM_MOUSEWHEEL",            /* 0x020A */
+    "WM_XBUTTONDOWN",           /* 0x020B */
+    "WM_XBUTTONUP",             /* 0x020C */
+    "WM_XBUTTONDBLCLK",         /* 0x020D */
+    NULL, NULL,
+
+    "WM_PARENTNOTIFY",          /* 0x0210 */
+    "WM_ENTERMENULOOP",         /* 0x0211 */
+    "WM_EXITMENULOOP",          /* 0x0212 */
+    "WM_NEXTMENU",              /* 0x0213 */
+    "WM_SIZING",
+    "WM_CAPTURECHANGED",
+    "WM_MOVING", NULL,
+    "WM_POWERBROADCAST",
+    "WM_DEVICECHANGE", NULL, NULL, NULL, NULL, NULL, NULL,
+
+    "WM_MDICREATE",             /* 0x0220 */
+    "WM_MDIDESTROY",            /* 0x0221 */
+    "WM_MDIACTIVATE",           /* 0x0222 */
+    "WM_MDIRESTORE",            /* 0x0223 */
+    "WM_MDINEXT",               /* 0x0224 */
+    "WM_MDIMAXIMIZE",           /* 0x0225 */
+    "WM_MDITILE",               /* 0x0226 */
+    "WM_MDICASCADE",            /* 0x0227 */
+    "WM_MDIICONARRANGE",        /* 0x0228 */
+    "WM_MDIGETACTIVE",          /* 0x0229 */
+
+    "WM_DROPOBJECT",
+    "WM_QUERYDROPOBJECT",
+    "WM_BEGINDRAG",
+    "WM_DRAGLOOP",
+    "WM_DRAGSELECT",
+    "WM_DRAGMOVE",
+
+    /* 0x0230*/
+    "WM_MDISETMENU",            /* 0x0230 */
+    "WM_ENTERSIZEMOVE",         /* 0x0231 */
+    "WM_EXITSIZEMOVE",          /* 0x0232 */
+    "WM_DROPFILES",             /* 0x0233 */
+    "WM_MDIREFRESHMENU", NULL, NULL, NULL,
+    /* 0x0238*/
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+    /* 0x0240 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+    /* 0x0250 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+    /* 0x0260 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+    /* 0x0280 */
+    NULL,
+    "WM_IME_SETCONTEXT",        /* 0x0281 */
+    "WM_IME_NOTIFY",            /* 0x0282 */
+    "WM_IME_CONTROL",           /* 0x0283 */
+    "WM_IME_COMPOSITIONFULL",   /* 0x0284 */
+    "WM_IME_SELECT",            /* 0x0285 */
+    "WM_IME_CHAR",              /* 0x0286 */
+    NULL,
+    "WM_IME_REQUEST",           /* 0x0288 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    "WM_IME_KEYDOWN",           /* 0x0290 */
+    "WM_IME_KEYUP",             /* 0x0291 */
+    NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+    /* 0x02a0 */
+    "WM_NCMOUSEHOVER",          /* 0x02A0 */
+    "WM_MOUSEHOVER",            /* 0x02A1 */
+    "WM_NCMOUSELEAVE",          /* 0x02A2 */
+    "WM_MOUSELEAVE",            /* 0x02A3 */
+    NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    "WM_WTSSESSION_CHANGE",     /* 0x02B1 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL,
+
+    /* 0x02c0 */
+    "WM_TABLET_FIRST",          /* 0x02c0 */
+    "WM_TABLET_FIRST+1",        /* 0x02c1 */
+    "WM_TABLET_FIRST+2",        /* 0x02c2 */
+    "WM_TABLET_FIRST+3",        /* 0x02c3 */
+    "WM_TABLET_FIRST+4",        /* 0x02c4 */
+    "WM_TABLET_FIRST+5",        /* 0x02c5 */
+    "WM_TABLET_FIRST+7",        /* 0x02c6 */
+    "WM_TABLET_FIRST+8",        /* 0x02c7 */
+    "WM_TABLET_FIRST+9",        /* 0x02c8 */
+    "WM_TABLET_FIRST+10",       /* 0x02c9 */
+    "WM_TABLET_FIRST+11",       /* 0x02ca */
+    "WM_TABLET_FIRST+12",       /* 0x02cb */
+    "WM_TABLET_FIRST+13",       /* 0x02cc */
+    "WM_TABLET_FIRST+14",       /* 0x02cd */
+    "WM_TABLET_FIRST+15",       /* 0x02ce */
+    "WM_TABLET_FIRST+16",       /* 0x02cf */
+    "WM_TABLET_FIRST+17",       /* 0x02d0 */
+    "WM_TABLET_FIRST+18",       /* 0x02d1 */
+    "WM_TABLET_FIRST+19",       /* 0x02d2 */
+    "WM_TABLET_FIRST+20",       /* 0x02d3 */
+    "WM_TABLET_FIRST+21",       /* 0x02d4 */
+    "WM_TABLET_FIRST+22",       /* 0x02d5 */
+    "WM_TABLET_FIRST+23",       /* 0x02d6 */
+    "WM_TABLET_FIRST+24",       /* 0x02d7 */
+    "WM_TABLET_FIRST+25",       /* 0x02d8 */
+    "WM_TABLET_FIRST+26",       /* 0x02d9 */
+    "WM_TABLET_FIRST+27",       /* 0x02da */
+    "WM_TABLET_FIRST+28",       /* 0x02db */
+    "WM_TABLET_FIRST+29",       /* 0x02dc */
+    "WM_TABLET_FIRST+30",       /* 0x02dd */
+    "WM_TABLET_FIRST+31",       /* 0x02de */
+    "WM_TABLET_LAST",           /* 0x02df */
+
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+    "WM_CUT",                   /* 0x0300 */
+    "WM_COPY",
+    "WM_PASTE",
+    "WM_CLEAR",
+    "WM_UNDO",
+    "WM_RENDERFORMAT",
+    "WM_RENDERALLFORMATS",
+    "WM_DESTROYCLIPBOARD",
+    "WM_DRAWCLIPBOARD",
+    "WM_PAINTCLIPBOARD",
+    "WM_VSCROLLCLIPBOARD",
+    "WM_SIZECLIPBOARD",
+    "WM_ASKCBFORMATNAME",
+    "WM_CHANGECBCHAIN",
+    "WM_HSCROLLCLIPBOARD",
+    "WM_QUERYNEWPALETTE",       /* 0x030f*/
+
+    "WM_PALETTEISCHANGING",
+    "WM_PALETTECHANGED",
+    "WM_HOTKEY",                /* 0x0312 */
+          NULL, NULL, NULL, NULL,
+    "WM_PRINT",
+    "WM_PRINTCLIENT",
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+    /* 0x0340 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+    "WM_QUERYAFXWNDPROC",   /*  0x0360 */
+    "WM_SIZEPARENT",        /*  0x0361 */
+    "WM_SETMESSAGESTRING",  /*  0x0362 */
+    "WM_IDLEUPDATECMDUI",   /*  0x0363 */
+    "WM_INITIALUPDATE",     /*  0x0364 */
+    "WM_COMMANDHELP",       /*  0x0365 */
+    "WM_HELPHITTEST",       /*  0x0366 */
+    "WM_EXITHELPMODE",      /*  0x0367 */
+    "WM_RECALCPARENT",      /*  0x0368 */
+    "WM_SIZECHILD",         /*  0x0369 */
+    "WM_KICKIDLE",          /*  0x036A */
+    "WM_QUERYCENTERWND",    /*  0x036B */
+    "WM_DISABLEMODAL",      /*  0x036C */
+    "WM_FLOATSTATUS",       /*  0x036D */
+    "WM_ACTIVATETOPLEVEL",  /*  0x036E */
+    "WM_QUERY3DCONTROLS",   /*  0x036F */
+    NULL,NULL,NULL,
+    "WM_SOCKET_NOTIFY",     /*  0x0373 */
+    "WM_SOCKET_DEAD",       /*  0x0374 */
+    "WM_POPMESSAGESTRING",  /*  0x0375 */
+    "WM_OCC_LOADFROMSTREAM",     /* 0x0376 */
+    "WM_OCC_LOADFROMSTORAGE",    /* 0x0377 */
+    "WM_OCC_INITNEW",            /* 0x0378 */
+    "WM_QUEUE_SENTINEL",         /* 0x0379 */
+    "WM_OCC_LOADFROMSTREAM_EX",  /* 0x037A */
+    "WM_OCC_LOADFROMSTORAGE_EX", /* 0x037B */
+
+    NULL,NULL,NULL,NULL,
+
+    "WM_PENWINFIRST",           /* 0x0380 */
+    "WM_RCRESULT",              /* 0x0381 */
+    "WM_HOOKRCRESULT",          /* 0x0382 */
+    "WM_GLOBALRCCHANGE",        /* 0x0383 */
+    "WM_SKB",                   /* 0x0384 */
+    "WM_HEDITCTL",              /* 0x0385 */
+    NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    "WM_PENWINLAST",            /* 0x038F */
+
+    "WM_COALESCE_FIRST",        /* 0x0390 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    "WM_COALESCE_LAST",         /* 0x039F */
+
+    /* 0x03a0 */
+    "MM_JOY1MOVE",
+    "MM_JOY2MOVE",
+    "MM_JOY1ZMOVE",
+    "MM_JOY2ZMOVE",
+                            NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+    /* 0x03b0 */
+    NULL, NULL, NULL, NULL, NULL,
+    "MM_JOY1BUTTONDOWN",
+    "MM_JOY2BUTTONDOWN",
+    "MM_JOY1BUTTONUP",
+    "MM_JOY2BUTTONUP",
+    "MM_MCINOTIFY",
+                NULL,
+    "MM_WOM_OPEN",
+    "MM_WOM_CLOSE",
+    "MM_WOM_DONE",
+    "MM_WIM_OPEN",
+    "MM_WIM_CLOSE",
+
+    /* 0x03c0 */
+    "MM_WIM_DATA",
+    "MM_MIM_OPEN",
+    "MM_MIM_CLOSE",
+    "MM_MIM_DATA",
+    "MM_MIM_LONGDATA",
+    "MM_MIM_ERROR",
+    "MM_MIM_LONGERROR",
+    "MM_MOM_OPEN",
+    "MM_MOM_CLOSE",
+    "MM_MOM_DONE",
+                NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+    /* 0x03e0 */
+    "WM_DDE_INITIATE",  /* 0x3E0 */
+    "WM_DDE_TERMINATE", /* 0x3E1 */
+    "WM_DDE_ADVISE",    /* 0x3E2 */
+    "WM_DDE_UNADVISE",  /* 0x3E3 */
+    "WM_DDE_ACK",       /* 0x3E4 */
+    "WM_DDE_DATA",      /* 0x3E5 */
+    "WM_DDE_REQUEST",   /* 0x3E6 */
+    "WM_DDE_POKE",      /* 0x3E7 */
+    "WM_DDE_EXECUTE",   /* 0x3E8 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+
+    /* 0x03f0 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+    "WM_USER"                   /* 0x0400 */
+};
+
+
+#define SPY_MAX_LVMMSGNUM   140
+static const char * const LVMMessageTypeNames[SPY_MAX_LVMMSGNUM + 1] =
+{
+    "LVM_GETBKCOLOR",           /* 1000 */
+    "LVM_SETBKCOLOR",
+    "LVM_GETIMAGELIST",
+    "LVM_SETIMAGELIST",
+    "LVM_GETITEMCOUNT",
+    "LVM_GETITEMA",
+    "LVM_SETITEMA",
+    "LVM_INSERTITEMA",
+    "LVM_DELETEITEM",
+    "LVM_DELETEALLITEMS",
+    "LVM_GETCALLBACKMASK",
+    "LVM_SETCALLBACKMASK",
+    "LVM_GETNEXTITEM",
+    "LVM_FINDITEMA",
+    "LVM_GETITEMRECT",
+    "LVM_SETITEMPOSITION",
+    "LVM_GETITEMPOSITION",
+    "LVM_GETSTRINGWIDTHA",
+    "LVM_HITTEST",
+    "LVM_ENSUREVISIBLE",
+    "LVM_SCROLL",
+    "LVM_REDRAWITEMS",
+    "LVM_ARRANGE",
+    "LVM_EDITLABELA",
+    "LVM_GETEDITCONTROL",
+    "LVM_GETCOLUMNA",
+    "LVM_SETCOLUMNA",
+    "LVM_INSERTCOLUMNA",
+    "LVM_DELETECOLUMN",
+    "LVM_GETCOLUMNWIDTH",
+    "LVM_SETCOLUMNWIDTH",
+    "LVM_GETHEADER",
+    NULL,
+    "LVM_CREATEDRAGIMAGE",
+    "LVM_GETVIEWRECT",
+    "LVM_GETTEXTCOLOR",
+    "LVM_SETTEXTCOLOR",
+    "LVM_GETTEXTBKCOLOR",
+    "LVM_SETTEXTBKCOLOR",
+    "LVM_GETTOPINDEX",
+    "LVM_GETCOUNTPERPAGE",
+    "LVM_GETORIGIN",
+    "LVM_UPDATE",
+    "LVM_SETITEMSTATE",
+    "LVM_GETITEMSTATE",
+    "LVM_GETITEMTEXTA",
+    "LVM_SETITEMTEXTA",
+    "LVM_SETITEMCOUNT",
+    "LVM_SORTITEMS",
+    "LVM_SETITEMPOSITION32",
+    "LVM_GETSELECTEDCOUNT",
+    "LVM_GETITEMSPACING",
+    "LVM_GETISEARCHSTRINGA",
+    "LVM_SETICONSPACING",
+    "LVM_SETEXTENDEDLISTVIEWSTYLE",
+    "LVM_GETEXTENDEDLISTVIEWSTYLE",
+    "LVM_GETSUBITEMRECT",
+    "LVM_SUBITEMHITTEST",
+    "LVM_SETCOLUMNORDERARRAY",
+    "LVM_GETCOLUMNORDERARRAY",
+    "LVM_SETHOTITEM",
+    "LVM_GETHOTITEM",
+    "LVM_SETHOTCURSOR",
+    "LVM_GETHOTCURSOR",
+    "LVM_APPROXIMATEVIEWRECT",
+    "LVM_SETWORKAREAS",
+    "LVM_GETSELECTIONMARK",
+    "LVM_SETSELECTIONMARK",
+    "LVM_SETBKIMAGEA",
+    "LVM_GETBKIMAGEA",
+    "LVM_GETWORKAREAS",
+    "LVM_SETHOVERTIME",
+    "LVM_GETHOVERTIME",
+    "LVM_GETNUMBEROFWORKAREAS",
+    "LVM_SETTOOLTIPS",
+    "LVM_GETITEMW",
+    "LVM_SETITEMW",
+    "LVM_INSERTITEMW",
+    "LVM_GETTOOLTIPS",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    "LVM_FINDITEMW",
+    NULL,
+    NULL,
+    NULL,
+    "LVM_GETSTRINGWIDTHW",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    "LVM_GETCOLUMNW",
+    "LVM_SETCOLUMNW",
+    "LVM_INSERTCOLUMNW",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    "LVM_GETITEMTEXTW",
+    "LVM_SETITEMTEXTW",
+    "LVM_GETISEARCHSTRINGW",
+    "LVM_EDITLABELW",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    "LVM_SETBKIMAGEW",
+    "LVM_GETBKIMAGEW"   /* 0x108B */
+};
+
+
+#define SPY_MAX_TVMSGNUM   65
+static const char * const TVMessageTypeNames[SPY_MAX_TVMSGNUM + 1] =
+{
+    "TVM_INSERTITEMA",          /* 1100 */
+    "TVM_DELETEITEM",
+    "TVM_EXPAND",
+    NULL,
+    "TVM_GETITEMRECT",
+    "TVM_GETCOUNT",
+    "TVM_GETINDENT",
+    "TVM_SETINDENT",
+    "TVM_GETIMAGELIST",
+    "TVM_SETIMAGELIST",
+    "TVM_GETNEXTITEM",
+    "TVM_SELECTITEM",
+    "TVM_GETITEMA",
+    "TVM_SETITEMA",
+    "TVM_EDITLABELA",
+    "TVM_GETEDITCONTROL",
+    "TVM_GETVISIBLECOUNT",
+    "TVM_HITTEST",
+    "TVM_CREATEDRAGIMAGE",
+    "TVM_SORTCHILDREN",
+    "TVM_ENSUREVISIBLE",
+    "TVM_SORTCHILDRENCB",
+    "TVM_ENDEDITLABELNOW",
+    "TVM_GETISEARCHSTRINGA",
+    "TVM_SETTOOLTIPS",
+    "TVM_GETTOOLTIPS",
+    "TVM_SETINSERTMARK",
+    "TVM_SETITEMHEIGHT",
+    "TVM_GETITEMHEIGHT",
+    "TVM_SETBKCOLOR",
+    "TVM_SETTEXTCOLOR",
+    "TVM_GETBKCOLOR",
+    "TVM_GETTEXTCOLOR",
+    "TVM_SETSCROLLTIME",
+    "TVM_GETSCROLLTIME",
+    "TVM_UNKNOWN35",
+    "TVM_UNKNOWN36",
+    "TVM_SETINSERTMARKCOLOR",
+    "TVM_GETINSERTMARKCOLOR",
+    "TVM_GETITEMSTATE",
+    "TVM_SETLINECOLOR",
+    "TVM_GETLINECOLOR",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    "TVM_INSERTITEMW",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    "TVM_GETITEMW",
+    "TVM_SETITEMW",
+    "TVM_GETISEARCHSTRINGW",
+    "TVM_EDITLABELW"
+};
+
+
+#define SPY_MAX_HDMMSGNUM   19
+static const char * const HDMMessageTypeNames[SPY_MAX_HDMMSGNUM + 1] =
+{
+    "HDM_GETITEMCOUNT",         /* 1200 */
+    "HDM_INSERTITEMA",
+    "HDM_DELETEITEM",
+    "HDM_GETITEMA",
+    "HDM_SETITEMA",
+    "HDM_LAYOUT",
+    "HDM_HITTEST",
+    "HDM_GETITEMRECT",
+    "HDM_SETIMAGELIST",
+    "HDM_GETIMAGELIST",
+    "HDM_INSERTITEMW",
+    "HDM_GETITEMW",
+    "HDM_SETITEMW",
+    NULL,
+    NULL,
+    "HDM_ORDERTOINDEX",
+    "HDM_CREATEDRAGIMAGE",
+    "GETORDERARRAYINDEX",
+    "SETORDERARRAYINDEX",
+    "SETHOTDIVIDER"
+};
+
+
+#define SPY_MAX_TCMMSGNUM   62
+static const char * const TCMMessageTypeNames[SPY_MAX_TCMMSGNUM + 1] =
+{
+    NULL,               /* 1300 */
+    NULL,
+    "TCM_SETIMAGELIST",
+    "TCM_GETIMAGELIST",
+    "TCM_GETITEMCOUNT",
+    "TCM_GETITEMA",
+    "TCM_SETITEMA",
+    "TCM_INSERTITEMA",
+    "TCM_DELETEITEM",
+    "TCM_DELETEALLITEMS",
+    "TCM_GETITEMRECT",
+    "TCM_GETCURSEL",
+    "TCM_SETCURSEL",
+    "TCM_HITTEST",
+    "TCM_SETITEMEXTRA",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    "TCM_ADJUSTRECT",
+    "TCM_SETITEMSIZE",
+    "TCM_REMOVEIMAGE",
+    "TCM_SETPADDING",
+    "TCM_GETROWCOUNT",
+    "TCM_GETTOOLTIPS",
+    "TCM_SETTOOLTIPS",
+    "TCM_GETCURFOCUS",
+    "TCM_SETCURFOCUS",
+    "TCM_SETMINTABWIDTH",
+    "TCM_DESELECTALL",
+    "TCM_HIGHLIGHTITEM",
+    "TCM_SETEXTENDEDSTYLE",
+    "TCM_GETEXTENDEDSTYLE",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    "TCM_GETITEMW",
+    "TCM_SETITEMW",
+    "TCM_INSERTITEMW"
+};
+
+#define SPY_MAX_PGMMSGNUM   13
+static const char * const PGMMessageTypeNames[SPY_MAX_PGMMSGNUM + 1] =
+{
+    NULL,               /* 1400 */
+    "PGM_SETCHILD",
+    "PGM_RECALCSIZE",
+    "PGM_FORWARDMOUSE",
+    "PGM_SETBKCOLOR",
+    "PGM_GETBKCOLOR",
+    "PGM_SETBORDER",
+    "PGM_GETBORDER",
+    "PGM_SETPOS",
+    "PGM_GETPOS",
+    "PGM_SETBUTTONSIZE",
+    "PGM_GETBUTTONSIZE",
+    "PGM_GETBUTTONSTATE",
+    "PGM_GETDROPTARGET"
+};
+
+
+#define SPY_MAX_CCMMSGNUM   9
+static const char * const CCMMessageTypeNames[SPY_MAX_CCMMSGNUM + 1] =
+{
+    NULL,               /* 0x2000 */
+    "CCM_SETBKCOLOR",
+    "CCM_SETCOLORSCHEME",
+    "CCM_GETCOLORSCHEME",
+    "CCM_GETDROPTARGET",
+    "CCM_SETUNICODEFORMAT",
+    "CCM_GETUNICODEFORMAT",
+    "CCM_SETVERSION",
+    "CCM_GETVERSION",
+    "CCM_SETNOTIFYWINDOW"
+};
+
+#define SPY_MAX_WINEMSGNUM   6
+static const char * const WINEMessageTypeNames[SPY_MAX_WINEMSGNUM + 1] =
+{
+    "WM_WINE_DESTROYWINDOW",
+    "WM_WINE_SETWINDOWPOS",
+    "WM_WINE_SHOWWINDOW",
+    "WM_WINE_SETPARENT",
+    "WM_WINE_SETWINDOWLONG",
+    "WM_WINE_ENABLEWINDOW"
+};
+
+/* Virtual key names */
+#define SPY_MAX_VKKEYSNUM 255
+static const char * const VK_KeyNames[SPY_MAX_VKKEYSNUM + 1] =
+{
+    NULL,               /* 0x00 */
+    "VK_LBUTTON",       /* 0x01 */
+    "VK_RBUTTON",       /* 0x02 */
+    "VK_CANCEL",        /* 0x03 */
+    "VK_MBUTTON",       /* 0x04 */
+    "VK_XBUTTON1",      /* 0x05 */
+    "VK_XBUTTON2",      /* 0x06 */
+    NULL,               /* 0x07 */
+    "VK_BACK",          /* 0x08 */
+    "VK_TAB",           /* 0x09 */
+    NULL,               /* 0x0A */
+    NULL,               /* 0x0B */
+    "VK_CLEAR",         /* 0x0C */
+    "VK_RETURN",        /* 0x0D */
+    NULL,               /* 0x0E */
+    NULL,               /* 0x0F */
+    "VK_SHIFT",         /* 0x10 */
+    "VK_CONTROL",       /* 0x11 */
+    "VK_MENU",          /* 0x12 */
+    "VK_PAUSE",         /* 0x13 */
+    "VK_CAPITAL",       /* 0x14 */
+    NULL,               /* 0x15 */
+    NULL,               /* 0x16 */
+    NULL,               /* 0x17 */
+    NULL,               /* 0x18 */
+    NULL,               /* 0x19 */
+    NULL,               /* 0x1A */
+    "VK_ESCAPE",        /* 0x1B */
+    NULL,               /* 0x1C */
+    NULL,               /* 0x1D */
+    NULL,               /* 0x1E */
+    NULL,               /* 0x1F */
+    "VK_SPACE",         /* 0x20 */
+    "VK_PRIOR",         /* 0x21 */
+    "VK_NEXT",          /* 0x22 */
+    "VK_END",           /* 0x23 */
+    "VK_HOME",          /* 0x24 */
+    "VK_LEFT",          /* 0x25 */
+    "VK_UP",            /* 0x26 */
+    "VK_RIGHT",         /* 0x27 */
+    "VK_DOWN",          /* 0x28 */
+    "VK_SELECT",        /* 0x29 */
+    "VK_PRINT",         /* 0x2A */
+    "VK_EXECUTE",       /* 0x2B */
+    "VK_SNAPSHOT",      /* 0x2C */
+    "VK_INSERT",        /* 0x2D */
+    "VK_DELETE",        /* 0x2E */
+    "VK_HELP",          /* 0x2F */
+    "VK_0",             /* 0x30 */
+    "VK_1",             /* 0x31 */
+    "VK_2",             /* 0x32 */
+    "VK_3",             /* 0x33 */
+    "VK_4",             /* 0x34 */
+    "VK_5",             /* 0x35 */
+    "VK_6",             /* 0x36 */
+    "VK_7",             /* 0x37 */
+    "VK_8",             /* 0x38 */
+    "VK_9",             /* 0x39 */
+    NULL,               /* 0x3A */
+    NULL,               /* 0x3B */
+    NULL,               /* 0x3C */
+    NULL,               /* 0x3D */
+    NULL,               /* 0x3E */
+    NULL,               /* 0x3F */
+    NULL,               /* 0x40 */
+    "VK_A",             /* 0x41 */
+    "VK_B",             /* 0x42 */
+    "VK_C",             /* 0x43 */
+    "VK_D",             /* 0x44 */
+    "VK_E",             /* 0x45 */
+    "VK_F",             /* 0x46 */
+    "VK_G",             /* 0x47 */
+    "VK_H",             /* 0x48 */
+    "VK_I",             /* 0x49 */
+    "VK_J",             /* 0x4A */
+    "VK_K",             /* 0x4B */
+    "VK_L",             /* 0x4C */
+    "VK_M",             /* 0x4D */
+    "VK_N",             /* 0x4E */
+    "VK_O",             /* 0x4F */
+    "VK_P",             /* 0x50 */
+    "VK_Q",             /* 0x51 */
+    "VK_R",             /* 0x52 */
+    "VK_S",             /* 0x53 */
+    "VK_T",             /* 0x54 */
+    "VK_U",             /* 0x55 */
+    "VK_V",             /* 0x56 */
+    "VK_W",             /* 0x57 */
+    "VK_X",             /* 0x58 */
+    "VK_Y",             /* 0x59 */
+    "VK_Z",             /* 0x5A */
+    "VK_LWIN",          /* 0x5B */
+    "VK_RWIN",          /* 0x5C */
+    "VK_APPS",          /* 0x5D */
+    NULL,               /* 0x5E */
+    NULL,               /* 0x5F */
+    "VK_NUMPAD0",       /* 0x60 */
+    "VK_NUMPAD1",       /* 0x61 */
+    "VK_NUMPAD2",       /* 0x62 */
+    "VK_NUMPAD3",       /* 0x63 */
+    "VK_NUMPAD4",       /* 0x64 */
+    "VK_NUMPAD5",       /* 0x65 */
+    "VK_NUMPAD6",       /* 0x66 */
+    "VK_NUMPAD7",       /* 0x67 */
+    "VK_NUMPAD8",       /* 0x68 */
+    "VK_NUMPAD9",       /* 0x69 */
+    "VK_MULTIPLY",      /* 0x6A */
+    "VK_ADD",           /* 0x6B */
+    "VK_SEPARATOR",     /* 0x6C */
+    "VK_SUBTRACT",      /* 0x6D */
+    "VK_DECIMAL",       /* 0x6E */
+    "VK_DIVIDE",        /* 0x6F */
+    "VK_F1",            /* 0x70 */
+    "VK_F2",            /* 0x71 */
+    "VK_F3",            /* 0x72 */
+    "VK_F4",            /* 0x73 */
+    "VK_F5",            /* 0x74 */
+    "VK_F6",            /* 0x75 */
+    "VK_F7",            /* 0x76 */
+    "VK_F8",            /* 0x77 */
+    "VK_F9",            /* 0x78 */
+    "VK_F10",           /* 0x79 */
+    "VK_F11",           /* 0x7A */
+    "VK_F12",           /* 0x7B */
+    "VK_F13",           /* 0x7C */
+    "VK_F14",           /* 0x7D */
+    "VK_F15",           /* 0x7E */
+    "VK_F16",           /* 0x7F */
+    "VK_F17",           /* 0x80 */
+    "VK_F18",           /* 0x81 */
+    "VK_F19",           /* 0x82 */
+    "VK_F20",           /* 0x83 */
+    "VK_F21",           /* 0x84 */
+    "VK_F22",           /* 0x85 */
+    "VK_F23",           /* 0x86 */
+    "VK_F24",           /* 0x87 */
+    NULL,               /* 0x88 */
+    NULL,               /* 0x89 */
+    NULL,               /* 0x8A */
+    NULL,               /* 0x8B */
+    NULL,               /* 0x8C */
+    NULL,               /* 0x8D */
+    NULL,               /* 0x8E */
+    NULL,               /* 0x8F */
+    "VK_NUMLOCK",       /* 0x90 */
+    "VK_SCROLL",        /* 0x91 */
+    NULL,               /* 0x92 */
+    NULL,               /* 0x93 */
+    NULL,               /* 0x94 */
+    NULL,               /* 0x95 */
+    NULL,               /* 0x96 */
+    NULL,               /* 0x97 */
+    NULL,               /* 0x98 */
+    NULL,               /* 0x99 */
+    NULL,               /* 0x9A */
+    NULL,               /* 0x9B */
+    NULL,               /* 0x9C */
+    NULL,               /* 0x9D */
+    NULL,               /* 0x9E */
+    NULL,               /* 0x9F */
+    "VK_LSHIFT",        /* 0xA0 */
+    "VK_RSHIFT",        /* 0xA1 */
+    "VK_LCONTROL",      /* 0xA2 */
+    "VK_RCONTROL",      /* 0xA3 */
+    "VK_LMENU",         /* 0xA4 */
+    "VK_RMENU",         /* 0xA5 */
+    NULL,               /* 0xA6 */
+    NULL,               /* 0xA7 */
+    NULL,               /* 0xA8 */
+    NULL,               /* 0xA9 */
+    NULL,               /* 0xAA */
+    NULL,               /* 0xAB */
+    NULL,               /* 0xAC */
+    NULL,               /* 0xAD */
+    NULL,               /* 0xAE */
+    NULL,               /* 0xAF */
+    NULL,               /* 0xB0 */
+    NULL,               /* 0xB1 */
+    NULL,               /* 0xB2 */
+    NULL,               /* 0xB3 */
+    NULL,               /* 0xB4 */
+    NULL,               /* 0xB5 */
+    NULL,               /* 0xB6 */
+    NULL,               /* 0xB7 */
+    NULL,               /* 0xB8 */
+    NULL,               /* 0xB9 */
+    "VK_OEM_1",         /* 0xBA */
+    "VK_OEM_PLUS",      /* 0xBB */
+    "VK_OEM_COMMA",     /* 0xBC */
+    "VK_OEM_MINUS",     /* 0xBD */
+    "VK_OEM_PERIOD",    /* 0xBE */
+    "VK_OEM_2",         /* 0xBF */
+    "VK_OEM_3",         /* 0xC0 */
+    NULL,               /* 0xC1 */
+    NULL,               /* 0xC2 */
+    NULL,               /* 0xC3 */
+    NULL,               /* 0xC4 */
+    NULL,               /* 0xC5 */
+    NULL,               /* 0xC6 */
+    NULL,               /* 0xC7 */
+    NULL,               /* 0xC8 */
+    NULL,               /* 0xC9 */
+    NULL,               /* 0xCA */
+    NULL,               /* 0xCB */
+    NULL,               /* 0xCC */
+    NULL,               /* 0xCD */
+    NULL,               /* 0xCE */
+    NULL,               /* 0xCF */
+    NULL,               /* 0xD0 */
+    NULL,               /* 0xD1 */
+    NULL,               /* 0xD2 */
+    NULL,               /* 0xD3 */
+    NULL,               /* 0xD4 */
+    NULL,               /* 0xD5 */
+    NULL,               /* 0xD6 */
+    NULL,               /* 0xD7 */
+    NULL,               /* 0xD8 */
+    NULL,               /* 0xD9 */
+    NULL,               /* 0xDA */
+    "VK_OEM_4",         /* 0xDB */
+    "VK_OEM_5",         /* 0xDC */
+    "VK_OEM_6",         /* 0xDD */
+    "VK_OEM_7",         /* 0xDE */
+    "VK_OEM_8",         /* 0xDF */
+    NULL,               /* 0xE0 */
+    "VK_OEM_AX",        /* 0xE1 */
+    "VK_OEM_102",       /* 0xE2 */
+    "VK_ICO_HELP",      /* 0xE3 */
+    "VK_ICO_00",        /* 0xE4 */
+    "VK_PROCESSKEY",    /* 0xE5 */
+    NULL,               /* 0xE6 */
+    NULL,               /* 0xE7 */
+    NULL,               /* 0xE8 */
+    NULL,               /* 0xE9 */
+    NULL,               /* 0xEA */
+    NULL,               /* 0xEB */
+    NULL,               /* 0xEC */
+    NULL,               /* 0xED */
+    NULL,               /* 0xEE */
+    NULL,               /* 0xEF */
+    NULL,               /* 0xF0 */
+    NULL,               /* 0xF1 */
+    NULL,               /* 0xF2 */
+    NULL,               /* 0xF3 */
+    NULL,               /* 0xF4 */
+    NULL,               /* 0xF5 */
+    "VK_ATTN",          /* 0xF6 */
+    "VK_CRSEL",         /* 0xF7 */
+    "VK_EXSEL",         /* 0xF8 */
+    "VK_EREOF",         /* 0xF9 */
+    "VK_PLAY",          /* 0xFA */
+    "VK_ZOOM",          /* 0xFB */
+    "VK_NONAME",        /* 0xFC */
+    "VK_PA1",           /* 0xFD */
+    "VK_OEM_CLEAR",     /* 0xFE */
+    NULL                /* 0xFF */
+};
+
+
+/************************************************************************/
+
+
+/* WM_USER+n message values for "common controls" */
+
+typedef struct
+{
+    const char *name;      /* name of control message           */
+    UINT        value;     /* message number (0x0401-0x0fff     */
+    UINT        len;       /* length of space at lParam to dump */
+} USER_MSG;
+
+
+typedef struct
+{
+const WCHAR      *classname;  /* class name to match                  */
+const USER_MSG   *classmsg;   /* pointer to first USER_MSG for class  */
+const USER_MSG   *lastmsg;    /* pointer to last USER_MSG for class   */
+} CONTROL_CLASS;
+
+#define USM(a,b) { #a ,a,b}
+#define SZOF(a)  sizeof(a)
+
+/* To dump memory at the lParam for any of these messages,  */
+/* replace the "0" with a "SZOF(structure)", or with a      */
+/* number. (First method preferred.)                         */
+
+#define RB_GETBANDINFO_OLD (WM_USER+5) /* obsoleted after IE3, but we have to support it anyway */
+
+static const USER_MSG rebar_array[] = {
+          USM(RB_INSERTBANDA,          0),
+          USM(RB_DELETEBAND,           0),
+          USM(RB_GETBARINFO,           0),
+          USM(RB_SETBARINFO,           0),
+          USM(RB_GETBANDINFO_OLD,      0),
+          USM(RB_SETBANDINFOA,         0),
+          USM(RB_SETPARENT,            0),
+          USM(RB_HITTEST,              0),
+          USM(RB_GETRECT,              0),
+          USM(RB_INSERTBANDW,          0),
+          USM(RB_SETBANDINFOW,         0),
+          USM(RB_GETBANDCOUNT,         0),
+          USM(RB_GETROWCOUNT,          0),
+          USM(RB_GETROWHEIGHT,         0),
+          USM(RB_IDTOINDEX,            0),
+          USM(RB_GETTOOLTIPS,          0),
+          USM(RB_SETTOOLTIPS,          0),
+          USM(RB_SETBKCOLOR,           0),
+          USM(RB_GETBKCOLOR,           0),
+          USM(RB_SETTEXTCOLOR,         0),
+          USM(RB_GETTEXTCOLOR,         0),
+          USM(RB_SIZETORECT,           0),
+          USM(RB_BEGINDRAG,            0),
+          USM(RB_ENDDRAG,              0),
+          USM(RB_DRAGMOVE,             0),
+          USM(RB_GETBARHEIGHT,         0),
+          USM(RB_GETBANDINFOW,         0),
+          USM(RB_GETBANDINFOA,         0),
+          USM(RB_MINIMIZEBAND,         0),
+          USM(RB_MAXIMIZEBAND,         0),
+          USM(RB_GETBANDBORDERS,       0),
+          USM(RB_SHOWBAND,             0),
+          USM(RB_SETPALETTE,           0),
+          USM(RB_GETPALETTE,           0),
+          USM(RB_MOVEBAND,             0),
+          {0,0,0} };
+
+static const USER_MSG toolbar_array[] = {
+          USM(TB_ENABLEBUTTON          ,0),
+          USM(TB_CHECKBUTTON           ,0),
+          USM(TB_PRESSBUTTON           ,0),
+          USM(TB_HIDEBUTTON            ,0),
+          USM(TB_INDETERMINATE         ,0),
+          USM(TB_MARKBUTTON            ,0),
+          USM(TB_ISBUTTONENABLED       ,0),
+          USM(TB_ISBUTTONCHECKED       ,0),
+          USM(TB_ISBUTTONPRESSED       ,0),
+          USM(TB_ISBUTTONHIDDEN        ,0),
+          USM(TB_ISBUTTONINDETERMINATE ,0),
+          USM(TB_ISBUTTONHIGHLIGHTED   ,0),
+          USM(TB_SETSTATE              ,0),
+          USM(TB_GETSTATE              ,0),
+          USM(TB_ADDBITMAP             ,0),
+          USM(TB_ADDBUTTONSA           ,0),
+          USM(TB_INSERTBUTTONA         ,0),
+          USM(TB_DELETEBUTTON          ,0),
+          USM(TB_GETBUTTON             ,0),
+          USM(TB_BUTTONCOUNT           ,0),
+          USM(TB_COMMANDTOINDEX        ,0),
+          USM(TB_SAVERESTOREA          ,0),
+          USM(TB_CUSTOMIZE             ,0),
+          USM(TB_ADDSTRINGA            ,0),
+          USM(TB_GETITEMRECT           ,0),
+          USM(TB_BUTTONSTRUCTSIZE      ,0),
+          USM(TB_SETBUTTONSIZE         ,0),
+          USM(TB_SETBITMAPSIZE         ,0),
+          USM(TB_AUTOSIZE              ,0),
+          USM(TB_GETTOOLTIPS           ,0),
+          USM(TB_SETTOOLTIPS           ,0),
+          USM(TB_SETPARENT             ,0),
+          USM(TB_SETROWS               ,0),
+          USM(TB_GETROWS               ,0),
+          USM(TB_GETBITMAPFLAGS        ,0),
+          USM(TB_SETCMDID              ,0),
+          USM(TB_CHANGEBITMAP          ,0),
+          USM(TB_GETBITMAP             ,0),
+          USM(TB_GETBUTTONTEXTA        ,0),
+          USM(TB_REPLACEBITMAP         ,0),
+          USM(TB_SETINDENT             ,0),
+          USM(TB_SETIMAGELIST          ,0),
+          USM(TB_GETIMAGELIST          ,0),
+          USM(TB_LOADIMAGES            ,0),
+          USM(TB_GETRECT               ,0),
+          USM(TB_SETHOTIMAGELIST       ,0),
+          USM(TB_GETHOTIMAGELIST       ,0),
+          USM(TB_SETDISABLEDIMAGELIST  ,0),
+          USM(TB_GETDISABLEDIMAGELIST  ,0),
+          USM(TB_SETSTYLE              ,0),
+          USM(TB_GETSTYLE              ,0),
+          USM(TB_GETBUTTONSIZE         ,0),
+          USM(TB_SETBUTTONWIDTH        ,0),
+          USM(TB_SETMAXTEXTROWS        ,0),
+          USM(TB_GETTEXTROWS           ,0),
+          USM(TB_GETOBJECT             ,0),
+          USM(TB_GETBUTTONINFOW        ,0),
+          USM(TB_SETBUTTONINFOW        ,0),
+          USM(TB_GETBUTTONINFOA        ,0),
+          USM(TB_SETBUTTONINFOA        ,0),
+          USM(TB_INSERTBUTTONW         ,0),
+          USM(TB_ADDBUTTONSW           ,0),
+          USM(TB_HITTEST               ,0),
+          USM(TB_SETDRAWTEXTFLAGS      ,0),
+          USM(TB_GETHOTITEM            ,0),
+          USM(TB_SETHOTITEM            ,0),
+          USM(TB_SETANCHORHIGHLIGHT    ,0),
+          USM(TB_GETANCHORHIGHLIGHT    ,0),
+          USM(TB_GETBUTTONTEXTW        ,0),
+          USM(TB_SAVERESTOREW          ,0),
+          USM(TB_ADDSTRINGW            ,0),
+          USM(TB_MAPACCELERATORA       ,0),
+          USM(TB_GETINSERTMARK         ,0),
+          USM(TB_SETINSERTMARK         ,0),
+          USM(TB_INSERTMARKHITTEST     ,0),
+          USM(TB_MOVEBUTTON            ,0),
+          USM(TB_GETMAXSIZE            ,0),
+          USM(TB_SETEXTENDEDSTYLE      ,0),
+          USM(TB_GETEXTENDEDSTYLE      ,0),
+          USM(TB_GETPADDING            ,0),
+          USM(TB_SETPADDING            ,0),
+          USM(TB_SETINSERTMARKCOLOR    ,0),
+          USM(TB_GETINSERTMARKCOLOR    ,0),
+          USM(TB_MAPACCELERATORW       ,0),
+          USM(TB_GETSTRINGW            ,0),
+          USM(TB_GETSTRINGA            ,0),
+          USM(TB_UNKWN45D              ,8),
+          USM(TB_UNKWN45E              ,0),
+          USM(TB_UNKWN460              ,0),
+          USM(TB_UNKWN463              ,8),
+          USM(TB_UNKWN464              ,0),
+          {0,0,0} };
+
+static const USER_MSG tooltips_array[] = {
+          USM(TTM_ACTIVATE             ,0),
+          USM(TTM_SETDELAYTIME         ,0),
+          USM(TTM_ADDTOOLA             ,0),
+          USM(TTM_DELTOOLA             ,0),
+          USM(TTM_NEWTOOLRECTA         ,0),
+          USM(TTM_RELAYEVENT           ,0),
+          USM(TTM_GETTOOLINFOA         ,0),
+          USM(TTM_HITTESTA             ,0),
+          USM(TTM_GETTEXTA             ,0),
+          USM(TTM_UPDATETIPTEXTA       ,0),
+          USM(TTM_GETTOOLCOUNT         ,0),
+          USM(TTM_ENUMTOOLSA           ,0),
+          USM(TTM_GETCURRENTTOOLA      ,0),
+          USM(TTM_WINDOWFROMPOINT      ,0),
+          USM(TTM_TRACKACTIVATE        ,0),
+          USM(TTM_TRACKPOSITION        ,0),
+          USM(TTM_SETTIPBKCOLOR        ,0),
+          USM(TTM_SETTIPTEXTCOLOR      ,0),
+          USM(TTM_GETDELAYTIME         ,0),
+          USM(TTM_GETTIPBKCOLOR        ,0),
+          USM(TTM_GETTIPTEXTCOLOR      ,0),
+          USM(TTM_SETMAXTIPWIDTH       ,0),
+          USM(TTM_GETMAXTIPWIDTH       ,0),
+          USM(TTM_SETMARGIN            ,0),
+          USM(TTM_GETMARGIN            ,0),
+          USM(TTM_POP                  ,0),
+          USM(TTM_UPDATE               ,0),
+          USM(TTM_GETBUBBLESIZE        ,0),
+          USM(TTM_ADDTOOLW             ,0),
+          USM(TTM_DELTOOLW             ,0),
+          USM(TTM_NEWTOOLRECTW         ,0),
+          USM(TTM_GETTOOLINFOW         ,0),
+          USM(TTM_SETTOOLINFOW         ,0),
+          USM(TTM_HITTESTW             ,0),
+          USM(TTM_GETTEXTW             ,0),
+          USM(TTM_UPDATETIPTEXTW       ,0),
+          USM(TTM_ENUMTOOLSW           ,0),
+          USM(TTM_GETCURRENTTOOLW      ,0),
+          {0,0,0} };
+
+static const USER_MSG comboex_array[] = {
+          USM(CBEM_INSERTITEMA        ,0),
+          USM(CBEM_SETIMAGELIST       ,0),
+          USM(CBEM_GETIMAGELIST       ,0),
+          USM(CBEM_GETITEMA           ,0),
+          USM(CBEM_SETITEMA           ,0),
+          USM(CBEM_GETCOMBOCONTROL    ,0),
+          USM(CBEM_GETEDITCONTROL     ,0),
+          USM(CBEM_SETEXSTYLE         ,0),
+          USM(CBEM_GETEXTENDEDSTYLE   ,0),
+          USM(CBEM_HASEDITCHANGED     ,0),
+          USM(CBEM_INSERTITEMW        ,0),
+          USM(CBEM_SETITEMW           ,0),
+          USM(CBEM_GETITEMW           ,0),
+          USM(CBEM_SETEXTENDEDSTYLE   ,0),
+          {0,0,0} };
+
+static const USER_MSG propsht_array[] = {
+          USM(PSM_SETCURSEL           ,0),
+          USM(PSM_REMOVEPAGE          ,0),
+          USM(PSM_ADDPAGE             ,0),
+          USM(PSM_CHANGED             ,0),
+          USM(PSM_RESTARTWINDOWS      ,0),
+          USM(PSM_REBOOTSYSTEM        ,0),
+          USM(PSM_CANCELTOCLOSE       ,0),
+          USM(PSM_QUERYSIBLINGS       ,0),
+          USM(PSM_UNCHANGED           ,0),
+          USM(PSM_APPLY               ,0),
+          USM(PSM_SETTITLEA           ,0),
+          USM(PSM_SETWIZBUTTONS       ,0),
+          USM(PSM_PRESSBUTTON         ,0),
+          USM(PSM_SETCURSELID         ,0),
+          USM(PSM_SETFINISHTEXTA      ,0),
+          USM(PSM_GETTABCONTROL       ,0),
+          USM(PSM_ISDIALOGMESSAGE     ,0),
+          USM(PSM_GETCURRENTPAGEHWND  ,0),
+          USM(PSM_SETTITLEW           ,0),
+          USM(PSM_SETFINISHTEXTW      ,0),
+          {0,0,0} };
+const WCHAR PropSheetInfoStr[] =
+    {'P','r','o','p','e','r','t','y','S','h','e','e','t','I','n','f','o',0 };
+
+static const USER_MSG updown_array[] = {
+          USM(UDM_SETRANGE            ,0),
+          USM(UDM_GETRANGE            ,0),
+          USM(UDM_SETPOS              ,0),
+          USM(UDM_GETPOS              ,0),
+          USM(UDM_SETBUDDY            ,0),
+          USM(UDM_GETBUDDY            ,0),
+          USM(UDM_SETACCEL            ,0),
+          USM(UDM_GETACCEL            ,0),
+          USM(UDM_SETBASE             ,0),
+          USM(UDM_GETBASE             ,0),
+          USM(UDM_SETRANGE32          ,0),
+          USM(UDM_GETRANGE32          ,0),
+          USM(UDM_SETPOS32            ,0),
+          USM(UDM_GETPOS32            ,0),
+          {0,0,0} };
+
+/* generated from:
+ * $ for i in `grep EM_ include/richedit.h | cut -d' ' -f2 | cut -f1`; do echo -e "          USM($i\t\t,0),"; done
+ */
+static const USER_MSG richedit_array[] = {
+          {"EM_SCROLLCARET", WM_USER+49 ,0},
+          USM(EM_CANPASTE               ,0),
+          USM(EM_DISPLAYBAND            ,0),
+          USM(EM_EXGETSEL               ,0),
+          USM(EM_EXLIMITTEXT            ,0),
+          USM(EM_EXLINEFROMCHAR         ,0),
+          USM(EM_EXSETSEL               ,0),
+          USM(EM_FINDTEXT               ,0),
+          USM(EM_FORMATRANGE            ,0),
+          USM(EM_GETCHARFORMAT          ,0),
+          USM(EM_GETEVENTMASK           ,0),
+          USM(EM_GETOLEINTERFACE        ,0),
+          USM(EM_GETPARAFORMAT          ,0),
+          USM(EM_GETSELTEXT             ,0),
+          USM(EM_HIDESELECTION          ,0),
+          USM(EM_PASTESPECIAL           ,0),
+          USM(EM_REQUESTRESIZE          ,0),
+          USM(EM_SELECTIONTYPE          ,0),
+          USM(EM_SETBKGNDCOLOR          ,0),
+          USM(EM_SETCHARFORMAT          ,0),
+          USM(EM_SETEVENTMASK           ,0),
+          USM(EM_SETOLECALLBACK         ,0),
+          USM(EM_SETPARAFORMAT          ,0),
+          USM(EM_SETTARGETDEVICE        ,0),
+          USM(EM_STREAMIN               ,0),
+          USM(EM_STREAMOUT              ,0),
+          USM(EM_GETTEXTRANGE           ,0),
+          USM(EM_FINDWORDBREAK          ,0),
+          USM(EM_SETOPTIONS             ,0),
+          USM(EM_GETOPTIONS             ,0),
+          USM(EM_FINDTEXTEX             ,0),
+          USM(EM_GETWORDBREAKPROCEX     ,0),
+          USM(EM_SETWORDBREAKPROCEX     ,0),
+          USM(EM_SETUNDOLIMIT           ,0),
+          USM(EM_REDO                   ,0),
+          USM(EM_CANREDO                ,0),
+          USM(EM_GETUNDONAME            ,0),
+          USM(EM_GETREDONAME            ,0),
+          USM(EM_STOPGROUPTYPING        ,0),
+          USM(EM_SETTEXTMODE            ,0),
+          USM(EM_GETTEXTMODE            ,0),
+          USM(EM_AUTOURLDETECT          ,0),
+          USM(EM_GETAUTOURLDETECT       ,0),
+          USM(EM_SETPALETTE             ,0),
+          USM(EM_GETTEXTEX              ,0),
+          USM(EM_GETTEXTLENGTHEX        ,0),
+          USM(EM_SHOWSCROLLBAR          ,0),
+          USM(EM_SETTEXTEX              ,0),
+          USM(EM_SETPUNCTUATION         ,0),
+          USM(EM_GETPUNCTUATION         ,0),
+          USM(EM_SETWORDWRAPMODE        ,0),
+          USM(EM_GETWORDWRAPMODE        ,0),
+          USM(EM_SETIMECOLOR            ,0),
+          USM(EM_GETIMECOLOR            ,0),
+          USM(EM_SETIMEOPTIONS          ,0),
+          USM(EM_GETIMEOPTIONS          ,0),
+          USM(EM_CONVPOSITION           ,0),
+          USM(EM_SETLANGOPTIONS         ,0),
+          USM(EM_GETLANGOPTIONS         ,0),
+          USM(EM_GETIMECOMPMODE         ,0),
+          USM(EM_FINDTEXTW              ,0),
+          USM(EM_FINDTEXTEXW            ,0),
+          USM(EM_RECONVERSION           ,0),
+          USM(EM_SETIMEMODEBIAS         ,0),
+          USM(EM_GETIMEMODEBIAS         ,0),
+          USM(EM_SETBIDIOPTIONS         ,0),
+          USM(EM_GETBIDIOPTIONS         ,0),
+          USM(EM_SETTYPOGRAPHYOPTIONS   ,0),
+          USM(EM_GETTYPOGRAPHYOPTIONS   ,0),
+          USM(EM_SETEDITSTYLE           ,0),
+          USM(EM_GETEDITSTYLE           ,0),
+          USM(EM_OUTLINE                ,0),
+          USM(EM_GETSCROLLPOS           ,0),
+          USM(EM_SETSCROLLPOS           ,0),
+          USM(EM_SETFONTSIZE            ,0),
+          USM(EM_GETZOOM                ,0),
+          USM(EM_SETZOOM                ,0),
+          {0,0,0} };
+
+#undef SZOF
+#undef USM
+
+static CONTROL_CLASS  cc_array[] = {
+    {WC_COMBOBOXEXW,    comboex_array,  0},
+    {WC_PROPSHEETW,     propsht_array,  0},
+    {REBARCLASSNAMEW,   rebar_array,    0},
+    {TOOLBARCLASSNAMEW, toolbar_array,  0},
+    {TOOLTIPS_CLASSW,   tooltips_array, 0},
+    {UPDOWN_CLASSW,     updown_array,   0},
+    {RICHEDIT_CLASS20W, richedit_array, 0},
+    {0, 0, 0} };
+
+
+/************************************************************************/
+
+
+/* WM_NOTIFY function codes display */
+
+typedef struct
+{
+    const char *name;     /* name of notify message        */
+    UINT        value;     /* notify code value             */
+    UINT        len;       /* length of extra space to dump */
+} SPY_NOTIFY;
+
+#define SPNFY(a,b) { #a ,a,sizeof(b)-sizeof(NMHDR)}
+
+/* Array MUST be in descending order by the 'value' field  */
+/* (since value is UNSIGNED, 0xffffffff is largest and     */
+/*  0xfffffffe is smaller). A binary search is used to     */
+/* locate the correct 'value'.                             */
+static const SPY_NOTIFY spnfy_array[] = {
+    /*  common        0U       to  0U-99U  */
+    SPNFY(NM_OUTOFMEMORY,        NMHDR),
+    SPNFY(NM_CLICK,              NMHDR),
+    SPNFY(NM_DBLCLK,             NMHDR),
+    SPNFY(NM_RETURN,             NMHDR),
+    SPNFY(NM_RCLICK,             NMHDR),
+    SPNFY(NM_RDBLCLK,            NMHDR),
+    SPNFY(NM_SETFOCUS,           NMHDR),
+    SPNFY(NM_KILLFOCUS,          NMHDR),
+    SPNFY(NM_CUSTOMDRAW,         NMCUSTOMDRAW),
+    SPNFY(NM_HOVER,              NMHDR),
+    SPNFY(NM_NCHITTEST,          NMMOUSE),
+    SPNFY(NM_KEYDOWN,            NMKEY),
+    SPNFY(NM_RELEASEDCAPTURE,    NMHDR),
+    SPNFY(NM_SETCURSOR,          NMMOUSE),
+    SPNFY(NM_CHAR,               NMCHAR),
+    SPNFY(NM_TOOLTIPSCREATED,    NMTOOLTIPSCREATED),
+    /* Listview       0U-100U  to  0U-199U  */
+    SPNFY(LVN_ITEMCHANGING,      NMLISTVIEW),
+    SPNFY(LVN_ITEMCHANGED,       NMLISTVIEW),
+    SPNFY(LVN_INSERTITEM,        NMLISTVIEW),
+    SPNFY(LVN_DELETEITEM,        NMLISTVIEW),
+    SPNFY(LVN_DELETEALLITEMS,    NMLISTVIEW),
+    SPNFY(LVN_BEGINLABELEDITA,   NMLVDISPINFOA),
+    SPNFY(LVN_ENDLABELEDITA,     NMLVDISPINFOA),
+    SPNFY(LVN_COLUMNCLICK,       NMLISTVIEW),
+    SPNFY(LVN_BEGINDRAG,         NMLISTVIEW),
+    SPNFY(LVN_BEGINRDRAG,        NMLISTVIEW),
+    SPNFY(LVN_ODCACHEHINT,       NMLVCACHEHINT),
+    SPNFY(LVN_ITEMACTIVATE,      NMITEMACTIVATE),
+    SPNFY(LVN_ODSTATECHANGED,    NMLVODSTATECHANGE),
+    SPNFY(LVN_HOTTRACK,          NMLISTVIEW),
+    SPNFY(LVN_GETDISPINFOA,      NMLVDISPINFOA),
+    SPNFY(LVN_SETDISPINFOA,      NMLVDISPINFOA),
+    SPNFY(LVN_ODFINDITEMA,       NMLVFINDITEMA),
+    SPNFY(LVN_KEYDOWN,           NMLVKEYDOWN),
+    SPNFY(LVN_MARQUEEBEGIN,      NMLISTVIEW),
+    SPNFY(LVN_GETINFOTIPA,       NMLVGETINFOTIPA),
+    SPNFY(LVN_GETINFOTIPW,       NMLVGETINFOTIPW),
+    SPNFY(LVN_BEGINLABELEDITW,   NMLVDISPINFOW),
+    SPNFY(LVN_ENDLABELEDITW,     NMLVDISPINFOW),
+    SPNFY(LVN_GETDISPINFOW,      NMLVDISPINFOW),
+    SPNFY(LVN_SETDISPINFOW,      NMLVDISPINFOW),
+    SPNFY(LVN_ODFINDITEMW,       NMLVFINDITEMW),
+    /* PropertySheet  0U-200U  to  0U-299U  */
+    SPNFY(PSN_SETACTIVE,         PSHNOTIFY),
+    SPNFY(PSN_KILLACTIVE,        PSHNOTIFY),
+    SPNFY(PSN_APPLY,             PSHNOTIFY),
+    SPNFY(PSN_RESET,             PSHNOTIFY),
+    SPNFY(PSN_HELP,              PSHNOTIFY),
+    SPNFY(PSN_WIZBACK,           PSHNOTIFY),
+    SPNFY(PSN_WIZNEXT,           PSHNOTIFY),
+    SPNFY(PSN_WIZFINISH,         PSHNOTIFY),
+    SPNFY(PSN_QUERYCANCEL,       PSHNOTIFY),
+    SPNFY(PSN_GETOBJECT,         NMOBJECTNOTIFY),
+    SPNFY(PSN_TRANSLATEACCELERATOR, PSHNOTIFY),
+    SPNFY(PSN_QUERYINITIALFOCUS, PSHNOTIFY),
+    /* Header         0U-300U  to  0U-399U  */
+    SPNFY(HDN_ITEMCHANGINGA,     NMHEADERA),
+    SPNFY(HDN_ITEMCHANGEDA,      NMHEADERA),
+    SPNFY(HDN_ITEMCLICKA,        NMHEADERA),
+    SPNFY(HDN_ITEMDBLCLICKA,     NMHEADERA),
+    SPNFY(HDN_DIVIDERDBLCLICKA,  NMHEADERA),
+    SPNFY(HDN_BEGINTRACKA,       NMHEADERA),
+    SPNFY(HDN_ENDTRACKA,         NMHEADERA),
+    SPNFY(HDN_TRACKA,            NMHEADERA),
+    SPNFY(HDN_GETDISPINFOA,      NMHEADERA),
+    SPNFY(HDN_BEGINDRAG,         NMHDR),
+    SPNFY(HDN_ENDDRAG,           NMHDR),
+    SPNFY(HDN_ITEMCHANGINGW,     NMHDR),
+    SPNFY(HDN_ITEMCHANGEDW,      NMHDR),
+    SPNFY(HDN_ITEMCLICKW,        NMHDR),
+    SPNFY(HDN_ITEMDBLCLICKW,     NMHDR),
+    SPNFY(HDN_DIVIDERDBLCLICKW,  NMHDR),
+    SPNFY(HDN_BEGINTRACKW,       NMHDR),
+    SPNFY(HDN_ENDTRACKW,         NMHDR),
+    SPNFY(HDN_TRACKW,            NMHDR),
+    SPNFY(HDN_GETDISPINFOW,      NMHDR),
+    /* Treeview       0U-400U  to  0U-499U  */
+    SPNFY(TVN_SELCHANGINGA,      NMTREEVIEWA),
+    SPNFY(TVN_SELCHANGEDA,       NMTREEVIEWA),
+    SPNFY(TVN_GETDISPINFOA,      NMTVDISPINFOA),
+    SPNFY(TVN_SETDISPINFOA,      NMTVDISPINFOA),
+    SPNFY(TVN_ITEMEXPANDINGA,    NMTREEVIEWA),
+    SPNFY(TVN_ITEMEXPANDEDA,     NMTREEVIEWA),
+    SPNFY(TVN_BEGINDRAGA,        NMTREEVIEWA),
+    SPNFY(TVN_BEGINRDRAGA,       NMTREEVIEWA),
+    SPNFY(TVN_DELETEITEMA,       NMTREEVIEWA),
+    SPNFY(TVN_BEGINLABELEDITA,   NMTVDISPINFOA),
+    SPNFY(TVN_ENDLABELEDITA,     NMTVDISPINFOA),
+    SPNFY(TVN_KEYDOWN,           NMTVKEYDOWN),
+    SPNFY(TVN_SELCHANGINGW,      NMTREEVIEWW),
+    SPNFY(TVN_SELCHANGEDW,       NMTREEVIEWW),
+    SPNFY(TVN_GETDISPINFOW,      NMTVDISPINFOW),
+    SPNFY(TVN_SETDISPINFOW,      NMTVDISPINFOW),
+    SPNFY(TVN_ITEMEXPANDINGW,    NMTREEVIEWW),
+    SPNFY(TVN_ITEMEXPANDEDW,     NMTREEVIEWW),
+    SPNFY(TVN_BEGINDRAGW,        NMTREEVIEWW),
+    SPNFY(TVN_BEGINRDRAGW,       NMTREEVIEWW),
+    SPNFY(TVN_DELETEITEMW,       NMTREEVIEWW),
+    SPNFY(TVN_BEGINLABELEDITW,   NMTVDISPINFOW),
+    SPNFY(TVN_ENDLABELEDITW,     NMTVDISPINFOW),
+    /* Tooltips       0U-520U  to  0U-549U  */
+    SPNFY(TTN_GETDISPINFOA,      NMHDR),
+    SPNFY(TTN_SHOW,              NMHDR),
+    SPNFY(TTN_POP,               NMHDR),
+    SPNFY(TTN_GETDISPINFOW,      NMHDR),
+    /* Tab            0U-550U  to  0U-580U  */
+    SPNFY(TCN_KEYDOWN,           NMHDR),
+    SPNFY(TCN_SELCHANGE,         NMHDR),
+    SPNFY(TCN_SELCHANGING,       NMHDR),
+    SPNFY(TCN_GETOBJECT,         NMHDR),
+    /* Common Dialog  0U-601U  to  0U-699U  */
+    SPNFY(CDN_INITDONE,          OFNOTIFYA),
+    SPNFY(CDN_SELCHANGE,         OFNOTIFYA),
+    SPNFY(CDN_FOLDERCHANGE,      OFNOTIFYA),
+    SPNFY(CDN_SHAREVIOLATION,    OFNOTIFYA),
+    SPNFY(CDN_HELP,              OFNOTIFYA),
+    SPNFY(CDN_FILEOK,            OFNOTIFYA),
+    SPNFY(CDN_TYPECHANGE,        OFNOTIFYA),
+    /* Toolbar        0U-700U  to  0U-720U  */
+    SPNFY(TBN_GETBUTTONINFOA,    NMTOOLBARA),
+    SPNFY(TBN_BEGINDRAG,         NMTOOLBARA),
+    SPNFY(TBN_ENDDRAG,           NMTOOLBARA),
+    SPNFY(TBN_BEGINADJUST,       NMHDR),
+    SPNFY(TBN_ENDADJUST,         NMHDR),
+    SPNFY(TBN_RESET,             NMHDR),
+    SPNFY(TBN_QUERYINSERT,       NMTOOLBARA),
+    SPNFY(TBN_QUERYDELETE,       NMTOOLBARA),
+    SPNFY(TBN_TOOLBARCHANGE,     NMHDR),
+    SPNFY(TBN_CUSTHELP,          NMHDR),
+    SPNFY(TBN_DROPDOWN,          NMTOOLBARA),
+    SPNFY(TBN_GETOBJECT,         NMOBJECTNOTIFY),
+    SPNFY(TBN_HOTITEMCHANGE,     NMTBHOTITEM),
+    SPNFY(TBN_DRAGOUT,           NMTOOLBARA),
+    SPNFY(TBN_DELETINGBUTTON,    NMTOOLBARA),
+    SPNFY(TBN_GETDISPINFOA,      NMTBDISPINFOA),
+    SPNFY(TBN_GETDISPINFOW,      NMTBDISPINFOW),
+    SPNFY(TBN_GETINFOTIPA,       NMTBGETINFOTIPA),
+    SPNFY(TBN_GETINFOTIPW,       NMTBGETINFOTIPW),
+    SPNFY(TBN_GETBUTTONINFOW,    NMTOOLBARW),
+    /* Up/Down        0U-721U  to  0U-740U  */
+    SPNFY(UDN_DELTAPOS,          NM_UPDOWN),
+    /* Month Calendar 0U-750U  to  0U-759U  */
+    /* ******************* WARNING ***************************** */
+    /* The following appear backwards but needs to be this way.  */
+    /* The reason is that MS (and us) define the MCNs as         */
+    /*         MCN_FIRST + n                                     */
+    /* instead of the way ALL other notifications are            */
+    /*         TBN_FIRST - n                                     */
+    /* The only place that this is important is in this list     */
+    /*                                                           */
+    /* Also since the same error was made with the DTN_ items,   */
+    /* they overlay the MCN_ and need to be inserted in the      */
+    /* other section of the table so that it is in order for     */
+    /* the binary search.                                        */
+    /*                                                           */
+    /* Thank you MS for your obvious quality control!!           */
+    /* ******************* WARNING ***************************** */
+    /* Date/Time      0U-760U  to  0U-799U  */
+    /* SPNFY(MCN_SELECT,            NMHDR), */
+    /* SPNFY(MCN_GETDAYSTATE,       NMHDR), */
+    /* SPNFY(MCN_SELCHANGE,         NMHDR), */
+    /* ******************* WARNING ***************************** */
+    /* The following appear backwards but needs to be this way.  */
+    /* The reason is that MS (and us) define the MCNs as         */
+    /*         DTN_FIRST + n                                     */
+    /* instead of the way ALL other notifications are            */
+    /*         TBN_FIRST - n                                     */
+    /* The only place that this is important is in this list     */
+    /* ******************* WARNING ***************************** */
+    SPNFY(DTN_FORMATQUERYW,      NMHDR),
+    SPNFY(DTN_FORMATW,           NMHDR),
+    SPNFY(DTN_WMKEYDOWNW,        NMHDR),
+    SPNFY(DTN_USERSTRINGW,       NMHDR),
+    SPNFY(MCN_SELECT,            NMHDR),
+    SPNFY(MCN_GETDAYSTATE,       NMHDR),
+    SPNFY(MCN_SELCHANGE,         NMHDR),
+    SPNFY(DTN_CLOSEUP,           NMHDR),
+    SPNFY(DTN_DROPDOWN,          NMHDR),
+    SPNFY(DTN_FORMATQUERYA,      NMHDR),
+    SPNFY(DTN_FORMATA,           NMHDR),
+    SPNFY(DTN_WMKEYDOWNA,        NMHDR),
+    SPNFY(DTN_USERSTRINGA,       NMHDR),
+    SPNFY(DTN_DATETIMECHANGE,    NMHDR),
+    /* ComboBoxEx     0U-800U  to  0U-830U  */
+    SPNFY(CBEN_GETDISPINFOA,     NMCOMBOBOXEXA),
+    SPNFY(CBEN_INSERTITEM,       NMCOMBOBOXEXA),
+    SPNFY(CBEN_DELETEITEM,       NMCOMBOBOXEXA),
+    SPNFY(CBEN_BEGINEDIT,        NMHDR),
+    SPNFY(CBEN_ENDEDITA,         NMCBEENDEDITA),
+    SPNFY(CBEN_ENDEDITW,         NMCBEENDEDITW),
+    SPNFY(CBEN_GETDISPINFOW,     NMCOMBOBOXEXW),
+    SPNFY(CBEN_DRAGBEGINA,       NMCBEDRAGBEGINA),
+    SPNFY(CBEN_DRAGBEGINW,       NMCBEDRAGBEGINW),
+    /* Rebar          0U-831U  to  0U-859U  */
+    SPNFY(RBN_HEIGHTCHANGE,      NMHDR),
+    SPNFY(RBN_GETOBJECT,         NMOBJECTNOTIFY),
+    SPNFY(RBN_LAYOUTCHANGED,     NMHDR),
+    SPNFY(RBN_AUTOSIZE,          NMRBAUTOSIZE),
+    SPNFY(RBN_BEGINDRAG,         NMREBAR),
+    SPNFY(RBN_ENDDRAG,           NMREBAR),
+    SPNFY(RBN_DELETINGBAND,      NMREBAR),
+    SPNFY(RBN_DELETEDBAND,       NMREBAR),
+    SPNFY(RBN_CHILDSIZE,         NMREBARCHILDSIZE),
+    /* IP Adderss     0U-860U  to  0U-879U  */
+    SPNFY(IPN_FIELDCHANGED,      NMHDR),
+    /* Status bar     0U-880U  to  0U-899U  */
+    SPNFY(SBN_SIMPLEMODECHANGE,  NMHDR),
+    /* Pager          0U-900U  to  0U-950U  */
+    SPNFY(PGN_SCROLL,            NMPGSCROLL),
+    SPNFY(PGN_CALCSIZE,          NMPGCALCSIZE),
+    {0,0,0}};
+static const SPY_NOTIFY *end_spnfy_array;     /* ptr to last good entry in array */
+#undef SPNFY
+
+static BOOL SPY_Exclude[SPY_MAX_MSGNUM+1];
+static BOOL SPY_ExcludeDWP = 0;
+
+#define SPY_EXCLUDE(msg) \
+    (SPY_Exclude[(msg) > SPY_MAX_MSGNUM ? SPY_MAX_MSGNUM : (msg)])
+
+
+typedef struct
+{
+    UINT       msgnum;           /* message number */
+    HWND       msg_hwnd;         /* window handle for message          */
+    WPARAM     wParam;           /* message parameter                  */
+    LPARAM     lParam;           /* message parameter                  */
+    INT        data_len;         /* length of data to dump             */
+    char       msg_name[60];     /* message name (see SPY_GetMsgName)  */
+    WCHAR      wnd_class[60];    /* window class name (full)           */
+    WCHAR      wnd_name[16];     /* window name for message            */
+} SPY_INSTANCE;
+
+static int indent_tls_index;
+
+/***********************************************************************
+ *           get_indent_level
+ */
+inline static INT_PTR get_indent_level(void)
+{
+    return (INT_PTR)TlsGetValue( indent_tls_index );
+}
+
+
+/***********************************************************************
+ *           set_indent_level
+ */
+inline static void set_indent_level( INT_PTR level )
+{
+    TlsSetValue( indent_tls_index, (void *)level );
+}
+
+
+/***********************************************************************
+ *           SPY_GetMsgInternal
+ */
+static const char *SPY_GetMsgInternal( UINT msg )
+{
+    if (msg <= SPY_MAX_MSGNUM)
+        return MessageTypeNames[msg];
+
+    if (msg >= LVM_FIRST && msg <= LVM_FIRST + SPY_MAX_LVMMSGNUM)
+        return LVMMessageTypeNames[msg-LVM_FIRST];
+
+    if (msg >= TV_FIRST && msg <= TV_FIRST + SPY_MAX_TVMSGNUM)
+        return TVMessageTypeNames[msg-TV_FIRST];
+
+    if (msg >= HDM_FIRST && msg <= HDM_FIRST + SPY_MAX_HDMMSGNUM)
+        return HDMMessageTypeNames[msg-HDM_FIRST];
+
+    if (msg >= TCM_FIRST && msg <= TCM_FIRST + SPY_MAX_TCMMSGNUM)
+        return TCMMessageTypeNames[msg-TCM_FIRST];
+
+    if (msg >= PGM_FIRST && msg <= PGM_FIRST + SPY_MAX_PGMMSGNUM)
+        return PGMMessageTypeNames[msg-PGM_FIRST];
+
+    if (msg >= CCM_FIRST && msg <= CCM_FIRST + SPY_MAX_CCMMSGNUM)
+        return CCMMessageTypeNames[msg-CCM_FIRST];
+#ifndef __REACTOS__
+    if (msg >= WM_WINE_DESTROYWINDOW && msg <= WM_WINE_DESTROYWINDOW + SPY_MAX_WINEMSGNUM)
+        return WINEMessageTypeNames[msg-WM_WINE_DESTROYWINDOW];
+#endif
+    return NULL;
+}
+
+/***********************************************************************
+ *           SPY_Bsearch_Msg
+ */
+static const USER_MSG *SPY_Bsearch_Msg( const USER_MSG *first, const USER_MSG *last, UINT code)
+{
+    INT count;
+    const USER_MSG *test;
+
+    while (last >= first) {
+        count = 1 + last - first;
+        if (count < 3) {
+#if DEBUG_SPY
+            TRACE("code=%d, f-value=%d, f-name=%s, l-value=%d, l-name=%s, l-len=%d,\n",
+               code, first->value, first->name, last->value, last->name, last->len);
+#endif
+            if (first->value == code) return first;
+            if (last->value == code) return last;
+            return NULL;
+        }
+        count = count / 2;
+        test = first + count;
+#if DEBUG_SPY
+        TRACE("first=%p, last=%p, test=%p, t-value=%d, code=%d, count=%d\n",
+           first, last, test, test->value, code, count);
+#endif
+        if (test->value == code) return test;
+        if (test->value > code)
+            last = test - 1;
+        else
+            first = test + 1;
+    }
+    return NULL;
+}
+
+/***********************************************************************
+ *           SPY_GetClassName
+ *
+ *  Sets the value of "wnd_class" member of the instance structure.
+ */
+static void SPY_GetClassName( SPY_INSTANCE *sp_e )
+{
+    DWORD save_error;
+
+    /* save and restore error code over the next call */
+    save_error = GetLastError();
+    /* special code to detect a property sheet dialog   */
+    if ((GetClassLongW(sp_e->msg_hwnd, GCW_ATOM) == (LONG)WC_DIALOG) &&
+        (GetPropW(sp_e->msg_hwnd, PropSheetInfoStr))) {
+        strcpyW(sp_e->wnd_class, WC_PROPSHEETW);
+    }
+    else {
+        GetClassNameW(sp_e->msg_hwnd, sp_e->wnd_class, sizeof(sp_e->wnd_class)/sizeof(WCHAR));
+    }
+    SetLastError(save_error);
+}
+
+/***********************************************************************
+ *           SPY_GetMsgStuff
+ *
+ *  Get message name and other information for dumping
+ */
+static void SPY_GetMsgStuff( SPY_INSTANCE *sp_e )
+{
+    const USER_MSG *p;
+    const char *msg_name = SPY_GetMsgInternal( sp_e->msgnum );
+
+    sp_e->data_len = 0;
+    if (!msg_name)
+    {
+        INT i = 0;
+
+        if (sp_e->msgnum >= 0xc000)
+        {
+            if (GlobalGetAtomNameA( sp_e->msgnum, sp_e->msg_name+1, sizeof(sp_e->msg_name)-2 ))
+            {
+                sp_e->msg_name[0] = '\"';
+                strcat( sp_e->msg_name, "\"" );
+                return;
+            }
+        }
+        if (!sp_e->wnd_class[0]) SPY_GetClassName(sp_e);
+
+#if DEBUG_SPY
+        TRACE("looking class %s\n", debugstr_w(sp_e->wnd_class));
+#endif
+
+        while (cc_array[i].classname &&
+               strcmpiW(cc_array[i].classname, sp_e->wnd_class) != 0) i++;
+
+        if (cc_array[i].classname)
+        {
+#if DEBUG_SPY
+            TRACE("process class %s, first %p, last %p\n",
+                  debugstr_w(cc_array[i].classname), cc_array[i].classmsg,
+                  cc_array[i].lastmsg);
+#endif
+            p = SPY_Bsearch_Msg (cc_array[i].classmsg, cc_array[i].lastmsg,
+                                 sp_e->msgnum);
+            if (p) {
+                lstrcpynA (sp_e->msg_name, p->name, sizeof(sp_e->msg_name));
+                sp_e->data_len = p->len;
+                return;
+            }
+        }
+        if (sp_e->msgnum >= WM_USER && sp_e->msgnum <= WM_APP)
+            sprintf( sp_e->msg_name, "WM_USER+%d", sp_e->msgnum - WM_USER );
+        else
+            sprintf( sp_e->msg_name, "%04x", sp_e->msgnum );
+    }
+    else
+    {
+        lstrcpynA(sp_e->msg_name, msg_name, sizeof(sp_e->msg_name));
+    }
+}
+
+/***********************************************************************
+ *           SPY_GetWndName
+ *
+ *  Sets the value of "wnd_name" and "wnd_class" members of the
+ *  instance structure.
+ *
+ */
+static void SPY_GetWndName( SPY_INSTANCE *sp_e )
+{
+    INT len;
+
+    SPY_GetClassName( sp_e );
+
+    len = InternalGetWindowText(sp_e->msg_hwnd, sp_e->wnd_name, sizeof(sp_e->wnd_name)/sizeof(WCHAR));
+    if(!len) /* get class name */
+    {
+        LPWSTR dst = sp_e->wnd_name;
+        LPWSTR src = sp_e->wnd_class;
+        int n = sizeof(sp_e->wnd_name)/sizeof(WCHAR) - 3;
+        *dst++ = '{';
+        while ((n-- > 0) && *src) *dst++ = *src++;
+        *dst++ = '}';
+        *dst = 0;
+    }
+}
+
+/***********************************************************************
+ *           SPY_GetMsgName
+ *
+ *  ****  External function  ****
+ *
+ *  Get message name
+ */
+const char *SPY_GetMsgName( UINT msg, HWND hWnd )
+{
+    SPY_INSTANCE ext_sp_e;
+
+    ext_sp_e.msgnum = msg;
+    ext_sp_e.msg_hwnd   = hWnd;
+    ext_sp_e.lParam = 0;
+    ext_sp_e.wParam = 0;
+    ext_sp_e.wnd_class[0] = 0;
+    SPY_GetMsgStuff(&ext_sp_e);
+    return wine_dbg_sprintf("%s", ext_sp_e.msg_name);
+}
+
+/***********************************************************************
+ *           SPY_GetVKeyName
+ */
+const char *SPY_GetVKeyName(WPARAM wParam)
+{
+    const char *vk_key_name;
+
+    if(wParam <= SPY_MAX_VKKEYSNUM && VK_KeyNames[wParam])
+        vk_key_name = VK_KeyNames[wParam];
+    else
+        vk_key_name = "VK_???";
+
+    return vk_key_name;
+}
+
+/***********************************************************************
+ *           SPY_Bsearch_Notify
+ */
+static const SPY_NOTIFY *SPY_Bsearch_Notify( const SPY_NOTIFY *first, const SPY_NOTIFY *last, UINT code)
+{
+    INT count;
+    const SPY_NOTIFY *test;
+
+    while (last >= first) {
+        count = 1 + last - first;
+        if (count < 3) {
+#if DEBUG_SPY
+            TRACE("code=%d, f-value=%d, f-name=%s, l-value=%d, l-name=%s, l-len=%d,\n",
+               code, first->value, first->name, last->value, last->name, last->len);
+#endif
+            if (first->value == code) return first;
+            if (last->value == code) return last;
+            return NULL;
+        }
+        count = count / 2;
+        test = first + count;
+#if DEBUG_SPY
+        TRACE("first=%p, last=%p, test=%p, t-value=%d, code=%d, count=%d\n",
+           first, last, test, test->value, code, count);
+#endif
+        if (test->value == code) return test;
+        if (test->value < code)
+            last = test - 1;
+        else
+            first = test + 1;
+    }
+    return NULL;
+}
+
+/***********************************************************************
+ *           SPY_DumpMem
+ */
+static void SPY_DumpMem (LPCSTR header, const UINT *q, INT len)
+{
+    int i;
+
+    for(i=0; i<len-12; i+=16) {
+        TRACE("%s [%04x] %08x %08x %08x %08x\n",
+              header, i, *q, *(q+1), *(q+2), *(q+3));
+        q += 4;
+    }
+    switch ((len - i + 3) & (~3)) {
+    case 16:
+        TRACE("%s [%04x] %08x %08x %08x %08x\n",
+              header, i, *q, *(q+1), *(q+2), *(q+3));
+        break;
+    case 12:
+        TRACE("%s [%04x] %08x %08x %08x\n",
+              header, i, *q, *(q+1), *(q+2));
+        break;
+    case 8:
+        TRACE("%s [%04x] %08x %08x\n",
+              header, i, *q, *(q+1));
+        break;
+    case 4:
+        TRACE("%s [%04x] %08x\n",
+              header, i, *q);
+        break;
+    default:
+        break;
+    }
+}
+
+/***********************************************************************
+ *           SPY_DumpStructure
+ */
+static void SPY_DumpStructure(const SPY_INSTANCE *sp_e, BOOL enter)
+{
+    switch (sp_e->msgnum)
+        {
+        case LVM_INSERTITEMW:
+        case LVM_INSERTITEMA:
+        case LVM_SETITEMW:
+        case LVM_SETITEMA:
+            if (!enter) break;
+            /* fall through */
+        case LVM_GETITEMW:
+        case LVM_GETITEMA:
+            {
+                LPLVITEMA item = (LPLVITEMA) sp_e->lParam;
+                if (item) {
+                    SPY_DumpMem ("LVITEM", (UINT*)item, sizeof(LVITEMA));
+                }
+                break;
+            }
+        case TCM_INSERTITEMW:
+        case TCM_INSERTITEMA:
+        case TCM_SETITEMW:
+        case TCM_SETITEMA:
+            if (!enter) break;
+            /* fall through */
+        case TCM_GETITEMW:
+        case TCM_GETITEMA:
+            {
+                TCITEMA *item = (TCITEMA *) sp_e->lParam;
+                if (item) {
+                    SPY_DumpMem ("TCITEM", (UINT*)item, sizeof(TCITEMA));
+                }
+                break;
+            }
+        case TCM_ADJUSTRECT:
+        case LVM_GETITEMRECT:
+        case LVM_GETSUBITEMRECT:
+            {
+                LPRECT rc = (LPRECT) sp_e->lParam;
+                if (rc) {
+                    TRACE("lParam rect (%ld,%ld)-(%ld,%ld)\n",
+                          rc->left, rc->top, rc->right, rc->bottom);
+                }
+                break;
+            }
+        case LVM_SETITEMPOSITION32:
+            if (!enter) break;
+            /* fall through */
+        case LVM_GETITEMPOSITION:
+        case LVM_GETORIGIN:
+            {
+                LPPOINT point = (LPPOINT) sp_e->lParam;
+                if (point) {
+                    TRACE("lParam point x=%ld, y=%ld\n", point->x, point->y);
+                }
+                break;
+            }
+        case SBM_SETRANGE:
+            if (!enter && (sp_e->msgnum == SBM_SETRANGE)) break;
+            TRACE("min=%d max=%d\n", (INT)sp_e->wParam, (INT)sp_e->lParam);
+            break;
+        case SBM_GETRANGE:
+            if ((enter && (sp_e->msgnum == SBM_GETRANGE)) ||
+                (!enter && (sp_e->msgnum == SBM_SETRANGE))) break;
+            {
+                LPINT ptmin = (LPINT) sp_e->wParam;
+                LPINT ptmax = (LPINT) sp_e->lParam;
+                if (ptmin && ptmax)
+                    TRACE("min=%d max=%d\n", *ptmin, *ptmax);
+                else if (ptmin)
+                    TRACE("min=%d max=n/a\n", *ptmin);
+                else if (ptmax)
+                    TRACE("min=n/a max=%d\n", *ptmax);
+                break;
+            }
+        case EM_EXSETSEL:
+            if (enter && sp_e->lParam)
+            {
+                CHARRANGE *cr = (CHARRANGE *) sp_e->lParam;
+                TRACE("CHARRANGE: cpMin=%ld cpMax=%ld\n", cr->cpMin, cr->cpMax);
+            }
+            break;
+        case EM_SETCHARFORMAT:
+            if (enter && sp_e->lParam)
+            {
+                CHARFORMATW *cf = (CHARFORMATW *) sp_e->lParam;
+                TRACE("CHARFORMAT: dwMask=0x%08lx dwEffects=", cf->dwMask);
+                if ((cf->dwMask & CFM_BOLD) && (cf->dwEffects & CFE_BOLD))
+                    TRACE(" CFE_BOLD");
+                if ((cf->dwMask & CFM_COLOR) && (cf->dwEffects & CFE_AUTOCOLOR))
+                    TRACE(" CFE_AUTOCOLOR");
+                if ((cf->dwMask & CFM_ITALIC) && (cf->dwEffects & CFE_ITALIC))
+                    TRACE(" CFE_ITALIC");
+                if ((cf->dwMask & CFM_PROTECTED) && (cf->dwEffects & CFE_PROTECTED))
+                    TRACE(" CFE_PROTECTED");
+                if ((cf->dwMask & CFM_STRIKEOUT) && (cf->dwEffects & CFE_STRIKEOUT))
+                    TRACE(" CFE_STRIKEOUT");
+                if ((cf->dwMask & CFM_UNDERLINE) && (cf->dwEffects & CFE_UNDERLINE))
+                    TRACE(" CFE_UNDERLINE");
+                TRACE("\n");
+                if (cf->dwMask & CFM_SIZE)
+                    TRACE("yHeight=%ld\n", cf->yHeight);
+                if (cf->dwMask & CFM_OFFSET)
+                    TRACE("yOffset=%ld\n", cf->yOffset);
+                if ((cf->dwMask & CFM_COLOR) && !(cf->dwEffects & CFE_AUTOCOLOR))
+                    TRACE("crTextColor=%lx\n", cf->crTextColor);
+                TRACE("bCharSet=%x bPitchAndFamily=%x\n", cf->bCharSet, cf->bPitchAndFamily);
+                /* FIXME: we should try to be a bit more intelligent about
+                 * whether this is in ANSI or Unicode (it could be either) */
+                if (cf->dwMask & CFM_FACE)
+                    TRACE("szFaceName=%s\n", debugstr_wn(cf->szFaceName, LF_FACESIZE));
+                /* FIXME: handle CHARFORMAT2 too */
+            }
+            break;
+        case WM_DRAWITEM:
+            if (!enter) break;
+            {
+                DRAWITEMSTRUCT *lpdis = (DRAWITEMSTRUCT*) sp_e->lParam;
+                TRACE("DRAWITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n",
+                      lpdis->CtlType, lpdis->CtlID);
+                TRACE("itemID=0x%08x itemAction=0x%08x itemState=0x%08x\n",
+                      lpdis->itemID, lpdis->itemAction, lpdis->itemState);
+                TRACE("hWnd=%p hDC=%p (%ld,%ld)-(%ld,%ld) itemData=0x%08lx\n",
+                      lpdis->hwndItem, lpdis->hDC, lpdis->rcItem.left,
+                      lpdis->rcItem.top, lpdis->rcItem.right,
+                      lpdis->rcItem.bottom, lpdis->itemData);
+            }
+            break;
+        case WM_MEASUREITEM:
+            {
+                MEASUREITEMSTRUCT *lpmis = (MEASUREITEMSTRUCT*) sp_e->lParam;
+                TRACE("MEASUREITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n",
+                      lpmis->CtlType, lpmis->CtlID);
+                TRACE("itemID=0x%08x itemWidth=0x%08x itemHeight=0x%08x\n",
+                      lpmis->itemID, lpmis->itemWidth, lpmis->itemHeight);
+                TRACE("itemData=0x%08lx\n", lpmis->itemData);
+            }
+            break;
+        case WM_SIZE:
+            if (!enter) break;
+            TRACE("cx=%d cy=%d\n", LOWORD(sp_e->lParam), HIWORD(sp_e->lParam));
+            break;
+        case WM_WINDOWPOSCHANGED:
+            if (!enter) break;
+        case WM_WINDOWPOSCHANGING:
+            {
+                WINDOWPOS *lpwp = (WINDOWPOS *)sp_e->lParam;
+                TRACE("WINDOWPOS hwnd=%p, after=%p, at (%d,%d) w=%d h=%d, flags=0x%08x\n",
+                      lpwp->hwnd, lpwp->hwndInsertAfter, lpwp->x, lpwp->y,
+                      lpwp->cx, lpwp->cy, lpwp->flags);
+            }
+            break;
+        case WM_STYLECHANGED:
+            if (!enter) break;
+        case WM_STYLECHANGING:
+            {
+                LPSTYLESTRUCT ss = (LPSTYLESTRUCT) sp_e->lParam;
+                TRACE("STYLESTRUCT: StyleOld=0x%08lx, StyleNew=0x%08lx\n",
+                      ss->styleOld, ss->styleNew);
+            }
+            break;
+        case WM_NCCALCSIZE:
+            {
+                RECT *rc = (RECT *)sp_e->lParam;
+                TRACE("Rect (%ld,%ld)-(%ld,%ld)\n",
+                      rc->left, rc->top, rc->right, rc->bottom);
+            }
+            break;
+        case WM_NOTIFY:
+            /* if (!enter) break; */
+            {
+                NMHDR * pnmh = (NMHDR*) sp_e->lParam;
+                UINT *q, dumplen;
+                const SPY_NOTIFY *p;
+                WCHAR from_class[60];
+                DWORD save_error;
+
+                p = SPY_Bsearch_Notify (&spnfy_array[0], end_spnfy_array,
+                                        pnmh->code);
+                if (p) {
+                    TRACE("NMHDR hwndFrom=%p idFrom=0x%08x code=%s<0x%08x>, extra=0x%x\n",
+                          pnmh->hwndFrom, pnmh->idFrom, p->name, pnmh->code, p->len);
+                    dumplen = p->len;
+
+                    /* for CUSTOMDRAW, dump all the data for TOOLBARs */
+                    if (pnmh->code == NM_CUSTOMDRAW) {
+                        /* save and restore error code over the next call */
+                        save_error = GetLastError();
+                        GetClassNameW(pnmh->hwndFrom, from_class,
+                                      sizeof(from_class)/sizeof(WCHAR));
+                        SetLastError(save_error);
+                        if (strcmpW(TOOLBARCLASSNAMEW, from_class) == 0)
+                            dumplen = sizeof(NMTBCUSTOMDRAW)-sizeof(NMHDR);
+                    } else if ((pnmh->code >= HDN_ITEMCHANGINGA) && (pnmh->code <= HDN_ENDDRAG)) {
+                        dumplen = sizeof(NMHEADERA)-sizeof(NMHDR);
+                    }
+                    if (dumplen > 0) {
+                        q = (UINT *)(pnmh + 1);
+                        SPY_DumpMem ("NM extra", q, (INT)dumplen);
+                    }
+                }
+                else
+                    TRACE("NMHDR hwndFrom=%p idFrom=0x%08x code=0x%08x\n",
+                          pnmh->hwndFrom, pnmh->idFrom, pnmh->code);
+            }
+        default:
+            if (sp_e->data_len > 0)
+                SPY_DumpMem ("MSG lParam", (UINT *)sp_e->lParam, sp_e->data_len);
+            break;
+        }
+
+}
+/***********************************************************************
+ *           SPY_EnterMessage
+ */
+void SPY_EnterMessage( INT iFlag, HWND hWnd, UINT msg,
+                       WPARAM wParam, LPARAM lParam )
+{
+    SPY_INSTANCE sp_e;
+    int indent;
+
+    if (!TRACE_ON(message) || SPY_EXCLUDE(msg)) return;
+
+    sp_e.msgnum = msg;
+    sp_e.msg_hwnd = hWnd;
+    sp_e.lParam = lParam;
+    sp_e.wParam = wParam;
+    SPY_GetWndName(&sp_e);
+    SPY_GetMsgStuff(&sp_e);
+    indent = get_indent_level();
+
+    /* each SPY_SENDMESSAGE must be complemented by call to SPY_ExitMessage */
+    switch(iFlag)
+    {
+#ifndef __REACTOS__
+    case SPY_DISPATCHMESSAGE16:
+        TRACE("%*s(%04x) %-16s message [%04x] %s dispatched  wp=%04x lp=%08lx\n",
+              indent, "", HWND_16(hWnd),
+              debugstr_w(sp_e.wnd_name), msg, sp_e.msg_name, wParam, lParam);
+        break;
+#endif
+    case SPY_DISPATCHMESSAGE:
+        TRACE("%*s(%p) %-16s message [%04x] %s dispatched  wp=%08x lp=%08lx\n",
+                        indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
+                        sp_e.msg_name, wParam, lParam);
+        break;
+
+//    case SPY_SENDMESSAGE16:
+    case SPY_SENDMESSAGE:
+        {
+            char taskName[20];
+            DWORD tid = GetWindowThreadProcessId( hWnd, NULL );
+
+            if (tid == GetCurrentThreadId()) strcpy( taskName, "self" );
+            else sprintf( taskName, "tid %04lx", GetCurrentThreadId() );
+#ifndef __REACTOS__
+            if (iFlag == SPY_SENDMESSAGE16)
+                TRACE("%*s(%04x) %-16s message [%04x] %s sent from %s wp=%04x lp=%08lx\n",
+                      indent, "", HWND_16(hWnd), debugstr_w(sp_e.wnd_name), msg,
+                      sp_e.msg_name, taskName, wParam, lParam );
+            else
+#endif
+            {   TRACE("%*s(%p) %-16s message [%04x] %s sent from %s wp=%08x lp=%08lx\n",
+                             indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
+                             sp_e.msg_name, taskName, wParam, lParam );
+                SPY_DumpStructure(&sp_e, TRUE);
+            }
+        }
+        break;
+
+#ifndef __REACTOS__
+    case SPY_DEFWNDPROC16:
+        if( SPY_ExcludeDWP ) return;
+        TRACE("%*s(%04x)  DefWindowProc16: %s [%04x]  wp=%04x lp=%08lx\n",
+              indent, "", HWND_16(hWnd), sp_e.msg_name, msg, wParam, lParam );
+        break;
+#endif
+
+    case SPY_DEFWNDPROC:
+        if( SPY_ExcludeDWP ) return;
+        TRACE("%*s(%p)  DefWindowProc32: %s [%04x]  wp=%08x lp=%08lx\n",
+                        indent, "", hWnd, sp_e.msg_name,
+                        msg, wParam, lParam );
+        break;
+    }
+    set_indent_level( indent + SPY_INDENT_UNIT );
+}
+
+
+/***********************************************************************
+ *           SPY_ExitMessage
+ */
+void SPY_ExitMessage( INT iFlag, HWND hWnd, UINT msg, LRESULT lReturn,
+                       WPARAM wParam, LPARAM lParam )
+{
+    SPY_INSTANCE sp_e;
+    int indent;
+
+    if (!TRACE_ON(message) || SPY_EXCLUDE(msg) ||
+        (SPY_ExcludeDWP && (/*iFlag == SPY_RESULT_DEFWND16 || */iFlag == SPY_RESULT_DEFWND)) )
+        return;
+
+    sp_e.msgnum = msg;
+    sp_e.msg_hwnd   = hWnd;
+    sp_e.lParam = lParam;
+    sp_e.wParam = wParam;
+    SPY_GetWndName(&sp_e);
+    SPY_GetMsgStuff(&sp_e);
+
+    if ((indent = get_indent_level()))
+    {
+        indent -= SPY_INDENT_UNIT;
+        set_indent_level( indent );
+    }
+
+    switch(iFlag)
+    {
+#ifndef __REACTOS__
+    case SPY_RESULT_DEFWND16:
+        TRACE(" %*s(%04x)  DefWindowProc16: %s [%04x] returned %08lx\n",
+              indent, "", HWND_16(hWnd), sp_e.msg_name, msg, lReturn );
+        break;
+#endif
+
+    case SPY_RESULT_DEFWND:
+        TRACE(" %*s(%p)  DefWindowProc32: %s [%04x] returned %08lx\n",
+                        indent, "", hWnd, sp_e.msg_name, msg, lReturn );
+        break;
+
+#ifndef __REACTOS__
+    case SPY_RESULT_OK16:
+        TRACE(" %*s(%04x) %-16s message [%04x] %s returned %08lx\n",
+              indent, "", HWND_16(hWnd), debugstr_w(sp_e.wnd_name), msg,
+              sp_e.msg_name, lReturn );
+        break;
+#endif
+
+    case SPY_RESULT_OK:
+        TRACE(" %*s(%p) %-16s message [%04x] %s returned %08lx\n",
+                        indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
+                        sp_e.msg_name, lReturn );
+        SPY_DumpStructure(&sp_e, FALSE);
+        break;
+
+#ifndef __REACTOS__
+    case SPY_RESULT_INVALIDHWND16:
+        WARN(" %*s(%04x) %-16s message [%04x] %s HAS INVALID HWND\n",
+             indent, "", HWND_16(hWnd), debugstr_w(sp_e.wnd_name), msg, sp_e.msg_name );
+        break;
+#endif
+
+    case SPY_RESULT_INVALIDHWND:
+        WARN(" %*s(%p) %-16s message [%04x] %s HAS INVALID HWND\n",
+                        indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
+                        sp_e.msg_name );
+        break;
+   }
+}
+
+
+/***********************************************************************
+ *           SPY_Init
+ */
+int SPY_Init(void)
+{
+    int i, j;
+    char buffer[1024];
+    const SPY_NOTIFY *p;
+    const USER_MSG *q;
+    HKEY hkey;
+
+    if (!TRACE_ON(message)) return TRUE;
+
+    indent_tls_index = TlsAlloc();
+    /* @@ Wine registry key: HKCU\Software\Wine\Debug */
+    if(!RegOpenKeyA(HKEY_CURRENT_USER, "Software\\ReactOS\\Debug", &hkey))
+    {
+        DWORD type, count = sizeof(buffer);
+
+        buffer[0] = 0;
+        if (!RegQueryValueExA(hkey, "SpyInclude", 0, &type, (LPBYTE) buffer, &count) &&
+            strcmp( buffer, "INCLUDEALL" ))
+        {
+            TRACE("Include=%s\n", buffer );
+            for (i = 0; i <= SPY_MAX_MSGNUM; i++)
+                SPY_Exclude[i] = (MessageTypeNames[i] && !strstr(buffer,MessageTypeNames[i]));
+        }
+
+        count = sizeof(buffer);
+        buffer[0] = 0;
+        if (!RegQueryValueExA(hkey, "SpyExclude", 0, &type, (LPBYTE) buffer, &count))
+        {
+            TRACE("Exclude=%s\n", buffer );
+            if (!strcmp( buffer, "EXCLUDEALL" ))
+                for (i = 0; i <= SPY_MAX_MSGNUM; i++) SPY_Exclude[i] = TRUE;
+            else
+                for (i = 0; i <= SPY_MAX_MSGNUM; i++)
+                    SPY_Exclude[i] = (MessageTypeNames[i] && strstr(buffer,MessageTypeNames[i]));
+        }
+
+        SPY_ExcludeDWP = 0;
+        count = sizeof(buffer);
+        if(!RegQueryValueExA(hkey, "SpyExcludeDWP", 0, &type, (LPBYTE) buffer, &count))
+            SPY_ExcludeDWP = atoi(buffer);
+
+        RegCloseKey(hkey);
+    }
+
+    /* find last good entry in spy notify array and save addr for b-search */
+    p = &spnfy_array[0];
+    j = 0xffffffff;
+    while (p->name) {
+        if ((UINT)p->value > (UINT)j) {
+            ERR("Notify message array out of order\n");
+            ERR("  between values [%08x] %s and [%08x] %s\n",
+                j, (p-1)->name, p->value, p->name);
+            break;
+        }
+        j = p->value;
+        p++;
+    }
+    p--;
+    end_spnfy_array = p;
+
+    /* find last good entry in each common control message array
+     *  and save addr for b-search.
+     */
+    i = 0;
+    while (cc_array[i].classname) {
+
+        j = 0x0400; /* minimum entry in array */
+        q = cc_array[i].classmsg;
+        while(q->name) {
+            if (q->value <= j) {
+                ERR("Class message array out of order for class %s\n",
+                    debugstr_w(cc_array[i].classname));
+                ERR("  between values [%04x] %s and [%04x] %s\n",
+                    j, (q-1)->name, q->value, q->name);
+                break;
+            }
+            j = q->value;
+            q++;
+        }
+        q--;
+        cc_array[i].lastmsg = (USER_MSG *)q;
+
+        i++;
+    }
+
+    return 1;
+}