ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

spy.c
Go to the documentation of this file.
00001 /*
00002  * Message spying routines
00003  *
00004  * Copyright 1994, Bob Amstadt
00005  *           1995, Alex Korobka
00006  *
00007  * This library is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU Lesser General Public
00009  * License as published by the Free Software Foundation; either
00010  * version 2.1 of the License, or (at your option) any later version.
00011  *
00012  * This library is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  * Lesser General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU Lesser General Public
00018  * License along with this library; if not, write to the Free Software
00019  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
00020  */
00021 
00022 #include <user32.h>
00023 #include <commctrl.h>
00024 #include <richedit.h>
00025 #include <prsht.h>
00026 
00027 #include <wine/debug.h>
00028 
00029 WINE_DEFAULT_DEBUG_CHANNEL(message);
00030 
00031 #define SPY_MAX_MSGNUM   WM_USER
00032 #define SPY_INDENT_UNIT  4  /* 4 spaces */
00033 
00034 #define DEBUG_SPY 0
00035 
00036 static const char * const ClassLongOffsetNames[] =
00037 {
00038     "GCLP_MENUNAME",      /*  -8 */
00039     "GCLP_HBRBACKGROUND", /* -10 */
00040     "GCLP_HCURSOR",       /* -12 */
00041     "GCLP_HICON",         /* -14 */
00042     "GCLP_HMODULE",       /* -16 */
00043     "GCL_CBWNDEXTRA",     /* -18 */
00044     "GCL_CBCLSEXTRA",     /* -20 */
00045     "?",
00046     "GCLP_WNDPROC",       /* -24 */
00047     "GCL_STYLE",          /* -26 */
00048     "?",
00049     "?",
00050     "GCW_ATOM",           /* -32 */
00051     "GCLP_HICONSM",       /* -34 */
00052 };
00053 
00054 static const char * const MessageTypeNames[SPY_MAX_MSGNUM + 1] =
00055 {
00056     "WM_NULL",                  /* 0x00 */
00057     "WM_CREATE",
00058     "WM_DESTROY",
00059     "WM_MOVE",
00060     "wm_sizewait",
00061     "WM_SIZE",
00062     "WM_ACTIVATE",
00063     "WM_SETFOCUS",
00064     "WM_KILLFOCUS",
00065     "WM_SETVISIBLE",
00066     "WM_ENABLE",
00067     "WM_SETREDRAW",
00068     "WM_SETTEXT",
00069     "WM_GETTEXT",
00070     "WM_GETTEXTLENGTH",
00071     "WM_PAINT",
00072     "WM_CLOSE",                 /* 0x10 */
00073     "WM_QUERYENDSESSION",
00074     "WM_QUIT",
00075     "WM_QUERYOPEN",
00076     "WM_ERASEBKGND",
00077     "WM_SYSCOLORCHANGE",
00078     "WM_ENDSESSION",
00079     "wm_systemerror",
00080     "WM_SHOWWINDOW",
00081     "WM_CTLCOLOR",
00082     "WM_WININICHANGE",
00083     "WM_DEVMODECHANGE",
00084     "WM_ACTIVATEAPP",
00085     "WM_FONTCHANGE",
00086     "WM_TIMECHANGE",
00087     "WM_CANCELMODE",
00088     "WM_SETCURSOR",             /* 0x20 */
00089     "WM_MOUSEACTIVATE",
00090     "WM_CHILDACTIVATE",
00091     "WM_QUEUESYNC",
00092     "WM_GETMINMAXINFO",
00093     "wm_unused3",
00094     "wm_painticon",
00095     "WM_ICONERASEBKGND",
00096     "WM_NEXTDLGCTL",
00097     "wm_alttabactive",
00098     "WM_SPOOLERSTATUS",
00099     "WM_DRAWITEM",
00100     "WM_MEASUREITEM",
00101     "WM_DELETEITEM",
00102     "WM_VKEYTOITEM",
00103     "WM_CHARTOITEM",
00104     "WM_SETFONT",               /* 0x30 */
00105     "WM_GETFONT",
00106     "WM_SETHOTKEY",
00107     "WM_GETHOTKEY",
00108     "wm_filesyschange",
00109     "wm_isactiveicon",
00110     "wm_queryparkicon",
00111     "WM_QUERYDRAGICON",
00112     "wm_querysavestate",
00113     "WM_COMPAREITEM",
00114     "wm_testing",
00115     NULL,
00116     NULL,
00117     "WM_GETOBJECT",             /* 0x3d */
00118     "wm_activateshellwindow",
00119     NULL,
00120 
00121     NULL,                       /* 0x40 */
00122     "wm_compacting", NULL, NULL,
00123     "WM_COMMNOTIFY", NULL,
00124     "WM_WINDOWPOSCHANGING",     /* 0x0046 */
00125     "WM_WINDOWPOSCHANGED",      /* 0x0047 */
00126     "WM_POWER", NULL,
00127     "WM_COPYDATA",
00128     "WM_CANCELJOURNAL", NULL, NULL,
00129     "WM_NOTIFY", NULL,
00130 
00131     /* 0x0050 */
00132     "WM_INPUTLANGCHANGEREQUEST",
00133     "WM_INPUTLANGCHANGE",
00134     "WM_TCARD",
00135     "WM_HELP",
00136     "WM_USERCHANGED",
00137     "WM_NOTIFYFORMAT", NULL, NULL,
00138     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00139 
00140     /* 0x0060 */
00141     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00142     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00143 
00144     /* 0x0070 */
00145     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00146     NULL, NULL, NULL,
00147     "WM_CONTEXTMENU",
00148     "WM_STYLECHANGING",
00149     "WM_STYLECHANGED",
00150     "WM_DISPLAYCHANGE",
00151     "WM_GETICON",
00152 
00153     "WM_SETICON",               /* 0x0080 */
00154     "WM_NCCREATE",              /* 0x0081 */
00155     "WM_NCDESTROY",             /* 0x0082 */
00156     "WM_NCCALCSIZE",            /* 0x0083 */
00157     "WM_NCHITTEST",             /* 0x0084 */
00158     "WM_NCPAINT",               /* 0x0085 */
00159     "WM_NCACTIVATE",            /* 0x0086 */
00160     "WM_GETDLGCODE",            /* 0x0087 */
00161     "WM_SYNCPAINT",
00162     "WM_SYNCTASK", NULL, NULL, NULL, NULL, NULL, NULL,
00163 
00164     /* 0x0090 */
00165     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00166     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00167 
00168     /* 0x00A0 */
00169     "WM_NCMOUSEMOVE",           /* 0x00a0 */
00170     "WM_NCLBUTTONDOWN",         /* 0x00a1 */
00171     "WM_NCLBUTTONUP",           /* 0x00a2 */
00172     "WM_NCLBUTTONDBLCLK",       /* 0x00a3 */
00173     "WM_NCRBUTTONDOWN",         /* 0x00a4 */
00174     "WM_NCRBUTTONUP",           /* 0x00a5 */
00175     "WM_NCRBUTTONDBLCLK",       /* 0x00a6 */
00176     "WM_NCMBUTTONDOWN",         /* 0x00a7 */
00177     "WM_NCMBUTTONUP",           /* 0x00a8 */
00178     "WM_NCMBUTTONDBLCLK",       /* 0x00a9 */
00179     NULL,                       /* 0x00aa */
00180     "WM_NCXBUTTONDOWN",         /* 0x00ab */
00181     "WM_NCXBUTTONUP",           /* 0x00ac */
00182     "WM_NCXBUTTONDBLCLK",       /* 0x00ad */
00183     NULL,                       /* 0x00ae */
00184     NULL,                       /* 0x00af */
00185 
00186     /* 0x00B0 - Win32 Edit controls */
00187     "EM_GETSEL",                /* 0x00b0 */
00188     "EM_SETSEL",                /* 0x00b1 */
00189     "EM_GETRECT",               /* 0x00b2 */
00190     "EM_SETRECT",               /* 0x00b3 */
00191     "EM_SETRECTNP",             /* 0x00b4 */
00192     "EM_SCROLL",                /* 0x00b5 */
00193     "EM_LINESCROLL",            /* 0x00b6 */
00194     "EM_SCROLLCARET",           /* 0x00b7 */
00195     "EM_GETMODIFY",             /* 0x00b8 */
00196     "EM_SETMODIFY",             /* 0x00b9 */
00197     "EM_GETLINECOUNT",          /* 0x00ba */
00198     "EM_LINEINDEX",             /* 0x00bb */
00199     "EM_SETHANDLE",             /* 0x00bc */
00200     "EM_GETHANDLE",             /* 0x00bd */
00201     "EM_GETTHUMB",              /* 0x00be */
00202     NULL,                       /* 0x00bf */
00203 
00204     NULL,                       /* 0x00c0 */
00205     "EM_LINELENGTH",            /* 0x00c1 */
00206     "EM_REPLACESEL",            /* 0x00c2 */
00207     NULL,                       /* 0x00c3 */
00208     "EM_GETLINE",               /* 0x00c4 */
00209     "EM_LIMITTEXT",             /* 0x00c5 */
00210     "EM_CANUNDO",               /* 0x00c6 */
00211     "EM_UNDO",                  /* 0x00c7 */
00212     "EM_FMTLINES",              /* 0x00c8 */
00213     "EM_LINEFROMCHAR",          /* 0x00c9 */
00214     NULL,                       /* 0x00ca */
00215     "EM_SETTABSTOPS",           /* 0x00cb */
00216     "EM_SETPASSWORDCHAR",       /* 0x00cc */
00217     "EM_EMPTYUNDOBUFFER",       /* 0x00cd */
00218     "EM_GETFIRSTVISIBLELINE",   /* 0x00ce */
00219     "EM_SETREADONLY",           /* 0x00cf */
00220 
00221     "EM_SETWORDBREAKPROC",      /* 0x00d0 */
00222     "EM_GETWORDBREAKPROC",      /* 0x00d1 */
00223     "EM_GETPASSWORDCHAR",       /* 0x00d2 */
00224     "EM_SETMARGINS",            /* 0x00d3 */
00225     "EM_GETMARGINS",            /* 0x00d4 */
00226     "EM_GETLIMITTEXT",          /* 0x00d5 */
00227     "EM_POSFROMCHAR",           /* 0x00d6 */
00228     "EM_CHARFROMPOS",           /* 0x00d7 */
00229     "EM_SETIMESTATUS",          /* 0x00d8 */
00230     "EM_GETIMESTATUS",          /* 0x00d9 */
00231     NULL, NULL, NULL, NULL, NULL, NULL,
00232 
00233     /* 0x00E0 - Win32 Scrollbars */
00234     "SBM_SETPOS",               /* 0x00e0 */
00235     "SBM_GETPOS",               /* 0x00e1 */
00236     "SBM_SETRANGE",             /* 0x00e2 */
00237     "SBM_GETRANGE",             /* 0x00e3 */
00238     "SBM_ENABLE_ARROWS",        /* 0x00e4 */
00239     NULL,
00240     "SBM_SETRANGEREDRAW",       /* 0x00e6 */
00241     NULL, NULL,
00242     "SBM_SETSCROLLINFO",        /* 0x00e9 */
00243     "SBM_GETSCROLLINFO",        /* 0x00ea */
00244     NULL, NULL, NULL, NULL, NULL,
00245 
00246     /* 0x00F0 - Win32 Buttons */
00247     "BM_GETCHECK",              /* 0x00f0 */
00248     "BM_SETCHECK",              /* 0x00f1 */
00249     "BM_GETSTATE",              /* 0x00f2 */
00250     "BM_SETSTATE",              /* 0x00f3 */
00251     "BM_SETSTYLE",              /* 0x00f4 */
00252     "BM_CLICK",                 /* 0x00f5 */
00253     "BM_GETIMAGE",              /* 0x00f6 */
00254     "BM_SETIMAGE",              /* 0x00f7 */
00255     NULL, NULL, NULL, NULL, NULL, NULL,
00256     "WM_INPUT_DEVICE_CHANGE",   /* 0x00fe */
00257     "WM_INPUT",                 /* 0x00ff */
00258 
00259     "WM_KEYDOWN",               /* 0x0100 */
00260     "WM_KEYUP",                 /* 0x0101 */
00261     "WM_CHAR",                  /* 0x0102 */
00262     "WM_DEADCHAR",              /* 0x0103 */
00263     "WM_SYSKEYDOWN",            /* 0x0104 */
00264     "WM_SYSKEYUP",              /* 0x0105 */
00265     "WM_SYSCHAR",               /* 0x0106 */
00266     "WM_SYSDEADCHAR",           /* 0x0107 */
00267     "WM_KEYLAST",               /* 0x0108 */
00268     "WM_UNICHAR",               /* 0x0109 */
00269     "WM_CONVERTREQUEST",        /* 0x010a */
00270     "WM_CONVERTRESULT",         /* 0x010b */
00271     "WM_INTERIM",               /* 0x010c */
00272     "WM_IME_STARTCOMPOSITION",  /* 0x010d */
00273     "WM_IME_ENDCOMPOSITION",    /* 0x010e */
00274     "WM_IME_COMPOSITION",       /* 0x010f */
00275 
00276     "WM_INITDIALOG",            /* 0x0110 */
00277     "WM_COMMAND",               /* 0x0111 */
00278     "WM_SYSCOMMAND",            /* 0x0112 */
00279     "WM_TIMER",                 /* 0x0113 */
00280     "WM_HSCROLL",               /* 0x0114 */
00281     "WM_VSCROLL",               /* 0x0115 */
00282     "WM_INITMENU",              /* 0x0116 */
00283     "WM_INITMENUPOPUP",         /* 0x0117 */
00284     "WM_SYSTIMER",              /* 0x0118 */
00285     NULL, NULL, NULL, NULL, NULL, NULL,
00286     "WM_MENUSELECT",            /* 0x011f */
00287 
00288     "WM_MENUCHAR",              /* 0x0120 */
00289     "WM_ENTERIDLE",             /* 0x0121 */
00290 
00291     "WM_MENURBUTTONUP",         /* 0x0122 */
00292     "WM_MENUDRAG",              /* 0x0123 */
00293     "WM_MENUGETOBJECT",         /* 0x0124 */
00294     "WM_UNINITMENUPOPUP",       /* 0x0125 */
00295     "WM_MENUCOMMAND",           /* 0x0126 */
00296     "WM_CHANGEUISTATE",         /* 0x0127 */
00297     "WM_UPDATEUISTATE",         /* 0x0128 */
00298     "WM_QUERYUISTATE",          /* 0x0129 */
00299 
00300     NULL, NULL, NULL, NULL, NULL, NULL,
00301 
00302     /* 0x0130 */
00303     NULL,
00304     "WM_LBTRACKPOINT",          /* 0x0131 */
00305     "WM_CTLCOLORMSGBOX",        /* 0x0132 */
00306     "WM_CTLCOLOREDIT",          /* 0x0133 */
00307     "WM_CTLCOLORLISTBOX",       /* 0x0134 */
00308     "WM_CTLCOLORBTN",           /* 0x0135 */
00309     "WM_CTLCOLORDLG",           /* 0x0136 */
00310     "WM_CTLCOLORSCROLLBAR",     /* 0x0137 */
00311     "WM_CTLCOLORSTATIC",        /* 0x0138 */
00312     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00313 
00314     /* 0x0140 - Win32 Comboboxes */
00315     "CB_GETEDITSEL",            /* 0x0140 */
00316     "CB_LIMITTEXT",             /* 0x0141 */
00317     "CB_SETEDITSEL",            /* 0x0142 */
00318     "CB_ADDSTRING",             /* 0x0143 */
00319     "CB_DELETESTRING",          /* 0x0144 */
00320     "CB_DIR",                   /* 0x0145 */
00321     "CB_GETCOUNT",              /* 0x0146 */
00322     "CB_GETCURSEL",             /* 0x0147 */
00323     "CB_GETLBTEXT",             /* 0x0148 */
00324     "CB_GETLBTEXTLEN",          /* 0x0149 */
00325     "CB_INSERTSTRING",          /* 0x014a */
00326     "CB_RESETCONTENT",          /* 0x014b */
00327     "CB_FINDSTRING",            /* 0x014c */
00328     "CB_SELECTSTRING",          /* 0x014d */
00329     "CB_SETCURSEL",             /* 0x014e */
00330     "CB_SHOWDROPDOWN",          /* 0x014f */
00331 
00332     "CB_GETITEMDATA",           /* 0x0150 */
00333     "CB_SETITEMDATA",           /* 0x0151 */
00334     "CB_GETDROPPEDCONTROLRECT", /* 0x0152 */
00335     "CB_SETITEMHEIGHT",         /* 0x0153 */
00336     "CB_GETITEMHEIGHT",         /* 0x0154 */
00337     "CB_SETEXTENDEDUI",         /* 0x0155 */
00338     "CB_GETEXTENDEDUI",         /* 0x0156 */
00339     "CB_GETDROPPEDSTATE",       /* 0x0157 */
00340     "CB_FINDSTRINGEXACT",       /* 0x0158 */
00341     "CB_SETLOCALE",             /* 0x0159 */
00342     "CB_GETLOCALE",             /* 0x015a */
00343     "CB_GETTOPINDEX",           /* 0x015b */
00344     "CB_SETTOPINDEX",           /* 0x015c */
00345     "CB_GETHORIZONTALEXTENT",   /* 0x015d */
00346     "CB_SETHORIZONTALEXTENT",   /* 0x015e */
00347     "CB_GETDROPPEDWIDTH",       /* 0x015f */
00348 
00349     "CB_SETDROPPEDWIDTH",       /* 0x0160 */
00350     "CB_INITSTORAGE",           /* 0x0161 */
00351     NULL, NULL, NULL, NULL, NULL, NULL,
00352     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00353 
00354     /* 0x0170 - Win32 Static controls */
00355     "STM_SETICON",              /* 0x0170 */
00356     "STM_GETICON",              /* 0x0171 */
00357     "STM_SETIMAGE",             /* 0x0172 */
00358     "STM_GETIMAGE",             /* 0x0173 */
00359     NULL, NULL, NULL, NULL,
00360     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00361 
00362     /* 0x0180 - Win32 Listboxes */
00363     "LB_ADDSTRING",             /* 0x0180 */
00364     "LB_INSERTSTRING",          /* 0x0181 */
00365     "LB_DELETESTRING",          /* 0x0182 */
00366     "LB_SELITEMRANGEEX",        /* 0x0183 */
00367     "LB_RESETCONTENT",          /* 0x0184 */
00368     "LB_SETSEL",                /* 0x0185 */
00369     "LB_SETCURSEL",             /* 0x0186 */
00370     "LB_GETSEL",                /* 0x0187 */
00371     "LB_GETCURSEL",             /* 0x0188 */
00372     "LB_GETTEXT",               /* 0x0189 */
00373     "LB_GETTEXTLEN",            /* 0x018a */
00374     "LB_GETCOUNT",              /* 0x018b */
00375     "LB_SELECTSTRING",          /* 0x018c */
00376     "LB_DIR",                   /* 0x018d */
00377     "LB_GETTOPINDEX",           /* 0x018e */
00378     "LB_FINDSTRING",            /* 0x018f */
00379 
00380     "LB_GETSELCOUNT",           /* 0x0190 */
00381     "LB_GETSELITEMS",           /* 0x0191 */
00382     "LB_SETTABSTOPS",           /* 0x0192 */
00383     "LB_GETHORIZONTALEXTENT",   /* 0x0193 */
00384     "LB_SETHORIZONTALEXTENT",   /* 0x0194 */
00385     "LB_SETCOLUMNWIDTH",        /* 0x0195 */
00386     "LB_ADDFILE",               /* 0x0196 */
00387     "LB_SETTOPINDEX",           /* 0x0197 */
00388     "LB_GETITEMRECT",           /* 0x0198 */
00389     "LB_GETITEMDATA",           /* 0x0199 */
00390     "LB_SETITEMDATA",           /* 0x019a */
00391     "LB_SELITEMRANGE",          /* 0x019b */
00392     "LB_SETANCHORINDEX",        /* 0x019c */
00393     "LB_GETANCHORINDEX",        /* 0x019d */
00394     "LB_SETCARETINDEX",         /* 0x019e */
00395     "LB_GETCARETINDEX",         /* 0x019f */
00396 
00397     "LB_SETITEMHEIGHT",         /* 0x01a0 */
00398     "LB_GETITEMHEIGHT",         /* 0x01a1 */
00399     "LB_FINDSTRINGEXACT",       /* 0x01a2 */
00400     "LB_CARETON",               /* 0x01a3 */
00401     "LB_CARETOFF",              /* 0x01a4 */
00402     "LB_SETLOCALE",             /* 0x01a5 */
00403     "LB_GETLOCALE",             /* 0x01a6 */
00404     "LB_SETCOUNT",              /* 0x01a7 */
00405     "LB_INITSTORAGE",           /* 0x01a8 */
00406     "LB_ITEMFROMPOINT",         /* 0x01a9 */
00407     NULL, NULL, NULL, NULL, NULL, NULL,
00408 
00409     /* 0x01B0 */
00410     NULL, NULL,
00411     "LB_GETLISTBOXINFO",         /* 0x01b2 */
00412     NULL, NULL, NULL, NULL, NULL,
00413     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00414 
00415     /* 0x01C0 */
00416     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00417     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00418 
00419     /* 0x01D0 */
00420     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00421     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00422 
00423     /* 0x01E0 */
00424     NULL,
00425     "MN_GETHMENU",              /* 0x01E1 */
00426     NULL, NULL, NULL, NULL, NULL, NULL,
00427     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00428 
00429     /* 0x01F0 */
00430     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00431     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00432 
00433     "WM_MOUSEMOVE",             /* 0x0200 */
00434     "WM_LBUTTONDOWN",           /* 0x0201 */
00435     "WM_LBUTTONUP",             /* 0x0202 */
00436     "WM_LBUTTONDBLCLK",         /* 0x0203 */
00437     "WM_RBUTTONDOWN",           /* 0x0204 */
00438     "WM_RBUTTONUP",             /* 0x0205 */
00439     "WM_RBUTTONDBLCLK",         /* 0x0206 */
00440     "WM_MBUTTONDOWN",           /* 0x0207 */
00441     "WM_MBUTTONUP",             /* 0x0208 */
00442     "WM_MBUTTONDBLCLK",         /* 0x0209 */
00443     "WM_MOUSEWHEEL",            /* 0x020A */
00444     "WM_XBUTTONDOWN",           /* 0x020B */
00445     "WM_XBUTTONUP",             /* 0x020C */
00446     "WM_XBUTTONDBLCLK",         /* 0x020D */
00447     "WM_MOUSEHWHEEL",           /* 0x020E */
00448     NULL,
00449 
00450     "WM_PARENTNOTIFY",          /* 0x0210 */
00451     "WM_ENTERMENULOOP",         /* 0x0211 */
00452     "WM_EXITMENULOOP",          /* 0x0212 */
00453     "WM_NEXTMENU",              /* 0x0213 */
00454     "WM_SIZING",
00455     "WM_CAPTURECHANGED",
00456     "WM_MOVING", NULL,
00457     "WM_POWERBROADCAST",
00458     "WM_DEVICECHANGE", NULL, NULL, NULL, NULL, NULL, NULL,
00459 
00460     "WM_MDICREATE",             /* 0x0220 */
00461     "WM_MDIDESTROY",            /* 0x0221 */
00462     "WM_MDIACTIVATE",           /* 0x0222 */
00463     "WM_MDIRESTORE",            /* 0x0223 */
00464     "WM_MDINEXT",               /* 0x0224 */
00465     "WM_MDIMAXIMIZE",           /* 0x0225 */
00466     "WM_MDITILE",               /* 0x0226 */
00467     "WM_MDICASCADE",            /* 0x0227 */
00468     "WM_MDIICONARRANGE",        /* 0x0228 */
00469     "WM_MDIGETACTIVE",          /* 0x0229 */
00470 
00471     "WM_DROPOBJECT",
00472     "WM_QUERYDROPOBJECT",
00473     "WM_BEGINDRAG",
00474     "WM_DRAGLOOP",
00475     "WM_DRAGSELECT",
00476     "WM_DRAGMOVE",
00477 
00478     /* 0x0230*/
00479     "WM_MDISETMENU",            /* 0x0230 */
00480     "WM_ENTERSIZEMOVE",         /* 0x0231 */
00481     "WM_EXITSIZEMOVE",          /* 0x0232 */
00482     "WM_DROPFILES",             /* 0x0233 */
00483     "WM_MDIREFRESHMENU", NULL, NULL, NULL,
00484     /* 0x0238*/
00485     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00486 
00487     /* 0x0240 */
00488     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00489     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00490 
00491     /* 0x0250 */
00492     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00493     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00494 
00495     /* 0x0260 */
00496     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00497     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00498     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00499     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00500 
00501     /* 0x0280 */
00502     NULL,
00503     "WM_IME_SETCONTEXT",        /* 0x0281 */
00504     "WM_IME_NOTIFY",            /* 0x0282 */
00505     "WM_IME_CONTROL",           /* 0x0283 */
00506     "WM_IME_COMPOSITIONFULL",   /* 0x0284 */
00507     "WM_IME_SELECT",            /* 0x0285 */
00508     "WM_IME_CHAR",              /* 0x0286 */
00509     NULL,
00510     "WM_IME_REQUEST",           /* 0x0288 */
00511     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00512     "WM_IME_KEYDOWN",           /* 0x0290 */
00513     "WM_IME_KEYUP",             /* 0x0291 */
00514     NULL, NULL, NULL, NULL, NULL, NULL,
00515     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00516 
00517     /* 0x02a0 */
00518     "WM_NCMOUSEHOVER",          /* 0x02A0 */
00519     "WM_MOUSEHOVER",            /* 0x02A1 */
00520     "WM_NCMOUSELEAVE",          /* 0x02A2 */
00521     "WM_MOUSELEAVE",            /* 0x02A3 */
00522     NULL, NULL, NULL, NULL, NULL, NULL,
00523     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00524     "WM_WTSSESSION_CHANGE",     /* 0x02B1 */
00525     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00526     NULL, NULL, NULL, NULL, NULL, NULL,
00527 
00528     /* 0x02c0 */
00529     "WM_TABLET_FIRST",          /* 0x02c0 */
00530     "WM_TABLET_FIRST+1",        /* 0x02c1 */
00531     "WM_TABLET_FIRST+2",        /* 0x02c2 */
00532     "WM_TABLET_FIRST+3",        /* 0x02c3 */
00533     "WM_TABLET_FIRST+4",        /* 0x02c4 */
00534     "WM_TABLET_FIRST+5",        /* 0x02c5 */
00535     "WM_TABLET_FIRST+7",        /* 0x02c6 */
00536     "WM_TABLET_FIRST+8",        /* 0x02c7 */
00537     "WM_TABLET_FIRST+9",        /* 0x02c8 */
00538     "WM_TABLET_FIRST+10",       /* 0x02c9 */
00539     "WM_TABLET_FIRST+11",       /* 0x02ca */
00540     "WM_TABLET_FIRST+12",       /* 0x02cb */
00541     "WM_TABLET_FIRST+13",       /* 0x02cc */
00542     "WM_TABLET_FIRST+14",       /* 0x02cd */
00543     "WM_TABLET_FIRST+15",       /* 0x02ce */
00544     "WM_TABLET_FIRST+16",       /* 0x02cf */
00545     "WM_TABLET_FIRST+17",       /* 0x02d0 */
00546     "WM_TABLET_FIRST+18",       /* 0x02d1 */
00547     "WM_TABLET_FIRST+19",       /* 0x02d2 */
00548     "WM_TABLET_FIRST+20",       /* 0x02d3 */
00549     "WM_TABLET_FIRST+21",       /* 0x02d4 */
00550     "WM_TABLET_FIRST+22",       /* 0x02d5 */
00551     "WM_TABLET_FIRST+23",       /* 0x02d6 */
00552     "WM_TABLET_FIRST+24",       /* 0x02d7 */
00553     "WM_TABLET_FIRST+25",       /* 0x02d8 */
00554     "WM_TABLET_FIRST+26",       /* 0x02d9 */
00555     "WM_TABLET_FIRST+27",       /* 0x02da */
00556     "WM_TABLET_FIRST+28",       /* 0x02db */
00557     "WM_TABLET_FIRST+29",       /* 0x02dc */
00558     "WM_TABLET_FIRST+30",       /* 0x02dd */
00559     "WM_TABLET_FIRST+31",       /* 0x02de */
00560     "WM_TABLET_LAST",           /* 0x02df */
00561 
00562     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00563     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00564     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00565     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00566 
00567     "WM_CUT",                   /* 0x0300 */
00568     "WM_COPY",
00569     "WM_PASTE",
00570     "WM_CLEAR",
00571     "WM_UNDO",
00572     "WM_RENDERFORMAT",
00573     "WM_RENDERALLFORMATS",
00574     "WM_DESTROYCLIPBOARD",
00575     "WM_DRAWCLIPBOARD",
00576     "WM_PAINTCLIPBOARD",
00577     "WM_VSCROLLCLIPBOARD",
00578     "WM_SIZECLIPBOARD",
00579     "WM_ASKCBFORMATNAME",
00580     "WM_CHANGECBCHAIN",
00581     "WM_HSCROLLCLIPBOARD",
00582     "WM_QUERYNEWPALETTE",       /* 0x030f*/
00583 
00584     "WM_PALETTEISCHANGING",
00585     "WM_PALETTECHANGED",
00586     "WM_HOTKEY",                /* 0x0312 */
00587     "WM_POPUPSYSTEMMENU",       /* 0x0313 */
00588     NULL, NULL, NULL,
00589     "WM_PRINT",                 /* 0x0317 */
00590     "WM_PRINTCLIENT",           /* 0x0318 */
00591     "WM_APPCOMMAND",            /* 0x0319 */
00592     "WM_THEMECHANGED",          /* 0x031A */
00593     NULL, NULL,
00594     "WM_CLIPBOARDUPDATE",       /* 0x031D */
00595     "WM_DWMCOMPOSITIONCHANGED", /* 0x031E */
00596     "WM_DWMNCRENDERINGCHANGED", /* 0x031F */
00597 
00598     "WM_DWMCOLORIZATIONCOLORCHANGED", /* 0x0320 */
00599     "WM_DWMWINDOWMAXIMIZEDCHANGE", /* 0x0321 */
00600     NULL, NULL, NULL, NULL, NULL, NULL,
00601     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00602 
00603     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00604     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00605     "WM_GETTITLEBARINFOEX",     /* 0x033F */
00606 
00607     /* 0x0340 */
00608     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00609     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00610     /* 0x0350 */
00611     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00612     "WM_HANDHELDFIRST",     /* 0x0358 */
00613     "WM_HANDHELDFIRST+1",   /* 0x0359 */
00614     "WM_HANDHELDFIRST+2",   /* 0x035A */
00615     "WM_HANDHELDFIRST+3",   /* 0x035B */
00616     "WM_HANDHELDFIRST+4",   /* 0x035C */
00617     "WM_HANDHELDFIRST+5",   /* 0x035D */
00618     "WM_HANDHELDFIRST+6",   /* 0x035E */
00619     "WM_HANDHELDLAST",      /* 0x035F */
00620 
00621     "WM_QUERYAFXWNDPROC",   /*  0x0360 WM_AFXFIRST */
00622     "WM_SIZEPARENT",        /*  0x0361 */
00623     "WM_SETMESSAGESTRING",  /*  0x0362 */
00624     "WM_IDLEUPDATECMDUI",   /*  0x0363 */
00625     "WM_INITIALUPDATE",     /*  0x0364 */
00626     "WM_COMMANDHELP",       /*  0x0365 */
00627     "WM_HELPHITTEST",       /*  0x0366 */
00628     "WM_EXITHELPMODE",      /*  0x0367 */
00629     "WM_RECALCPARENT",      /*  0x0368 */
00630     "WM_SIZECHILD",         /*  0x0369 */
00631     "WM_KICKIDLE",          /*  0x036A */
00632     "WM_QUERYCENTERWND",    /*  0x036B */
00633     "WM_DISABLEMODAL",      /*  0x036C */
00634     "WM_FLOATSTATUS",       /*  0x036D */
00635     "WM_ACTIVATETOPLEVEL",  /*  0x036E */
00636     "WM_QUERY3DCONTROLS",   /*  0x036F */
00637     NULL,NULL,NULL,
00638     "WM_SOCKET_NOTIFY",     /*  0x0373 */
00639     "WM_SOCKET_DEAD",       /*  0x0374 */
00640     "WM_POPMESSAGESTRING",  /*  0x0375 */
00641     "WM_OCC_LOADFROMSTREAM",     /* 0x0376 */
00642     "WM_OCC_LOADFROMSTORAGE",    /* 0x0377 */
00643     "WM_OCC_INITNEW",            /* 0x0378 */
00644     "WM_QUEUE_SENTINEL",         /* 0x0379 */
00645     "WM_OCC_LOADFROMSTREAM_EX",  /* 0x037A */
00646     "WM_OCC_LOADFROMSTORAGE_EX", /* 0x037B */
00647 
00648     NULL,NULL,NULL,
00649     "WM_AFXLAST",               /* 0x037F */
00650 
00651     "WM_PENWINFIRST",           /* 0x0380 */
00652     "WM_RCRESULT",              /* 0x0381 */
00653     "WM_HOOKRCRESULT",          /* 0x0382 */
00654     "WM_GLOBALRCCHANGE",        /* 0x0383 */
00655     "WM_SKB",                   /* 0x0384 */
00656     "WM_HEDITCTL",              /* 0x0385 */
00657     NULL, NULL,
00658     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00659     "WM_PENWINLAST",            /* 0x038F */
00660 
00661     "WM_COALESCE_FIRST",        /* 0x0390 */
00662     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00663     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00664     "WM_COALESCE_LAST",         /* 0x039F */
00665 
00666     /* 0x03a0 */
00667     "MM_JOY1MOVE",
00668     "MM_JOY2MOVE",
00669     "MM_JOY1ZMOVE",
00670     "MM_JOY2ZMOVE",
00671                             NULL, NULL, NULL, NULL,
00672     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00673 
00674     /* 0x03b0 */
00675     NULL, NULL, NULL, NULL, NULL,
00676     "MM_JOY1BUTTONDOWN",
00677     "MM_JOY2BUTTONDOWN",
00678     "MM_JOY1BUTTONUP",
00679     "MM_JOY2BUTTONUP",
00680     "MM_MCINOTIFY",
00681                 NULL,
00682     "MM_WOM_OPEN",
00683     "MM_WOM_CLOSE",
00684     "MM_WOM_DONE",
00685     "MM_WIM_OPEN",
00686     "MM_WIM_CLOSE",
00687 
00688     /* 0x03c0 */
00689     "MM_WIM_DATA",
00690     "MM_MIM_OPEN",
00691     "MM_MIM_CLOSE",
00692     "MM_MIM_DATA",
00693     "MM_MIM_LONGDATA",
00694     "MM_MIM_ERROR",
00695     "MM_MIM_LONGERROR",
00696     "MM_MOM_OPEN",
00697     "MM_MOM_CLOSE",
00698     "MM_MOM_DONE",
00699                 NULL, NULL, NULL, NULL, NULL, NULL,
00700     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00701     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00702 
00703     /* 0x03e0 */
00704     "WM_DDE_INITIATE",  /* 0x3E0 */
00705     "WM_DDE_TERMINATE", /* 0x3E1 */
00706     "WM_DDE_ADVISE",    /* 0x3E2 */
00707     "WM_DDE_UNADVISE",  /* 0x3E3 */
00708     "WM_DDE_ACK",       /* 0x3E4 */
00709     "WM_DDE_DATA",      /* 0x3E5 */
00710     "WM_DDE_REQUEST",   /* 0x3E6 */
00711     "WM_DDE_POKE",      /* 0x3E7 */
00712     "WM_DDE_EXECUTE",   /* 0x3E8 */
00713     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00714 
00715 
00716     /* 0x03f0 */
00717     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00718     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
00719 
00720     "WM_USER"                   /* 0x0400 */
00721 };
00722 
00723 
00724 #define SPY_MAX_LVMMSGNUM   182
00725 static const char * const LVMMessageTypeNames[SPY_MAX_LVMMSGNUM + 1] =
00726 {
00727     "LVM_GETBKCOLOR",           /* 1000 */
00728     "LVM_SETBKCOLOR",
00729     "LVM_GETIMAGELIST",
00730     "LVM_SETIMAGELIST",
00731     "LVM_GETITEMCOUNT",
00732     "LVM_GETITEMA",
00733     "LVM_SETITEMA",
00734     "LVM_INSERTITEMA",
00735     "LVM_DELETEITEM",
00736     "LVM_DELETEALLITEMS",
00737     "LVM_GETCALLBACKMASK",
00738     "LVM_SETCALLBACKMASK",
00739     "LVM_GETNEXTITEM",
00740     "LVM_FINDITEMA",
00741     "LVM_GETITEMRECT",
00742     "LVM_SETITEMPOSITION",
00743     "LVM_GETITEMPOSITION",
00744     "LVM_GETSTRINGWIDTHA",
00745     "LVM_HITTEST",
00746     "LVM_ENSUREVISIBLE",
00747     "LVM_SCROLL",
00748     "LVM_REDRAWITEMS",
00749     "LVM_ARRANGE",
00750     "LVM_EDITLABELA",
00751     "LVM_GETEDITCONTROL",
00752     "LVM_GETCOLUMNA",
00753     "LVM_SETCOLUMNA",
00754     "LVM_INSERTCOLUMNA",
00755     "LVM_DELETECOLUMN",
00756     "LVM_GETCOLUMNWIDTH",
00757     "LVM_SETCOLUMNWIDTH",
00758     "LVM_GETHEADER",
00759     NULL,
00760     "LVM_CREATEDRAGIMAGE",
00761     "LVM_GETVIEWRECT",
00762     "LVM_GETTEXTCOLOR",
00763     "LVM_SETTEXTCOLOR",
00764     "LVM_GETTEXTBKCOLOR",
00765     "LVM_SETTEXTBKCOLOR",
00766     "LVM_GETTOPINDEX",
00767     "LVM_GETCOUNTPERPAGE",
00768     "LVM_GETORIGIN",
00769     "LVM_UPDATE",
00770     "LVM_SETITEMSTATE",
00771     "LVM_GETITEMSTATE",
00772     "LVM_GETITEMTEXTA",
00773     "LVM_SETITEMTEXTA",
00774     "LVM_SETITEMCOUNT",
00775     "LVM_SORTITEMS",
00776     "LVM_SETITEMPOSITION32",
00777     "LVM_GETSELECTEDCOUNT",
00778     "LVM_GETITEMSPACING",
00779     "LVM_GETISEARCHSTRINGA",
00780     "LVM_SETICONSPACING",
00781     "LVM_SETEXTENDEDLISTVIEWSTYLE",
00782     "LVM_GETEXTENDEDLISTVIEWSTYLE",
00783     "LVM_GETSUBITEMRECT",
00784     "LVM_SUBITEMHITTEST",
00785     "LVM_SETCOLUMNORDERARRAY",
00786     "LVM_GETCOLUMNORDERARRAY",
00787     "LVM_SETHOTITEM",
00788     "LVM_GETHOTITEM",
00789     "LVM_SETHOTCURSOR",
00790     "LVM_GETHOTCURSOR",
00791     "LVM_APPROXIMATEVIEWRECT",
00792     "LVM_SETWORKAREAS",
00793     "LVM_GETSELECTIONMARK",
00794     "LVM_SETSELECTIONMARK",
00795     "LVM_SETBKIMAGEA",
00796     "LVM_GETBKIMAGEA",
00797     "LVM_GETWORKAREAS",
00798     "LVM_SETHOVERTIME",
00799     "LVM_GETHOVERTIME",
00800     "LVM_GETNUMBEROFWORKAREAS",
00801     "LVM_SETTOOLTIPS",
00802     "LVM_GETITEMW",
00803     "LVM_SETITEMW",
00804     "LVM_INSERTITEMW",
00805     "LVM_GETTOOLTIPS",
00806     NULL,
00807     NULL,
00808     NULL,
00809     NULL,
00810     "LVM_FINDITEMW",
00811     NULL,
00812     NULL,
00813     NULL,
00814     "LVM_GETSTRINGWIDTHW",
00815     NULL,
00816     NULL,
00817     NULL,
00818     NULL,
00819     NULL,
00820     NULL,
00821     NULL,
00822     "LVM_GETCOLUMNW",
00823     "LVM_SETCOLUMNW",
00824     "LVM_INSERTCOLUMNW",
00825     NULL,
00826     NULL,
00827     NULL,
00828     NULL,
00829     NULL,
00830     NULL,
00831     NULL,
00832     NULL,
00833     NULL,
00834     NULL,
00835     NULL,
00836     NULL,
00837     NULL,
00838     NULL,
00839     NULL,
00840     NULL,
00841     NULL,
00842     "LVM_GETITEMTEXTW",
00843     "LVM_SETITEMTEXTW",
00844     "LVM_GETISEARCHSTRINGW",
00845     "LVM_EDITLABELW",
00846     NULL,
00847     NULL,
00848     NULL,
00849     NULL,
00850     NULL,
00851     NULL,
00852     NULL,
00853     NULL,
00854     NULL,
00855     NULL,
00856     NULL,
00857     NULL,
00858     NULL,
00859     NULL,
00860     NULL,
00861     NULL,
00862     NULL,
00863     NULL,
00864     NULL,
00865     NULL,
00866     "LVM_SETBKIMAGEW",
00867     "LVM_GETBKIMAGEW"   /* 0x108B */
00868     "LVM_SETSELECTEDCOLUMN",
00869     "LVM_SETTILEWIDTH",
00870     "LVM_SETVIEW",
00871     "LVM_GETVIEW",
00872     NULL,
00873     "LVM_INSERTGROUP",
00874     NULL,
00875     "LVM_SETGROUPINFO",
00876     NULL,
00877     "LVM_GETGROUPINFO",
00878     "LVM_REMOVEGROUP",
00879     "LVM_MOVEGROUP",
00880     NULL,
00881     NULL,
00882     "LVM_MOVEITEMTOGROUP",
00883     "LVM_SETGROUPMETRICS",
00884     "LVM_GETGROUPMETRICS",
00885     "LVM_ENABLEGROUPVIEW",
00886     "LVM_SORTGROUPS",
00887     "LVM_INSERTGROUPSORTED",
00888     "LVM_REMOVEALLGROUPS",
00889     "LVM_HASGROUP",
00890     "LVM_SETTILEVIEWINFO",
00891     "LVM_GETTILEVIEWINFO",
00892     "LVM_SETTILEINFO",
00893     "LVM_GETTILEINFO",
00894     "LVM_SETINSERTMARK",
00895     "LVM_GETINSERTMARK",
00896     "LVM_INSERTMARKHITTEST",
00897     "LVM_GETINSERTMARKRECT",
00898     "LVM_SETINSERTMARKCOLOR",
00899     "LVM_GETINSERTMARKCOLOR",
00900     NULL,
00901     "LVM_SETINFOTIP",
00902     "LVM_GETSELECTEDCOLUMN",
00903     "LVM_ISGROUPVIEWENABLED",
00904     "LVM_GETOUTLINECOLOR",
00905     "LVM_SETOUTLINECOLOR",
00906     NULL,
00907     "LVM_CANCELEDITLABEL",
00908     "LVM_MAPINDEXTOID",
00909     "LVM_MAPIDTOINDEX",
00910     "LVM_ISITEMVISIBLE"
00911 };
00912 
00913 
00914 #define SPY_MAX_TVMSGNUM   65
00915 static const char * const TVMessageTypeNames[SPY_MAX_TVMSGNUM + 1] =
00916 {
00917     "TVM_INSERTITEMA",          /* 1100 */
00918     "TVM_DELETEITEM",
00919     "TVM_EXPAND",
00920     NULL,
00921     "TVM_GETITEMRECT",
00922     "TVM_GETCOUNT",
00923     "TVM_GETINDENT",
00924     "TVM_SETINDENT",
00925     "TVM_GETIMAGELIST",
00926     "TVM_SETIMAGELIST",
00927     "TVM_GETNEXTITEM",
00928     "TVM_SELECTITEM",
00929     "TVM_GETITEMA",
00930     "TVM_SETITEMA",
00931     "TVM_EDITLABELA",
00932     "TVM_GETEDITCONTROL",
00933     "TVM_GETVISIBLECOUNT",
00934     "TVM_HITTEST",
00935     "TVM_CREATEDRAGIMAGE",
00936     "TVM_SORTCHILDREN",
00937     "TVM_ENSUREVISIBLE",
00938     "TVM_SORTCHILDRENCB",
00939     "TVM_ENDEDITLABELNOW",
00940     "TVM_GETISEARCHSTRINGA",
00941     "TVM_SETTOOLTIPS",
00942     "TVM_GETTOOLTIPS",
00943     "TVM_SETINSERTMARK",
00944     "TVM_SETITEMHEIGHT",
00945     "TVM_GETITEMHEIGHT",
00946     "TVM_SETBKCOLOR",
00947     "TVM_SETTEXTCOLOR",
00948     "TVM_GETBKCOLOR",
00949     "TVM_GETTEXTCOLOR",
00950     "TVM_SETSCROLLTIME",
00951     "TVM_GETSCROLLTIME",
00952     "TVM_UNKNOWN35",
00953     "TVM_UNKNOWN36",
00954     "TVM_SETINSERTMARKCOLOR",
00955     "TVM_GETINSERTMARKCOLOR",
00956     "TVM_GETITEMSTATE",
00957     "TVM_SETLINECOLOR",
00958     "TVM_GETLINECOLOR",
00959     NULL,
00960     NULL,
00961     NULL,
00962     NULL,
00963     NULL,
00964     NULL,
00965     NULL,
00966     NULL,
00967     "TVM_INSERTITEMW",
00968     NULL,
00969     NULL,
00970     NULL,
00971     NULL,
00972     NULL,
00973     NULL,
00974     NULL,
00975     NULL,
00976     NULL,
00977     NULL,
00978     NULL,
00979     "TVM_GETITEMW",
00980     "TVM_SETITEMW",
00981     "TVM_GETISEARCHSTRINGW",
00982     "TVM_EDITLABELW"
00983 };
00984 
00985 
00986 #define SPY_MAX_HDMMSGNUM   19
00987 static const char * const HDMMessageTypeNames[SPY_MAX_HDMMSGNUM + 1] =
00988 {
00989     "HDM_GETITEMCOUNT",         /* 1200 */
00990     "HDM_INSERTITEMA",
00991     "HDM_DELETEITEM",
00992     "HDM_GETITEMA",
00993     "HDM_SETITEMA",
00994     "HDM_LAYOUT",
00995     "HDM_HITTEST",
00996     "HDM_GETITEMRECT",
00997     "HDM_SETIMAGELIST",
00998     "HDM_GETIMAGELIST",
00999     "HDM_INSERTITEMW",
01000     "HDM_GETITEMW",
01001     "HDM_SETITEMW",
01002     NULL,
01003     NULL,
01004     "HDM_ORDERTOINDEX",
01005     "HDM_CREATEDRAGIMAGE",
01006     "GETORDERARRAYINDEX",
01007     "SETORDERARRAYINDEX",
01008     "SETHOTDIVIDER"
01009 };
01010 
01011 
01012 #define SPY_MAX_TCMMSGNUM   62
01013 static const char * const TCMMessageTypeNames[SPY_MAX_TCMMSGNUM + 1] =
01014 {
01015     NULL,               /* 1300 */
01016     NULL,
01017     "TCM_SETIMAGELIST",
01018     "TCM_GETIMAGELIST",
01019     "TCM_GETITEMCOUNT",
01020     "TCM_GETITEMA",
01021     "TCM_SETITEMA",
01022     "TCM_INSERTITEMA",
01023     "TCM_DELETEITEM",
01024     "TCM_DELETEALLITEMS",
01025     "TCM_GETITEMRECT",
01026     "TCM_GETCURSEL",
01027     "TCM_SETCURSEL",
01028     "TCM_HITTEST",
01029     "TCM_SETITEMEXTRA",
01030     NULL,
01031     NULL,
01032     NULL,
01033     NULL,
01034     NULL,
01035     NULL,
01036     NULL,
01037     NULL,
01038     NULL,
01039     NULL,
01040     NULL,
01041     NULL,
01042     NULL,
01043     NULL,
01044     NULL,
01045     NULL,
01046     NULL,
01047     NULL,
01048     NULL,
01049     NULL,
01050     NULL,
01051     NULL,
01052     NULL,
01053     NULL,
01054     NULL,
01055     "TCM_ADJUSTRECT",
01056     "TCM_SETITEMSIZE",
01057     "TCM_REMOVEIMAGE",
01058     "TCM_SETPADDING",
01059     "TCM_GETROWCOUNT",
01060     "TCM_GETTOOLTIPS",
01061     "TCM_SETTOOLTIPS",
01062     "TCM_GETCURFOCUS",
01063     "TCM_SETCURFOCUS",
01064     "TCM_SETMINTABWIDTH",
01065     "TCM_DESELECTALL",
01066     "TCM_HIGHLIGHTITEM",
01067     "TCM_SETEXTENDEDSTYLE",
01068     "TCM_GETEXTENDEDSTYLE",
01069     NULL,
01070     NULL,
01071     NULL,
01072     NULL,
01073     NULL,
01074     NULL,
01075     "TCM_GETITEMW",
01076     "TCM_SETITEMW",
01077     "TCM_INSERTITEMW"
01078 };
01079 
01080 #define SPY_MAX_PGMMSGNUM   13
01081 static const char * const PGMMessageTypeNames[SPY_MAX_PGMMSGNUM + 1] =
01082 {
01083     NULL,               /* 1400 */
01084     "PGM_SETCHILD",
01085     "PGM_RECALCSIZE",
01086     "PGM_FORWARDMOUSE",
01087     "PGM_SETBKCOLOR",
01088     "PGM_GETBKCOLOR",
01089     "PGM_SETBORDER",
01090     "PGM_GETBORDER",
01091     "PGM_SETPOS",
01092     "PGM_GETPOS",
01093     "PGM_SETBUTTONSIZE",
01094     "PGM_GETBUTTONSIZE",
01095     "PGM_GETBUTTONSTATE",
01096     "PGM_GETDROPTARGET"
01097 };
01098 
01099 
01100 #define SPY_MAX_CCMMSGNUM   9
01101 static const char * const CCMMessageTypeNames[SPY_MAX_CCMMSGNUM + 1] =
01102 {
01103     NULL,               /* 0x2000 */
01104     "CCM_SETBKCOLOR",
01105     "CCM_SETCOLORSCHEME",
01106     "CCM_GETCOLORSCHEME",
01107     "CCM_GETDROPTARGET",
01108     "CCM_SETUNICODEFORMAT",
01109     "CCM_GETUNICODEFORMAT",
01110     "CCM_SETVERSION",
01111     "CCM_GETVERSION",
01112     "CCM_SETNOTIFYWINDOW"
01113 };
01114 
01115 #define SPY_MAX_WINEMSGNUM   9
01116 static const char * const WINEMessageTypeNames[SPY_MAX_WINEMSGNUM + 1] =
01117 {
01118     "WM_WINE_DESTROYWINDOW",
01119     "WM_WINE_SETWINDOWPOS",
01120     "WM_WINE_SHOWWINDOW",
01121     "WM_WINE_SETPARENT",
01122     "WM_WINE_SETWINDOWLONG",
01123     "WM_WINE_ENABLEWINDOW"
01124     "WM_WINE_SETACTIVEWINDOW",
01125     "WM_WINE_KEYBOARD_LL_HOOK",
01126     "WM_WINE_MOUSE_LL_HOOK",
01127 };
01128 
01129 /* Virtual key names */
01130 #define SPY_MAX_VKKEYSNUM 255
01131 static const char * const VK_KeyNames[SPY_MAX_VKKEYSNUM + 1] =
01132 {
01133     NULL,               /* 0x00 */
01134     "VK_LBUTTON",       /* 0x01 */
01135     "VK_RBUTTON",       /* 0x02 */
01136     "VK_CANCEL",        /* 0x03 */
01137     "VK_MBUTTON",       /* 0x04 */
01138     "VK_XBUTTON1",      /* 0x05 */
01139     "VK_XBUTTON2",      /* 0x06 */
01140     NULL,               /* 0x07 */
01141     "VK_BACK",          /* 0x08 */
01142     "VK_TAB",           /* 0x09 */
01143     NULL,               /* 0x0A */
01144     NULL,               /* 0x0B */
01145     "VK_CLEAR",         /* 0x0C */
01146     "VK_RETURN",        /* 0x0D */
01147     NULL,               /* 0x0E */
01148     NULL,               /* 0x0F */
01149     "VK_SHIFT",         /* 0x10 */
01150     "VK_CONTROL",       /* 0x11 */
01151     "VK_MENU",          /* 0x12 */
01152     "VK_PAUSE",         /* 0x13 */
01153     "VK_CAPITAL",       /* 0x14 */
01154     NULL,               /* 0x15 */
01155     NULL,               /* 0x16 */
01156     NULL,               /* 0x17 */
01157     NULL,               /* 0x18 */
01158     NULL,               /* 0x19 */
01159     NULL,               /* 0x1A */
01160     "VK_ESCAPE",        /* 0x1B */
01161     "VK_CONVERT",       /* 0x1C */
01162     "VK_NONCONVERT",    /* 0x1D */
01163     "VK_ACCEPT",        /* 0x1E */
01164     "VK_MODECHANGE",    /* 0x1F */
01165     "VK_SPACE",         /* 0x20 */
01166     "VK_PRIOR",         /* 0x21 */
01167     "VK_NEXT",          /* 0x22 */
01168     "VK_END",           /* 0x23 */
01169     "VK_HOME",          /* 0x24 */
01170     "VK_LEFT",          /* 0x25 */
01171     "VK_UP",            /* 0x26 */
01172     "VK_RIGHT",         /* 0x27 */
01173     "VK_DOWN",          /* 0x28 */
01174     "VK_SELECT",        /* 0x29 */
01175     "VK_PRINT",         /* 0x2A */
01176     "VK_EXECUTE",       /* 0x2B */
01177     "VK_SNAPSHOT",      /* 0x2C */
01178     "VK_INSERT",        /* 0x2D */
01179     "VK_DELETE",        /* 0x2E */
01180     "VK_HELP",          /* 0x2F */
01181     "VK_0",             /* 0x30 */
01182     "VK_1",             /* 0x31 */
01183     "VK_2",             /* 0x32 */
01184     "VK_3",             /* 0x33 */
01185     "VK_4",             /* 0x34 */
01186     "VK_5",             /* 0x35 */
01187     "VK_6",             /* 0x36 */
01188     "VK_7",             /* 0x37 */
01189     "VK_8",             /* 0x38 */
01190     "VK_9",             /* 0x39 */
01191     NULL,               /* 0x3A */
01192     NULL,               /* 0x3B */
01193     NULL,               /* 0x3C */
01194     NULL,               /* 0x3D */
01195     NULL,               /* 0x3E */
01196     NULL,               /* 0x3F */
01197     NULL,               /* 0x40 */
01198     "VK_A",             /* 0x41 */
01199     "VK_B",             /* 0x42 */
01200     "VK_C",             /* 0x43 */
01201     "VK_D",             /* 0x44 */
01202     "VK_E",             /* 0x45 */
01203     "VK_F",             /* 0x46 */
01204     "VK_G",             /* 0x47 */
01205     "VK_H",             /* 0x48 */
01206     "VK_I",             /* 0x49 */
01207     "VK_J",             /* 0x4A */
01208     "VK_K",             /* 0x4B */
01209     "VK_L",             /* 0x4C */
01210     "VK_M",             /* 0x4D */
01211     "VK_N",             /* 0x4E */
01212     "VK_O",             /* 0x4F */
01213     "VK_P",             /* 0x50 */
01214     "VK_Q",             /* 0x51 */
01215     "VK_R",             /* 0x52 */
01216     "VK_S",             /* 0x53 */
01217     "VK_T",             /* 0x54 */
01218     "VK_U",             /* 0x55 */
01219     "VK_V",             /* 0x56 */
01220     "VK_W",             /* 0x57 */
01221     "VK_X",             /* 0x58 */
01222     "VK_Y",             /* 0x59 */
01223     "VK_Z",             /* 0x5A */
01224     "VK_LWIN",          /* 0x5B */
01225     "VK_RWIN",          /* 0x5C */
01226     "VK_APPS",          /* 0x5D */
01227     NULL,               /* 0x5E */
01228     "VK_SLEEP",         /* 0x5F */
01229     "VK_NUMPAD0",       /* 0x60 */
01230     "VK_NUMPAD1",       /* 0x61 */
01231     "VK_NUMPAD2",       /* 0x62 */
01232     "VK_NUMPAD3",       /* 0x63 */
01233     "VK_NUMPAD4",       /* 0x64 */
01234     "VK_NUMPAD5",       /* 0x65 */
01235     "VK_NUMPAD6",       /* 0x66 */
01236     "VK_NUMPAD7",       /* 0x67 */
01237     "VK_NUMPAD8",       /* 0x68 */
01238     "VK_NUMPAD9",       /* 0x69 */
01239     "VK_MULTIPLY",      /* 0x6A */
01240     "VK_ADD",           /* 0x6B */
01241     "VK_SEPARATOR",     /* 0x6C */
01242     "VK_SUBTRACT",      /* 0x6D */
01243     "VK_DECIMAL",       /* 0x6E */
01244     "VK_DIVIDE",        /* 0x6F */
01245     "VK_F1",            /* 0x70 */
01246     "VK_F2",            /* 0x71 */
01247     "VK_F3",            /* 0x72 */
01248     "VK_F4",            /* 0x73 */
01249     "VK_F5",            /* 0x74 */
01250     "VK_F6",            /* 0x75 */
01251     "VK_F7",            /* 0x76 */
01252     "VK_F8",            /* 0x77 */
01253     "VK_F9",            /* 0x78 */
01254     "VK_F10",           /* 0x79 */
01255     "VK_F11",           /* 0x7A */
01256     "VK_F12",           /* 0x7B */
01257     "VK_F13",           /* 0x7C */
01258     "VK_F14",           /* 0x7D */
01259     "VK_F15",           /* 0x7E */
01260     "VK_F16",           /* 0x7F */
01261     "VK_F17",           /* 0x80 */
01262     "VK_F18",           /* 0x81 */
01263     "VK_F19",           /* 0x82 */
01264     "VK_F20",           /* 0x83 */
01265     "VK_F21",           /* 0x84 */
01266     "VK_F22",           /* 0x85 */
01267     "VK_F23",           /* 0x86 */
01268     "VK_F24",           /* 0x87 */
01269     NULL,               /* 0x88 */
01270     NULL,               /* 0x89 */
01271     NULL,               /* 0x8A */
01272     NULL,               /* 0x8B */
01273     NULL,               /* 0x8C */
01274     NULL,               /* 0x8D */
01275     NULL,               /* 0x8E */
01276     NULL,               /* 0x8F */
01277     "VK_NUMLOCK",       /* 0x90 */
01278     "VK_SCROLL",        /* 0x91 */
01279     "VK_OEM_NEC_EQUAL",       /* 0x92 aka. VK_OEM_FJ_JISHO */
01280     "VK_OEM_FJ_MASSHOU",      /* 0x93 */
01281     "VK_OEM_FJ_TOUROKU",      /* 0x94 */
01282     "VK_OEM_FJ_LOYA",         /* 0x95 */
01283     "VK_OEM_FJ_ROYA",         /* 0x96 */
01284     NULL,               /* 0x97 */
01285     NULL,               /* 0x98 */
01286     NULL,               /* 0x99 */
01287     NULL,               /* 0x9A */
01288     NULL,               /* 0x9B */
01289     NULL,               /* 0x9C */
01290     NULL,               /* 0x9D */
01291     NULL,               /* 0x9E */
01292     NULL,               /* 0x9F */
01293     "VK_LSHIFT",        /* 0xA0 */
01294     "VK_RSHIFT",        /* 0xA1 */
01295     "VK_LCONTROL",      /* 0xA2 */
01296     "VK_RCONTROL",      /* 0xA3 */
01297     "VK_LMENU",         /* 0xA4 */
01298     "VK_RMENU",         /* 0xA5 */
01299     "VK_BROWSER_BACK",        /* 0xA6 */
01300     "VK_BROWSER_FORWARD",     /* 0xA7 */
01301     "VK_BROWSER_REFRESH",     /* 0xA8 */
01302     "VK_BROWSER_STOP",        /* 0xA9 */
01303     "VK_BROWSER_SEARCH",      /* 0xAA */
01304     "VK_BROWSER_FAVORITES",   /* 0xAB */
01305     "VK_BROWSER_HOME",        /* 0xAC */
01306     "VK_VOLUME_MUTE",         /* 0xAD */
01307     "VK_VOLUME_DOWN",         /* 0xAE */
01308     "VK_VOLUME_UP",           /* 0xAF */
01309     "VK_MEDIA_NEXT_TRACK",    /* 0xB0 */
01310     "VK_MEDIA_PREV_TRACK",    /* 0xB1 */
01311     "VK_MEDIA_STOP",          /* 0xB2 */
01312     "VK_MEDIA_PLAY_PAUSE",    /* 0xB3 */
01313     "VK_LAUNCH_MAIL",         /* 0xB4 */
01314     "VK_LAUNCH_MEDIA_SELECT", /* 0xB5 */
01315     "VK_LAUNCH_APP1",         /* 0xB6 */
01316     "VK_LAUNCH_APP2",         /* 0xB7 */
01317     NULL,               /* 0xB8 */
01318     NULL,               /* 0xB9 */
01319     "VK_OEM_1",         /* 0xBA */
01320     "VK_OEM_PLUS",      /* 0xBB */
01321     "VK_OEM_COMMA",     /* 0xBC */
01322     "VK_OEM_MINUS",     /* 0xBD */
01323     "VK_OEM_PERIOD",    /* 0xBE */
01324     "VK_OEM_2",         /* 0xBF */
01325     "VK_OEM_3",         /* 0xC0 */
01326     NULL,               /* 0xC1 */
01327     NULL,               /* 0xC2 */
01328     NULL,               /* 0xC3 */
01329     NULL,               /* 0xC4 */
01330     NULL,               /* 0xC5 */
01331     NULL,               /* 0xC6 */
01332     NULL,               /* 0xC7 */
01333     NULL,               /* 0xC8 */
01334     NULL,               /* 0xC9 */
01335     NULL,               /* 0xCA */
01336     NULL,               /* 0xCB */
01337     NULL,               /* 0xCC */
01338     NULL,               /* 0xCD */
01339     NULL,               /* 0xCE */
01340     NULL,               /* 0xCF */
01341     NULL,               /* 0xD0 */
01342     NULL,               /* 0xD1 */
01343     NULL,               /* 0xD2 */
01344     NULL,               /* 0xD3 */
01345     NULL,               /* 0xD4 */
01346     NULL,               /* 0xD5 */
01347     NULL,               /* 0xD6 */
01348     NULL,               /* 0xD7 */
01349     NULL,               /* 0xD8 */
01350     NULL,               /* 0xD9 */
01351     NULL,               /* 0xDA */
01352     "VK_OEM_4",         /* 0xDB */
01353     "VK_OEM_5",         /* 0xDC */
01354     "VK_OEM_6",         /* 0xDD */
01355     "VK_OEM_7",         /* 0xDE */
01356     "VK_OEM_8",         /* 0xDF */
01357     NULL,               /* 0xE0 */
01358     "VK_OEM_AX",        /* 0xE1 */
01359     "VK_OEM_102",       /* 0xE2 */
01360     "VK_ICO_HELP",      /* 0xE3 */
01361     "VK_ICO_00",        /* 0xE4 */
01362     "VK_PROCESSKEY",    /* 0xE5 */
01363     NULL,               /* 0xE6 */
01364     "VK_PACKET",        /* 0xE7 */
01365     NULL,               /* 0xE8 */
01366     NULL,               /* 0xE9 */
01367     NULL,               /* 0xEA */
01368     NULL,               /* 0xEB */
01369     NULL,               /* 0xEC */
01370     NULL,               /* 0xED */
01371     NULL,               /* 0xEE */
01372     NULL,               /* 0xEF */
01373     NULL,               /* 0xF0 */
01374     NULL,               /* 0xF1 */
01375     NULL,               /* 0xF2 */
01376     NULL,               /* 0xF3 */
01377     NULL,               /* 0xF4 */
01378     NULL,               /* 0xF5 */
01379     "VK_ATTN",          /* 0xF6 */
01380     "VK_CRSEL",         /* 0xF7 */
01381     "VK_EXSEL",         /* 0xF8 */
01382     "VK_EREOF",         /* 0xF9 */
01383     "VK_PLAY",          /* 0xFA */
01384     "VK_ZOOM",          /* 0xFB */
01385     "VK_NONAME",        /* 0xFC */
01386     "VK_PA1",           /* 0xFD */
01387     "VK_OEM_CLEAR",     /* 0xFE */
01388     NULL                /* 0xFF */
01389 };
01390 
01391 
01392 /************************************************************************/
01393 
01394 
01395 /* WM_USER+n message values for "common controls" */
01396 
01397 typedef struct
01398 {
01399     const char *name;      /* name of control message           */
01400     UINT        value;     /* message number (0x0401-0x0fff     */
01401     UINT        len;       /* length of space at lParam to dump */
01402 } USER_MSG;
01403 
01404 
01405 typedef struct
01406 {
01407 const WCHAR      *classname;  /* class name to match                  */
01408 const USER_MSG   *classmsg;   /* pointer to first USER_MSG for class  */
01409 const USER_MSG   *lastmsg;    /* pointer to last USER_MSG for class   */
01410 } CONTROL_CLASS;
01411 
01412 #define USM(a,b) { #a ,a,b}
01413 #define SZOF(a)  sizeof(a)
01414 
01415 /* To dump memory at the lParam for any of these messages,  */
01416 /* replace the "0" with a "SZOF(structure)", or with a      */
01417 /* number. (First method preferred.)                         */
01418 
01419 #define RB_GETBANDINFO_OLD (WM_USER+5) /* obsoleted after IE3, but we have to support it anyway */
01420 
01421 static const USER_MSG rebar_array[] = {
01422           USM(RB_INSERTBANDA,          0),
01423           USM(RB_DELETEBAND,           0),
01424           USM(RB_GETBARINFO,           0),
01425           USM(RB_SETBARINFO,           0),
01426           USM(RB_GETBANDINFO_OLD,      0),
01427           USM(RB_SETBANDINFOA,         0),
01428           USM(RB_SETPARENT,            0),
01429           USM(RB_HITTEST,              0),
01430           USM(RB_GETRECT,              0),
01431           USM(RB_INSERTBANDW,          0),
01432           USM(RB_SETBANDINFOW,         0),
01433           USM(RB_GETBANDCOUNT,         0),
01434           USM(RB_GETROWCOUNT,          0),
01435           USM(RB_GETROWHEIGHT,         0),
01436           USM(RB_IDTOINDEX,            0),
01437           USM(RB_GETTOOLTIPS,          0),
01438           USM(RB_SETTOOLTIPS,          0),
01439           USM(RB_SETBKCOLOR,           0),
01440           USM(RB_GETBKCOLOR,           0),
01441           USM(RB_SETTEXTCOLOR,         0),
01442           USM(RB_GETTEXTCOLOR,         0),
01443           USM(RB_SIZETORECT,           0),
01444           USM(RB_BEGINDRAG,            0),
01445           USM(RB_ENDDRAG,              0),
01446           USM(RB_DRAGMOVE,             0),
01447           USM(RB_GETBARHEIGHT,         0),
01448           USM(RB_GETBANDINFOW,         0),
01449           USM(RB_GETBANDINFOA,         0),
01450           USM(RB_MINIMIZEBAND,         0),
01451           USM(RB_MAXIMIZEBAND,         0),
01452           USM(RB_GETBANDBORDERS,       0),
01453           USM(RB_SHOWBAND,             0),
01454           USM(RB_SETPALETTE,           0),
01455           USM(RB_GETPALETTE,           0),
01456           USM(RB_MOVEBAND,             0),
01457           {0,0,0} };
01458 
01459 static const USER_MSG toolbar_array[] = {
01460           USM(TB_ENABLEBUTTON          ,0),
01461           USM(TB_CHECKBUTTON           ,0),
01462           USM(TB_PRESSBUTTON           ,0),
01463           USM(TB_HIDEBUTTON            ,0),
01464           USM(TB_INDETERMINATE         ,0),
01465           USM(TB_MARKBUTTON            ,0),
01466           USM(TB_ISBUTTONENABLED       ,0),
01467           USM(TB_ISBUTTONCHECKED       ,0),
01468           USM(TB_ISBUTTONPRESSED       ,0),
01469           USM(TB_ISBUTTONHIDDEN        ,0),
01470           USM(TB_ISBUTTONINDETERMINATE ,0),
01471           USM(TB_ISBUTTONHIGHLIGHTED   ,0),
01472           USM(TB_SETSTATE              ,0),
01473           USM(TB_GETSTATE              ,0),
01474           USM(TB_ADDBITMAP             ,0),
01475           USM(TB_ADDBUTTONSA           ,0),
01476           USM(TB_INSERTBUTTONA         ,0),
01477           USM(TB_DELETEBUTTON          ,0),
01478           USM(TB_GETBUTTON             ,0),
01479           USM(TB_BUTTONCOUNT           ,0),
01480           USM(TB_COMMANDTOINDEX        ,0),
01481           USM(TB_SAVERESTOREA          ,0),
01482           USM(TB_CUSTOMIZE             ,0),
01483           USM(TB_ADDSTRINGA            ,0),
01484           USM(TB_GETITEMRECT           ,0),
01485           USM(TB_BUTTONSTRUCTSIZE      ,0),
01486           USM(TB_SETBUTTONSIZE         ,0),
01487           USM(TB_SETBITMAPSIZE         ,0),
01488           USM(TB_AUTOSIZE              ,0),
01489           USM(TB_GETTOOLTIPS           ,0),
01490           USM(TB_SETTOOLTIPS           ,0),
01491           USM(TB_SETPARENT             ,0),
01492           USM(TB_SETROWS               ,0),
01493           USM(TB_GETROWS               ,0),
01494           USM(TB_GETBITMAPFLAGS        ,0),
01495           USM(TB_SETCMDID              ,0),
01496           USM(TB_CHANGEBITMAP          ,0),
01497           USM(TB_GETBITMAP             ,0),
01498           USM(TB_GETBUTTONTEXTA        ,0),
01499           USM(TB_REPLACEBITMAP         ,0),
01500           USM(TB_SETINDENT             ,0),
01501           USM(TB_SETIMAGELIST          ,0),
01502           USM(TB_GETIMAGELIST          ,0),
01503           USM(TB_LOADIMAGES            ,0),
01504           USM(TB_GETRECT               ,0),
01505           USM(TB_SETHOTIMAGELIST       ,0),
01506           USM(TB_GETHOTIMAGELIST       ,0),
01507           USM(TB_SETDISABLEDIMAGELIST  ,0),
01508           USM(TB_GETDISABLEDIMAGELIST  ,0),
01509           USM(TB_SETSTYLE              ,0),
01510           USM(TB_GETSTYLE              ,0),
01511           USM(TB_GETBUTTONSIZE         ,0),
01512           USM(TB_SETBUTTONWIDTH        ,0),
01513           USM(TB_SETMAXTEXTROWS        ,0),
01514           USM(TB_GETTEXTROWS           ,0),
01515           USM(TB_GETOBJECT             ,0),
01516           USM(TB_GETBUTTONINFOW        ,0),
01517           USM(TB_SETBUTTONINFOW        ,0),
01518           USM(TB_GETBUTTONINFOA        ,0),
01519           USM(TB_SETBUTTONINFOA        ,0),
01520           USM(TB_INSERTBUTTONW         ,0),
01521           USM(TB_ADDBUTTONSW           ,0),
01522           USM(TB_HITTEST               ,0),
01523           USM(TB_SETDRAWTEXTFLAGS      ,0),
01524           USM(TB_GETHOTITEM            ,0),
01525           USM(TB_SETHOTITEM            ,0),
01526           USM(TB_SETANCHORHIGHLIGHT    ,0),
01527           USM(TB_GETANCHORHIGHLIGHT    ,0),
01528           USM(TB_GETBUTTONTEXTW        ,0),
01529           USM(TB_SAVERESTOREW          ,0),
01530           USM(TB_ADDSTRINGW            ,0),
01531           USM(TB_MAPACCELERATORA       ,0),
01532           USM(TB_GETINSERTMARK         ,0),
01533           USM(TB_SETINSERTMARK         ,0),
01534           USM(TB_INSERTMARKHITTEST     ,0),
01535           USM(TB_MOVEBUTTON            ,0),
01536           USM(TB_GETMAXSIZE            ,0),
01537           USM(TB_SETEXTENDEDSTYLE      ,0),
01538           USM(TB_GETEXTENDEDSTYLE      ,0),
01539           USM(TB_GETPADDING            ,0),
01540           USM(TB_SETPADDING            ,0),
01541           USM(TB_SETINSERTMARKCOLOR    ,0),
01542           USM(TB_GETINSERTMARKCOLOR    ,0),
01543           USM(TB_MAPACCELERATORW       ,0),
01544           USM(TB_GETSTRINGW            ,0),
01545           USM(TB_GETSTRINGA            ,0),
01546           USM(TB_UNKWN45D              ,8),
01547           USM(TB_SETHOTITEM2           ,0),
01548           USM(TB_SETLISTGAP            ,0),
01549           USM(TB_GETIMAGELISTCOUNT     ,0),
01550           USM(TB_GETIDEALSIZE          ,0),
01551           USM(TB_UNKWN464              ,0),
01552           {0,0,0} };
01553 
01554 static const USER_MSG tooltips_array[] = {
01555           USM(TTM_ACTIVATE             ,0),
01556           USM(TTM_SETDELAYTIME         ,0),
01557           USM(TTM_ADDTOOLA             ,0),
01558           USM(TTM_DELTOOLA             ,0),
01559           USM(TTM_NEWTOOLRECTA         ,0),
01560           USM(TTM_RELAYEVENT           ,0),
01561           USM(TTM_GETTOOLINFOA         ,0),
01562           USM(TTM_HITTESTA             ,0),
01563           USM(TTM_GETTEXTA             ,0),
01564           USM(TTM_UPDATETIPTEXTA       ,0),
01565           USM(TTM_GETTOOLCOUNT         ,0),
01566           USM(TTM_ENUMTOOLSA           ,0),
01567           USM(TTM_GETCURRENTTOOLA      ,0),
01568           USM(TTM_WINDOWFROMPOINT      ,0),
01569           USM(TTM_TRACKACTIVATE        ,0),
01570           USM(TTM_TRACKPOSITION        ,0),
01571           USM(TTM_SETTIPBKCOLOR        ,0),
01572           USM(TTM_SETTIPTEXTCOLOR      ,0),
01573           USM(TTM_GETDELAYTIME         ,0),
01574           USM(TTM_GETTIPBKCOLOR        ,0),
01575           USM(TTM_GETTIPTEXTCOLOR      ,0),
01576           USM(TTM_SETMAXTIPWIDTH       ,0),
01577           USM(TTM_GETMAXTIPWIDTH       ,0),
01578           USM(TTM_SETMARGIN            ,0),
01579           USM(TTM_GETMARGIN            ,0),
01580           USM(TTM_POP                  ,0),
01581           USM(TTM_UPDATE               ,0),
01582           USM(TTM_GETBUBBLESIZE        ,0),
01583           USM(TTM_ADDTOOLW             ,0),
01584           USM(TTM_DELTOOLW             ,0),
01585           USM(TTM_NEWTOOLRECTW         ,0),
01586           USM(TTM_GETTOOLINFOW         ,0),
01587           USM(TTM_SETTOOLINFOW         ,0),
01588           USM(TTM_HITTESTW             ,0),
01589           USM(TTM_GETTEXTW             ,0),
01590           USM(TTM_UPDATETIPTEXTW       ,0),
01591           USM(TTM_ENUMTOOLSW           ,0),
01592           USM(TTM_GETCURRENTTOOLW      ,0),
01593           {0,0,0} };
01594 
01595 static const USER_MSG comboex_array[] = {
01596           USM(CBEM_INSERTITEMA        ,0),
01597           USM(CBEM_SETIMAGELIST       ,0),
01598           USM(CBEM_GETIMAGELIST       ,0),
01599           USM(CBEM_GETITEMA           ,0),
01600           USM(CBEM_SETITEMA           ,0),
01601           USM(CBEM_GETCOMBOCONTROL    ,0),
01602           USM(CBEM_GETEDITCONTROL     ,0),
01603           USM(CBEM_SETEXSTYLE         ,0),
01604           USM(CBEM_GETEXTENDEDSTYLE   ,0),
01605           USM(CBEM_HASEDITCHANGED     ,0),
01606           USM(CBEM_INSERTITEMW        ,0),
01607           USM(CBEM_SETITEMW           ,0),
01608           USM(CBEM_GETITEMW           ,0),
01609           USM(CBEM_SETEXTENDEDSTYLE   ,0),
01610           {0,0,0} };
01611 
01612 static const USER_MSG propsht_array[] = {
01613           USM(PSM_SETCURSEL           ,0),
01614           USM(PSM_REMOVEPAGE          ,0),
01615           USM(PSM_ADDPAGE             ,0),
01616           USM(PSM_CHANGED             ,0),
01617           USM(PSM_RESTARTWINDOWS      ,0),
01618           USM(PSM_REBOOTSYSTEM        ,0),
01619           USM(PSM_CANCELTOCLOSE       ,0),
01620           USM(PSM_QUERYSIBLINGS       ,0),
01621           USM(PSM_UNCHANGED           ,0),
01622           USM(PSM_APPLY               ,0),
01623           USM(PSM_SETTITLEA           ,0),
01624           USM(PSM_SETWIZBUTTONS       ,0),
01625           USM(PSM_PRESSBUTTON         ,0),
01626           USM(PSM_SETCURSELID         ,0),
01627           USM(PSM_SETFINISHTEXTA      ,0),
01628           USM(PSM_GETTABCONTROL       ,0),
01629           USM(PSM_ISDIALOGMESSAGE     ,0),
01630           USM(PSM_GETCURRENTPAGEHWND  ,0),
01631           USM(PSM_SETTITLEW           ,0),
01632           USM(PSM_SETFINISHTEXTW      ,0),
01633           {0,0,0} };
01634 const WCHAR PropSheetInfoStr[] =
01635     {'P','r','o','p','e','r','t','y','S','h','e','e','t','I','n','f','o',0 };
01636 
01637 static const USER_MSG updown_array[] = {
01638           USM(UDM_SETRANGE            ,0),
01639           USM(UDM_GETRANGE            ,0),
01640           USM(UDM_SETPOS              ,0),
01641           USM(UDM_GETPOS              ,0),
01642           USM(UDM_SETBUDDY            ,0),
01643           USM(UDM_GETBUDDY            ,0),
01644           USM(UDM_SETACCEL            ,0),
01645           USM(UDM_GETACCEL            ,0),
01646           USM(UDM_SETBASE             ,0),
01647           USM(UDM_GETBASE             ,0),
01648           USM(UDM_SETRANGE32          ,0),
01649           USM(UDM_GETRANGE32          ,0),
01650           USM(UDM_SETPOS32            ,0),
01651           USM(UDM_GETPOS32            ,0),
01652           {0,0,0} };
01653 
01654 /* generated from:
01655  * $ for i in `grep EM_ include/richedit.h | cut -d' ' -f2 | cut -f1`; do echo -e "          USM($i\t\t,0),"; done
01656  */
01657 static const USER_MSG richedit_array[] = {
01658           {"EM_SCROLLCARET", WM_USER+49 ,0},
01659           USM(EM_CANPASTE               ,0),
01660           USM(EM_DISPLAYBAND            ,0),
01661           USM(EM_EXGETSEL               ,0),
01662           USM(EM_EXLIMITTEXT            ,0),
01663           USM(EM_EXLINEFROMCHAR         ,0),
01664           USM(EM_EXSETSEL               ,0),
01665           USM(EM_FINDTEXT               ,0),
01666           USM(EM_FORMATRANGE            ,0),
01667           USM(EM_GETCHARFORMAT          ,0),
01668           USM(EM_GETEVENTMASK           ,0),
01669           USM(EM_GETOLEINTERFACE        ,0),
01670           USM(EM_GETPARAFORMAT          ,0),
01671           USM(EM_GETSELTEXT             ,0),
01672           USM(EM_HIDESELECTION          ,0),
01673           USM(EM_PASTESPECIAL           ,0),
01674           USM(EM_REQUESTRESIZE          ,0),
01675           USM(EM_SELECTIONTYPE          ,0),
01676           USM(EM_SETBKGNDCOLOR          ,0),
01677           USM(EM_SETCHARFORMAT          ,0),
01678           USM(EM_SETEVENTMASK           ,0),
01679           USM(EM_SETOLECALLBACK         ,0),
01680           USM(EM_SETPARAFORMAT          ,0),
01681           USM(EM_SETTARGETDEVICE        ,0),
01682           USM(EM_STREAMIN               ,0),
01683           USM(EM_STREAMOUT              ,0),
01684           USM(EM_GETTEXTRANGE           ,0),
01685           USM(EM_FINDWORDBREAK          ,0),
01686           USM(EM_SETOPTIONS             ,0),
01687           USM(EM_GETOPTIONS             ,0),
01688           USM(EM_FINDTEXTEX             ,0),
01689           USM(EM_GETWORDBREAKPROCEX     ,0),
01690           USM(EM_SETWORDBREAKPROCEX     ,0),
01691           USM(EM_SETUNDOLIMIT           ,0),
01692           USM(EM_REDO                   ,0),
01693           USM(EM_CANREDO                ,0),
01694           USM(EM_GETUNDONAME            ,0),
01695           USM(EM_GETREDONAME            ,0),
01696           USM(EM_STOPGROUPTYPING        ,0),
01697           USM(EM_SETTEXTMODE            ,0),
01698           USM(EM_GETTEXTMODE            ,0),
01699           USM(EM_AUTOURLDETECT          ,0),
01700           USM(EM_GETAUTOURLDETECT       ,0),
01701           USM(EM_SETPALETTE             ,0),
01702           USM(EM_GETTEXTEX              ,0),
01703           USM(EM_GETTEXTLENGTHEX        ,0),
01704           USM(EM_SHOWSCROLLBAR          ,0),
01705           USM(EM_SETTEXTEX              ,0),
01706           USM(EM_SETPUNCTUATION         ,0),
01707           USM(EM_GETPUNCTUATION         ,0),
01708           USM(EM_SETWORDWRAPMODE        ,0),
01709           USM(EM_GETWORDWRAPMODE        ,0),
01710           USM(EM_SETIMECOLOR            ,0),
01711           USM(EM_GETIMECOLOR            ,0),
01712           USM(EM_SETIMEOPTIONS          ,0),
01713           USM(EM_GETIMEOPTIONS          ,0),
01714           USM(EM_CONVPOSITION           ,0),
01715           USM(EM_SETLANGOPTIONS         ,0),
01716           USM(EM_GETLANGOPTIONS         ,0),
01717           USM(EM_GETIMECOMPMODE         ,0),
01718           USM(EM_FINDTEXTW              ,0),
01719           USM(EM_FINDTEXTEXW            ,0),
01720           USM(EM_RECONVERSION           ,0),
01721           USM(EM_SETIMEMODEBIAS         ,0),
01722           USM(EM_GETIMEMODEBIAS         ,0),
01723           USM(EM_SETBIDIOPTIONS         ,0),
01724           USM(EM_GETBIDIOPTIONS         ,0),
01725           USM(EM_SETTYPOGRAPHYOPTIONS   ,0),
01726           USM(EM_GETTYPOGRAPHYOPTIONS   ,0),
01727           USM(EM_SETEDITSTYLE           ,0),
01728           USM(EM_GETEDITSTYLE           ,0),
01729           USM(EM_OUTLINE                ,0),
01730           USM(EM_GETSCROLLPOS           ,0),
01731           USM(EM_SETSCROLLPOS           ,0),
01732           USM(EM_SETFONTSIZE            ,0),
01733           USM(EM_GETZOOM                ,0),
01734           USM(EM_SETZOOM                ,0),
01735           {0,0,0} };
01736 
01737 #undef SZOF
01738 #undef USM
01739 
01740 static CONTROL_CLASS  cc_array[] = {
01741     {WC_COMBOBOXEXW,    comboex_array,  0},
01742     {WC_PROPSHEETW,     propsht_array,  0},
01743     {REBARCLASSNAMEW,   rebar_array,    0},
01744     {TOOLBARCLASSNAMEW, toolbar_array,  0},
01745     {TOOLTIPS_CLASSW,   tooltips_array, 0},
01746     {UPDOWN_CLASSW,     updown_array,   0},
01747     {RICHEDIT_CLASS20W, richedit_array, 0},
01748     {0, 0, 0} };
01749 
01750 
01751 /************************************************************************/
01752 
01753 
01754 /* WM_NOTIFY function codes display */
01755 
01756 typedef struct
01757 {
01758     const char *name;     /* name of notify message        */
01759     UINT        value;     /* notify code value             */
01760     UINT        len;       /* length of extra space to dump */
01761 } SPY_NOTIFY;
01762 
01763 #define SPNFY(a,b) { #a ,a,sizeof(b)-sizeof(NMHDR)}
01764 
01765 /* Array MUST be in descending order by the 'value' field  */
01766 /* (since value is UNSIGNED, 0xffffffff is largest and     */
01767 /*  0xfffffffe is smaller). A binary search is used to     */
01768 /* locate the correct 'value'.                             */
01769 static const SPY_NOTIFY spnfy_array[] = {
01770     /*  common        0U       to  0U-99U  */
01771     SPNFY(NM_OUTOFMEMORY,        NMHDR),
01772     SPNFY(NM_CLICK,              NMHDR),
01773     SPNFY(NM_DBLCLK,             NMHDR),
01774     SPNFY(NM_RETURN,             NMHDR),
01775     SPNFY(NM_RCLICK,             NMHDR),
01776     SPNFY(NM_RDBLCLK,            NMHDR),
01777     SPNFY(NM_SETFOCUS,           NMHDR),
01778     SPNFY(NM_KILLFOCUS,          NMHDR),
01779     SPNFY(NM_CUSTOMDRAW,         NMCUSTOMDRAW),
01780     SPNFY(NM_HOVER,              NMHDR),
01781     SPNFY(NM_NCHITTEST,          NMMOUSE),
01782     SPNFY(NM_KEYDOWN,            NMKEY),
01783     SPNFY(NM_RELEASEDCAPTURE,    NMHDR),
01784     SPNFY(NM_SETCURSOR,          NMMOUSE),
01785     SPNFY(NM_CHAR,               NMCHAR),
01786     SPNFY(NM_TOOLTIPSCREATED,    NMTOOLTIPSCREATED),
01787     /* Listview       0U-100U  to  0U-199U  */
01788     SPNFY(LVN_ITEMCHANGING,      NMLISTVIEW),
01789     SPNFY(LVN_ITEMCHANGED,       NMLISTVIEW),
01790     SPNFY(LVN_INSERTITEM,        NMLISTVIEW),
01791     SPNFY(LVN_DELETEITEM,        NMLISTVIEW),
01792     SPNFY(LVN_DELETEALLITEMS,    NMLISTVIEW),
01793     SPNFY(LVN_BEGINLABELEDITA,   NMLVDISPINFOA),
01794     SPNFY(LVN_ENDLABELEDITA,     NMLVDISPINFOA),
01795     SPNFY(LVN_COLUMNCLICK,       NMLISTVIEW),
01796     SPNFY(LVN_BEGINDRAG,         NMLISTVIEW),
01797     SPNFY(LVN_BEGINRDRAG,        NMLISTVIEW),
01798     SPNFY(LVN_ODCACHEHINT,       NMLVCACHEHINT),
01799     SPNFY(LVN_ITEMACTIVATE,      NMITEMACTIVATE),
01800     SPNFY(LVN_ODSTATECHANGED,    NMLVODSTATECHANGE),
01801     SPNFY(LVN_HOTTRACK,          NMLISTVIEW),
01802     SPNFY(LVN_GETDISPINFOA,      NMLVDISPINFOA),
01803     SPNFY(LVN_SETDISPINFOA,      NMLVDISPINFOA),
01804     SPNFY(LVN_ODFINDITEMA,       NMLVFINDITEMA),
01805     SPNFY(LVN_KEYDOWN,           NMLVKEYDOWN),
01806     SPNFY(LVN_MARQUEEBEGIN,      NMLISTVIEW),
01807     SPNFY(LVN_GETINFOTIPA,       NMLVGETINFOTIPA),
01808     SPNFY(LVN_GETINFOTIPW,       NMLVGETINFOTIPW),
01809     SPNFY(LVN_BEGINLABELEDITW,   NMLVDISPINFOW),
01810     SPNFY(LVN_ENDLABELEDITW,     NMLVDISPINFOW),
01811     SPNFY(LVN_GETDISPINFOW,      NMLVDISPINFOW),
01812     SPNFY(LVN_SETDISPINFOW,      NMLVDISPINFOW),
01813     SPNFY(LVN_ODFINDITEMW,       NMLVFINDITEMW),
01814     /* PropertySheet  0U-200U  to  0U-299U  */
01815     SPNFY(PSN_SETACTIVE,         PSHNOTIFY),
01816     SPNFY(PSN_KILLACTIVE,        PSHNOTIFY),
01817     SPNFY(PSN_APPLY,             PSHNOTIFY),
01818     SPNFY(PSN_RESET,             PSHNOTIFY),
01819     SPNFY(PSN_HELP,              PSHNOTIFY),
01820     SPNFY(PSN_WIZBACK,           PSHNOTIFY),
01821     SPNFY(PSN_WIZNEXT,           PSHNOTIFY),
01822     SPNFY(PSN_WIZFINISH,         PSHNOTIFY),
01823     SPNFY(PSN_QUERYCANCEL,       PSHNOTIFY),
01824     SPNFY(PSN_GETOBJECT,         NMOBJECTNOTIFY),
01825     SPNFY(PSN_TRANSLATEACCELERATOR, PSHNOTIFY),
01826     SPNFY(PSN_QUERYINITIALFOCUS, PSHNOTIFY),
01827     /* Header         0U-300U  to  0U-399U  */
01828     SPNFY(HDN_ITEMCHANGINGA,     NMHEADERA),
01829     SPNFY(HDN_ITEMCHANGEDA,      NMHEADERA),
01830     SPNFY(HDN_ITEMCLICKA,        NMHEADERA),
01831     SPNFY(HDN_ITEMDBLCLICKA,     NMHEADERA),
01832     SPNFY(HDN_DIVIDERDBLCLICKA,  NMHEADERA),
01833     SPNFY(HDN_BEGINTRACKA,       NMHEADERA),
01834     SPNFY(HDN_ENDTRACKA,         NMHEADERA),
01835     SPNFY(HDN_TRACKA,            NMHEADERA),
01836     SPNFY(HDN_GETDISPINFOA,      NMHEADERA),
01837     SPNFY(HDN_BEGINDRAG,         NMHDR),
01838     SPNFY(HDN_ENDDRAG,           NMHDR),
01839     SPNFY(HDN_ITEMCHANGINGW,     NMHDR),
01840     SPNFY(HDN_ITEMCHANGEDW,      NMHDR),
01841     SPNFY(HDN_ITEMCLICKW,        NMHDR),
01842     SPNFY(HDN_ITEMDBLCLICKW,     NMHDR),
01843     SPNFY(HDN_DIVIDERDBLCLICKW,  NMHDR),
01844     SPNFY(HDN_BEGINTRACKW,       NMHDR),
01845     SPNFY(HDN_ENDTRACKW,         NMHDR),
01846     SPNFY(HDN_TRACKW,            NMHDR),
01847     SPNFY(HDN_GETDISPINFOW,      NMHDR),
01848     /* Treeview       0U-400U  to  0U-499U  */
01849     SPNFY(TVN_SELCHANGINGA,      NMTREEVIEWA),
01850     SPNFY(TVN_SELCHANGEDA,       NMTREEVIEWA),
01851     SPNFY(TVN_GETDISPINFOA,      NMTVDISPINFOA),
01852     SPNFY(TVN_SETDISPINFOA,      NMTVDISPINFOA),
01853     SPNFY(TVN_ITEMEXPANDINGA,    NMTREEVIEWA),
01854     SPNFY(TVN_ITEMEXPANDEDA,     NMTREEVIEWA),
01855     SPNFY(TVN_BEGINDRAGA,        NMTREEVIEWA),
01856     SPNFY(TVN_BEGINRDRAGA,       NMTREEVIEWA),
01857     SPNFY(TVN_DELETEITEMA,       NMTREEVIEWA),
01858     SPNFY(TVN_BEGINLABELEDITA,   NMTVDISPINFOA),
01859     SPNFY(TVN_ENDLABELEDITA,     NMTVDISPINFOA),
01860     SPNFY(TVN_KEYDOWN,           NMTVKEYDOWN),
01861     SPNFY(TVN_SELCHANGINGW,      NMTREEVIEWW),
01862     SPNFY(TVN_SELCHANGEDW,       NMTREEVIEWW),
01863     SPNFY(TVN_GETDISPINFOW,      NMTVDISPINFOW),
01864     SPNFY(TVN_SETDISPINFOW,      NMTVDISPINFOW),
01865     SPNFY(TVN_ITEMEXPANDINGW,    NMTREEVIEWW),
01866     SPNFY(TVN_ITEMEXPANDEDW,     NMTREEVIEWW),
01867     SPNFY(TVN_BEGINDRAGW,        NMTREEVIEWW),
01868     SPNFY(TVN_BEGINRDRAGW,       NMTREEVIEWW),
01869     SPNFY(TVN_DELETEITEMW,       NMTREEVIEWW),
01870     SPNFY(TVN_BEGINLABELEDITW,   NMTVDISPINFOW),
01871     SPNFY(TVN_ENDLABELEDITW,     NMTVDISPINFOW),
01872     /* Tooltips       0U-520U  to  0U-549U  */
01873     SPNFY(TTN_GETDISPINFOA,      NMHDR),
01874     SPNFY(TTN_SHOW,              NMHDR),
01875     SPNFY(TTN_POP,               NMHDR),
01876     SPNFY(TTN_GETDISPINFOW,      NMHDR),
01877     /* Tab            0U-550U  to  0U-580U  */
01878     SPNFY(TCN_KEYDOWN,           NMHDR),
01879     SPNFY(TCN_SELCHANGE,         NMHDR),
01880     SPNFY(TCN_SELCHANGING,       NMHDR),
01881     SPNFY(TCN_GETOBJECT,         NMHDR),
01882     /* Common Dialog  0U-601U  to  0U-699U  */
01883     SPNFY(CDN_INITDONE,          OFNOTIFYA),
01884     SPNFY(CDN_SELCHANGE,         OFNOTIFYA),
01885     SPNFY(CDN_FOLDERCHANGE,      OFNOTIFYA),
01886     SPNFY(CDN_SHAREVIOLATION,    OFNOTIFYA),
01887     SPNFY(CDN_HELP,              OFNOTIFYA),
01888     SPNFY(CDN_FILEOK,            OFNOTIFYA),
01889     SPNFY(CDN_TYPECHANGE,        OFNOTIFYA),
01890     /* Toolbar        0U-700U  to  0U-720U  */
01891     SPNFY(TBN_GETBUTTONINFOA,    NMTOOLBARA),
01892     SPNFY(TBN_BEGINDRAG,         NMTOOLBARA),
01893     SPNFY(TBN_ENDDRAG,           NMTOOLBARA),
01894     SPNFY(TBN_BEGINADJUST,       NMHDR),
01895     SPNFY(TBN_ENDADJUST,         NMHDR),
01896     SPNFY(TBN_RESET,             NMHDR),
01897     SPNFY(TBN_QUERYINSERT,       NMTOOLBARA),
01898     SPNFY(TBN_QUERYDELETE,       NMTOOLBARA),
01899     SPNFY(TBN_TOOLBARCHANGE,     NMHDR),
01900     SPNFY(TBN_CUSTHELP,          NMHDR),
01901     SPNFY(TBN_DROPDOWN,          NMTOOLBARA),
01902     SPNFY(TBN_GETOBJECT,         NMOBJECTNOTIFY),
01903     SPNFY(TBN_HOTITEMCHANGE,     NMTBHOTITEM),
01904     SPNFY(TBN_DRAGOUT,           NMTOOLBARA),
01905     SPNFY(TBN_DELETINGBUTTON,    NMTOOLBARA),
01906     SPNFY(TBN_GETDISPINFOA,      NMTBDISPINFOA),
01907     SPNFY(TBN_GETDISPINFOW,      NMTBDISPINFOW),
01908     SPNFY(TBN_GETINFOTIPA,       NMTBGETINFOTIPA),
01909     SPNFY(TBN_GETINFOTIPW,       NMTBGETINFOTIPW),
01910     SPNFY(TBN_GETBUTTONINFOW,    NMTOOLBARW),
01911     /* Up/Down        0U-721U  to  0U-740U  */
01912     SPNFY(UDN_DELTAPOS,          NM_UPDOWN),
01913     /* Month Calendar 0U-750U  to  0U-759U  */
01914     /* ******************* WARNING ***************************** */
01915     /* The following appear backwards but needs to be this way.  */
01916     /* The reason is that MS (and us) define the MCNs as         */
01917     /*         MCN_FIRST + n                                     */
01918     /* instead of the way ALL other notifications are            */
01919     /*         TBN_FIRST - n                                     */
01920     /* The only place that this is important is in this list     */
01921     /*                                                           */
01922     /* Also since the same error was made with the DTN_ items,   */
01923     /* they overlay the MCN_ and need to be inserted in the      */
01924     /* other section of the table so that it is in order for     */
01925     /* the binary search.                                        */
01926     /*                                                           */
01927     /* Thank you MS for your obvious quality control!!           */
01928     /* ******************* WARNING ***************************** */
01929     /* Date/Time      0U-760U  to  0U-799U  */
01930     /* SPNFY(MCN_SELECT,            NMHDR), */
01931     /* SPNFY(MCN_GETDAYSTATE,       NMHDR), */
01932     /* SPNFY(MCN_SELCHANGE,         NMHDR), */
01933     /* ******************* WARNING ***************************** */
01934     /* The following appear backwards but needs to be this way.  */
01935     /* The reason is that MS (and us) define the MCNs as         */
01936     /*         DTN_FIRST + n                                     */
01937     /* instead of the way ALL other notifications are            */
01938     /*         TBN_FIRST - n                                     */
01939     /* The only place that this is important is in this list     */
01940     /* ******************* WARNING ***************************** */
01941     SPNFY(DTN_FORMATQUERYW,      NMHDR),
01942     SPNFY(DTN_FORMATW,           NMHDR),
01943     SPNFY(DTN_WMKEYDOWNW,        NMHDR),
01944     SPNFY(DTN_USERSTRINGW,       NMHDR),
01945     SPNFY(MCN_SELECT,            NMHDR),
01946     SPNFY(MCN_GETDAYSTATE,       NMHDR),
01947     SPNFY(MCN_SELCHANGE,         NMHDR),
01948     SPNFY(DTN_CLOSEUP,           NMHDR),
01949     SPNFY(DTN_DROPDOWN,          NMHDR),
01950     SPNFY(DTN_FORMATQUERYA,      NMHDR),
01951     SPNFY(DTN_FORMATA,           NMHDR),
01952     SPNFY(DTN_WMKEYDOWNA,        NMHDR),
01953     SPNFY(DTN_USERSTRINGA,       NMHDR),
01954     SPNFY(DTN_DATETIMECHANGE,    NMHDR),
01955     /* ComboBoxEx     0U-800U  to  0U-830U  */
01956     SPNFY(CBEN_GETDISPINFOA,     NMCOMBOBOXEXA),
01957     SPNFY(CBEN_INSERTITEM,       NMCOMBOBOXEXA),
01958     SPNFY(CBEN_DELETEITEM,       NMCOMBOBOXEXA),
01959     SPNFY(CBEN_BEGINEDIT,        NMHDR),
01960     SPNFY(CBEN_ENDEDITA,         NMCBEENDEDITA),
01961     SPNFY(CBEN_ENDEDITW,         NMCBEENDEDITW),
01962     SPNFY(CBEN_GETDISPINFOW,     NMCOMBOBOXEXW),
01963     SPNFY(CBEN_DRAGBEGINA,       NMCBEDRAGBEGINA),
01964     SPNFY(CBEN_DRAGBEGINW,       NMCBEDRAGBEGINW),
01965     /* Rebar          0U-831U  to  0U-859U  */
01966     SPNFY(RBN_HEIGHTCHANGE,      NMHDR),
01967     SPNFY(RBN_GETOBJECT,         NMOBJECTNOTIFY),
01968     SPNFY(RBN_LAYOUTCHANGED,     NMHDR),
01969     SPNFY(RBN_AUTOSIZE,          NMRBAUTOSIZE),
01970     SPNFY(RBN_BEGINDRAG,         NMREBAR),
01971     SPNFY(RBN_ENDDRAG,           NMREBAR),
01972     SPNFY(RBN_DELETINGBAND,      NMREBAR),
01973     SPNFY(RBN_DELETEDBAND,       NMREBAR),
01974     SPNFY(RBN_CHILDSIZE,         NMREBARCHILDSIZE),
01975     /* IP Adderss     0U-860U  to  0U-879U  */
01976     SPNFY(IPN_FIELDCHANGED,      NMHDR),
01977     /* Status bar     0U-880U  to  0U-899U  */
01978     SPNFY(SBN_SIMPLEMODECHANGE,  NMHDR),
01979     /* Pager          0U-900U  to  0U-950U  */
01980     SPNFY(PGN_SCROLL,            NMPGSCROLL),
01981     SPNFY(PGN_CALCSIZE,          NMPGCALCSIZE),
01982     {0,0,0}};
01983 static const SPY_NOTIFY *end_spnfy_array;     /* ptr to last good entry in array */
01984 #undef SPNFY
01985 
01986 static BOOL SPY_Exclude[SPY_MAX_MSGNUM+1];
01987 static BOOL SPY_ExcludeDWP = 0;
01988 
01989 #define SPY_EXCLUDE(msg) \
01990     (SPY_Exclude[(msg) > SPY_MAX_MSGNUM ? SPY_MAX_MSGNUM : (msg)])
01991 
01992 
01993 typedef struct
01994 {
01995     UINT       msgnum;           /* message number */
01996     HWND       msg_hwnd;         /* window handle for message          */
01997     WPARAM     wParam;           /* message parameter                  */
01998     LPARAM     lParam;           /* message parameter                  */
01999     INT        data_len;         /* length of data to dump             */
02000     char       msg_name[60];     /* message name (see SPY_GetMsgName)  */
02001     WCHAR      wnd_class[60];    /* window class name (full)           */
02002     WCHAR      wnd_name[16];     /* window name for message            */
02003 } SPY_INSTANCE;
02004 
02005 static int indent_tls_index;
02006 
02007 /***********************************************************************
02008  *           get_indent_level
02009  */
02010 __inline static INT_PTR get_indent_level(void)
02011 {
02012     return (INT_PTR)TlsGetValue( indent_tls_index );
02013 }
02014 
02015 
02016 /***********************************************************************
02017  *           set_indent_level
02018  */
02019 __inline static void set_indent_level( INT_PTR level )
02020 {
02021     TlsSetValue( indent_tls_index, (void *)level );
02022 }
02023 
02024 
02025 /***********************************************************************
02026  *           SPY_GetMsgInternal
02027  */
02028 static const char *SPY_GetMsgInternal( UINT msg )
02029 {
02030     if (msg <= SPY_MAX_MSGNUM)
02031         return MessageTypeNames[msg];
02032 
02033     if (msg >= LVM_FIRST && msg <= LVM_FIRST + SPY_MAX_LVMMSGNUM)
02034         return LVMMessageTypeNames[msg-LVM_FIRST];
02035 
02036     if (msg >= TV_FIRST && msg <= TV_FIRST + SPY_MAX_TVMSGNUM)
02037         return TVMessageTypeNames[msg-TV_FIRST];
02038 
02039     if (msg >= HDM_FIRST && msg <= HDM_FIRST + SPY_MAX_HDMMSGNUM)
02040         return HDMMessageTypeNames[msg-HDM_FIRST];
02041 
02042     if (msg >= TCM_FIRST && msg <= TCM_FIRST + SPY_MAX_TCMMSGNUM)
02043         return TCMMessageTypeNames[msg-TCM_FIRST];
02044 
02045     if (msg >= PGM_FIRST && msg <= PGM_FIRST + SPY_MAX_PGMMSGNUM)
02046         return PGMMessageTypeNames[msg-PGM_FIRST];
02047 
02048     if (msg >= CCM_FIRST && msg <= CCM_FIRST + SPY_MAX_CCMMSGNUM)
02049         return CCMMessageTypeNames[msg-CCM_FIRST];
02050 #ifndef __REACTOS__
02051     if (msg >= WM_WINE_DESTROYWINDOW && msg <= WM_WINE_DESTROYWINDOW + SPY_MAX_WINEMSGNUM)
02052         return WINEMessageTypeNames[msg-WM_WINE_DESTROYWINDOW];
02053 #endif
02054     return NULL;
02055 }
02056 
02057 /***********************************************************************
02058  *           SPY_Bsearch_Msg
02059  */
02060 static const USER_MSG *SPY_Bsearch_Msg( const USER_MSG *first, const USER_MSG *last, UINT code)
02061 {
02062     INT count;
02063     const USER_MSG *test;
02064 
02065     while (last >= first) {
02066         count = 1 + last - first;
02067         if (count < 3) {
02068 #if DEBUG_SPY
02069             TRACE("code=%d, f-value=%d, f-name=%s, l-value=%d, l-name=%s, l-len=%d,\n",
02070                code, first->value, first->name, last->value, last->name, last->len);
02071 #endif
02072             if (first->value == code) return first;
02073             if (last->value == code) return last;
02074             return NULL;
02075         }
02076         count = count / 2;
02077         test = first + count;
02078 #if DEBUG_SPY
02079         TRACE("first=%p, last=%p, test=%p, t-value=%d, code=%d, count=%d\n",
02080            first, last, test, test->value, code, count);
02081 #endif
02082         if (test->value == code) return test;
02083         if (test->value > code)
02084             last = test - 1;
02085         else
02086             first = test + 1;
02087     }
02088     return NULL;
02089 }
02090 
02091 /***********************************************************************
02092  *           SPY_GetClassLongOffsetName
02093  *
02094  * Gets the name of a class long offset.
02095  */
02096 const char *SPY_GetClassLongOffsetName( INT offset )
02097 {
02098     INT index;
02099     if (offset < 0 && offset % 2 == 0 && ((index = -(offset + 8) / 2) <
02100         sizeof(ClassLongOffsetNames) / sizeof(*ClassLongOffsetNames))) 
02101     {
02102         return ClassLongOffsetNames[index];
02103     }
02104 
02105     return "?";
02106 }
02107 
02108 /***********************************************************************
02109  *           SPY_GetClassName
02110  *
02111  *  Sets the value of "wnd_class" member of the instance structure.
02112  */
02113 static void SPY_GetClassName( SPY_INSTANCE *sp_e )
02114 {
02115     DWORD save_error;
02116 
02117     /* save and restore error code over the next call */
02118     save_error = GetLastError();
02119     /* special code to detect a property sheet dialog   */
02120     if ((GetClassLongPtrW(sp_e->msg_hwnd, GCW_ATOM) == (ULONG_PTR)WC_DIALOG) &&
02121         (GetPropW(sp_e->msg_hwnd, PropSheetInfoStr))) {
02122         strcpyW(sp_e->wnd_class, WC_PROPSHEETW);
02123     }
02124     else {
02125         GetClassNameW(sp_e->msg_hwnd, sp_e->wnd_class, sizeof(sp_e->wnd_class)/sizeof(WCHAR));
02126     }
02127     SetLastError(save_error);
02128 }
02129 
02130 /***********************************************************************
02131  *           SPY_GetMsgStuff
02132  *
02133  *  Get message name and other information for dumping
02134  */
02135 static void SPY_GetMsgStuff( SPY_INSTANCE *sp_e )
02136 {
02137     const USER_MSG *p;
02138     const char *msg_name = SPY_GetMsgInternal( sp_e->msgnum );
02139 
02140     sp_e->data_len = 0;
02141     if (!msg_name)
02142     {
02143         INT i = 0;
02144 
02145         if (sp_e->msgnum >= 0xc000)
02146         {
02147             if (GlobalGetAtomNameA( sp_e->msgnum, sp_e->msg_name+1, sizeof(sp_e->msg_name)-2 ))
02148             {
02149                 sp_e->msg_name[0] = '\"';
02150                 strcat( sp_e->msg_name, "\"" );
02151                 return;
02152             }
02153         }
02154         if (!sp_e->wnd_class[0]) SPY_GetClassName(sp_e);
02155 
02156 #if DEBUG_SPY
02157         TRACE("looking class %s\n", debugstr_w(sp_e->wnd_class));
02158 #endif
02159 
02160         while (cc_array[i].classname &&
02161                strcmpiW(cc_array[i].classname, sp_e->wnd_class) != 0) i++;
02162 
02163         if (cc_array[i].classname)
02164         {
02165 #if DEBUG_SPY
02166             TRACE("process class %s, first %p, last %p\n",
02167                   debugstr_w(cc_array[i].classname), cc_array[i].classmsg,
02168                   cc_array[i].lastmsg);
02169 #endif
02170             p = SPY_Bsearch_Msg (cc_array[i].classmsg, cc_array[i].lastmsg,
02171                                  sp_e->msgnum);
02172             if (p) {
02173                 lstrcpynA (sp_e->msg_name, p->name, sizeof(sp_e->msg_name));
02174                 sp_e->data_len = p->len;
02175                 return;
02176             }
02177         }
02178         if (sp_e->msgnum >= WM_USER && sp_e->msgnum <= WM_APP)
02179             sprintf( sp_e->msg_name, "WM_USER+%d", sp_e->msgnum - WM_USER );
02180         else
02181             sprintf( sp_e->msg_name, "%04x", sp_e->msgnum );
02182     }
02183     else
02184     {
02185         lstrcpynA(sp_e->msg_name, msg_name, sizeof(sp_e->msg_name));
02186     }
02187 }
02188 
02189 /***********************************************************************
02190  *           SPY_GetWndName
02191  *
02192  *  Sets the value of "wnd_name" and "wnd_class" members of the
02193  *  instance structure.
02194  *
02195  */
02196 static void SPY_GetWndName( SPY_INSTANCE *sp_e )
02197 {
02198     INT len;
02199 
02200     SPY_GetClassName( sp_e );
02201 
02202     len = InternalGetWindowText(sp_e->msg_hwnd, sp_e->wnd_name, sizeof(sp_e->wnd_name)/sizeof(WCHAR));
02203     if(!len) /* get class name */
02204     {
02205         LPWSTR dst = sp_e->wnd_name;
02206         LPWSTR src = sp_e->wnd_class;
02207         int n = sizeof(sp_e->wnd_name)/sizeof(WCHAR) - 3;
02208         *dst++ = '{';
02209         while ((n-- > 0) && *src) *dst++ = *src++;
02210         *dst++ = '}';
02211         *dst = 0;
02212     }
02213 }
02214 
02215 /***********************************************************************
02216  *           SPY_GetMsgName
02217  *
02218  *  ****  External function  ****
02219  *
02220  *  Get message name
02221  */
02222 const char *SPY_GetMsgName( UINT msg, HWND hWnd )
02223 {
02224     SPY_INSTANCE ext_sp_e;
02225 
02226     ext_sp_e.msgnum = msg;
02227     ext_sp_e.msg_hwnd   = hWnd;
02228     ext_sp_e.lParam = 0;
02229     ext_sp_e.wParam = 0;
02230     ext_sp_e.wnd_class[0] = 0;
02231     SPY_GetMsgStuff(&ext_sp_e);
02232     return wine_dbg_sprintf("%s", ext_sp_e.msg_name);
02233 }
02234 
02235 /***********************************************************************
02236  *           SPY_GetVKeyName
02237  */
02238 const char *SPY_GetVKeyName(WPARAM wParam)
02239 {
02240     const char *vk_key_name;
02241 
02242     if(wParam <= SPY_MAX_VKKEYSNUM && VK_KeyNames[wParam])
02243         vk_key_name = VK_KeyNames[wParam];
02244     else
02245         vk_key_name = "VK_???";
02246 
02247     return vk_key_name;
02248 }
02249 
02250 /***********************************************************************
02251  *           SPY_Bsearch_Notify
02252  */
02253 static const SPY_NOTIFY *SPY_Bsearch_Notify( const SPY_NOTIFY *first, const SPY_NOTIFY *last, UINT code)
02254 {
02255     INT count;
02256     const SPY_NOTIFY *test;
02257 
02258     while (last >= first) {
02259         count = 1 + last - first;
02260         if (count < 3) {
02261 #if DEBUG_SPY
02262             TRACE("code=%d, f-value=%d, f-name=%s, l-value=%d, l-name=%s, l-len=%d,\n",
02263                code, first->value, first->name, last->value, last->name, last->len);
02264 #endif
02265             if (first->value == code) return first;
02266             if (last->value == code) return last;
02267             return NULL;
02268         }
02269         count = count / 2;
02270         test = first + count;
02271 #if DEBUG_SPY
02272         TRACE("first=%p, last=%p, test=%p, t-value=%d, code=%d, count=%d\n",
02273            first, last, test, test->value, code, count);
02274 #endif
02275         if (test->value == code) return test;
02276         if (test->value < code)
02277             last = test - 1;
02278         else
02279             first = test + 1;
02280     }
02281     return NULL;
02282 }
02283 
02284 /***********************************************************************
02285  *           SPY_DumpMem
02286  */
02287 static void SPY_DumpMem (LPCSTR header, const UINT *q, INT len)
02288 {
02289     int i;
02290 
02291     for(i=0; i<len-12; i+=16) {
02292         TRACE("%s [%04x] %08x %08x %08x %08x\n",
02293               header, i, *q, *(q+1), *(q+2), *(q+3));
02294         q += 4;
02295     }
02296     switch ((len - i + 3) & (~3)) {
02297     case 16:
02298         TRACE("%s [%04x] %08x %08x %08x %08x\n",
02299               header, i, *q, *(q+1), *(q+2), *(q+3));
02300         break;
02301     case 12:
02302         TRACE("%s [%04x] %08x %08x %08x\n",
02303               header, i, *q, *(q+1), *(q+2));
02304         break;
02305     case 8:
02306         TRACE("%s [%04x] %08x %08x\n",
02307               header, i, *q, *(q+1));
02308         break;
02309     case 4:
02310         TRACE("%s [%04x] %08x\n",
02311               header, i, *q);
02312         break;
02313     default:
02314         break;
02315     }
02316 }
02317 
02318 /***********************************************************************
02319  *           SPY_DumpStructure
02320  */
02321 static void SPY_DumpStructure(const SPY_INSTANCE *sp_e, BOOL enter)
02322 {
02323     switch (sp_e->msgnum)
02324         {
02325         case LVM_INSERTITEMW:
02326         case LVM_INSERTITEMA:
02327         case LVM_SETITEMW:
02328         case LVM_SETITEMA:
02329             if (!enter) break;
02330             /* fall through */
02331         case LVM_GETITEMW:
02332         case LVM_GETITEMA:
02333             {
02334                 LPLVITEMA item = (LPLVITEMA) sp_e->lParam;
02335                 if (item) {
02336                     SPY_DumpMem ("LVITEM", (UINT*)item, sizeof(LVITEMA));
02337                 }
02338                 break;
02339             }
02340         case TCM_INSERTITEMW:
02341         case TCM_INSERTITEMA:
02342         case TCM_SETITEMW:
02343         case TCM_SETITEMA:
02344             if (!enter) break;
02345             /* fall through */
02346         case TCM_GETITEMW:
02347         case TCM_GETITEMA:
02348             {
02349                 TCITEMA *item = (TCITEMA *) sp_e->lParam;
02350                 if (item) {
02351                     SPY_DumpMem ("TCITEM", (UINT*)item, sizeof(TCITEMA));
02352                 }
02353                 break;
02354             }
02355         case TCM_ADJUSTRECT:
02356         case LVM_GETITEMRECT:
02357         case LVM_GETSUBITEMRECT:
02358             {
02359                 LPRECT rc = (LPRECT) sp_e->lParam;
02360                 if (rc) {
02361                     TRACE("lParam rect (%ld,%ld)-(%ld,%ld)\n",
02362                           rc->left, rc->top, rc->right, rc->bottom);
02363                 }
02364                 break;
02365             }
02366         case LVM_SETITEMPOSITION32:
02367             if (!enter) break;
02368             /* fall through */
02369         case LVM_GETITEMPOSITION:
02370         case LVM_GETORIGIN:
02371             {
02372                 LPPOINT point = (LPPOINT) sp_e->lParam;
02373                 if (point) {
02374                     TRACE("lParam point x=%ld, y=%ld\n", point->x, point->y);
02375                 }
02376                 break;
02377             }
02378         case SBM_SETRANGE:
02379             if (!enter && (sp_e->msgnum == SBM_SETRANGE)) break;
02380             TRACE("min=%d max=%d\n", (INT)sp_e->wParam, (INT)sp_e->lParam);
02381             break;
02382         case SBM_GETRANGE:
02383             if ((enter && (sp_e->msgnum == SBM_GETRANGE)) ||
02384                 (!enter && (sp_e->msgnum == SBM_SETRANGE))) break;
02385             {
02386                 LPINT ptmin = (LPINT) sp_e->wParam;
02387                 LPINT ptmax = (LPINT) sp_e->lParam;
02388                 if (ptmin && ptmax)
02389                     TRACE("min=%d max=%d\n", *ptmin, *ptmax);
02390                 else if (ptmin)
02391                     TRACE("min=%d max=n/a\n", *ptmin);
02392                 else if (ptmax)
02393                     TRACE("min=n/a max=%d\n", *ptmax);
02394                 break;
02395             }
02396         case EM_EXSETSEL:
02397             if (enter && sp_e->lParam)
02398             {
02399                 CHARRANGE *cr = (CHARRANGE *) sp_e->lParam;
02400                 TRACE("CHARRANGE: cpMin=%ld cpMax=%ld\n", cr->cpMin, cr->cpMax);
02401             }
02402             break;
02403         case EM_SETCHARFORMAT:
02404             if (enter && sp_e->lParam)
02405             {
02406                 CHARFORMATW *cf = (CHARFORMATW *) sp_e->lParam;
02407                 TRACE("CHARFORMAT: dwMask=0x%08lx dwEffects=", cf->dwMask);
02408                 if ((cf->dwMask & CFM_BOLD) && (cf->dwEffects & CFE_BOLD))
02409                     TRACE(" CFE_BOLD");
02410                 if ((cf->dwMask & CFM_COLOR) && (cf->dwEffects & CFE_AUTOCOLOR))
02411                     TRACE(" CFE_AUTOCOLOR");
02412                 if ((cf->dwMask & CFM_ITALIC) && (cf->dwEffects & CFE_ITALIC))
02413                     TRACE(" CFE_ITALIC");
02414                 if ((cf->dwMask & CFM_PROTECTED) && (cf->dwEffects & CFE_PROTECTED))
02415                     TRACE(" CFE_PROTECTED");
02416                 if ((cf->dwMask & CFM_STRIKEOUT) && (cf->dwEffects & CFE_STRIKEOUT))
02417                     TRACE(" CFE_STRIKEOUT");
02418                 if ((cf->dwMask & CFM_UNDERLINE) && (cf->dwEffects & CFE_UNDERLINE))
02419                     TRACE(" CFE_UNDERLINE");
02420                 TRACE("\n");
02421                 if (cf->dwMask & CFM_SIZE)
02422                     TRACE("yHeight=%ld\n", cf->yHeight);
02423                 if (cf->dwMask & CFM_OFFSET)
02424                     TRACE("yOffset=%ld\n", cf->yOffset);
02425                 if ((cf->dwMask & CFM_COLOR) && !(cf->dwEffects & CFE_AUTOCOLOR))
02426                     TRACE("crTextColor=%lx\n", cf->crTextColor);
02427                 TRACE("bCharSet=%x bPitchAndFamily=%x\n", cf->bCharSet, cf->bPitchAndFamily);
02428                 /* FIXME: we should try to be a bit more intelligent about
02429                  * whether this is in ANSI or Unicode (it could be either) */
02430                 if (cf->dwMask & CFM_FACE)
02431                     TRACE("szFaceName=%s\n", debugstr_wn(cf->szFaceName, LF_FACESIZE));
02432                 /* FIXME: handle CHARFORMAT2 too */
02433             }
02434             break;
02435         case WM_DRAWITEM:
02436             if (!enter) break;
02437             {
02438                 DRAWITEMSTRUCT *lpdis = (DRAWITEMSTRUCT*) sp_e->lParam;
02439                 TRACE("DRAWITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n",
02440                       lpdis->CtlType, lpdis->CtlID);
02441                 TRACE("itemID=0x%08x itemAction=0x%08x itemState=0x%08x\n",
02442                       lpdis->itemID, lpdis->itemAction, lpdis->itemState);
02443                 TRACE("hWnd=%p hDC=%p (%ld,%ld)-(%ld,%ld) itemData=0x%08lx\n",
02444                       lpdis->hwndItem, lpdis->hDC, lpdis->rcItem.left,
02445                       lpdis->rcItem.top, lpdis->rcItem.right,
02446                       lpdis->rcItem.bottom, lpdis->itemData);
02447             }
02448             break;
02449         case WM_MEASUREITEM:
02450             {
02451                 MEASUREITEMSTRUCT *lpmis = (MEASUREITEMSTRUCT*) sp_e->lParam;
02452                 TRACE("MEASUREITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n",
02453                       lpmis->CtlType, lpmis->CtlID);
02454                 TRACE("itemID=0x%08x itemWidth=0x%08x itemHeight=0x%08x\n",
02455                       lpmis->itemID, lpmis->itemWidth, lpmis->itemHeight);
02456                 TRACE("itemData=0x%08lx\n", lpmis->itemData);
02457             }
02458             break;
02459         case WM_NCCREATE:
02460         case WM_CREATE:
02461         {
02462             BOOL unicode;
02463             CREATESTRUCTA *cs;
02464 
02465             if (!enter) break;
02466 
02467             unicode = IsWindowUnicode(sp_e->msg_hwnd);
02468             cs = (CREATESTRUCTA *)sp_e->lParam;
02469             TRACE("%s %s ex=%08x style=%08x %d,%d %dx%d parent=%p menu=%p inst=%p params=%p\n",
02470                   unicode ? debugstr_w((LPCWSTR)cs->lpszName) : debugstr_a(cs->lpszName),
02471                   unicode ? debugstr_w((LPCWSTR)cs->lpszClass) : debugstr_a(cs->lpszClass),
02472                   cs->dwExStyle, cs->style, cs->x, cs->y, cs->cx, cs->cy,
02473                   cs->hwndParent, cs->hMenu, cs->hInstance, cs->lpCreateParams);
02474             break;
02475         }
02476         case WM_SIZE:
02477             if (!enter) break;
02478             TRACE("cx=%d cy=%d\n", LOWORD(sp_e->lParam), HIWORD(sp_e->lParam));
02479             break;
02480         case WM_WINDOWPOSCHANGED:
02481             if (!enter) break;
02482         case WM_WINDOWPOSCHANGING:
02483             {
02484                 WINDOWPOS *lpwp = (WINDOWPOS *)sp_e->lParam;
02485                 TRACE("WINDOWPOS hwnd=%p, after=%p, at (%d,%d) w=%d h=%d, flags=0x%08x\n",
02486                       lpwp->hwnd, lpwp->hwndInsertAfter, lpwp->x, lpwp->y,
02487                       lpwp->cx, lpwp->cy, lpwp->flags);
02488             }
02489             break;
02490         case WM_STYLECHANGED:
02491             if (!enter) break;
02492         case WM_STYLECHANGING:
02493             {
02494                 LPSTYLESTRUCT ss = (LPSTYLESTRUCT) sp_e->lParam;
02495                 TRACE("STYLESTRUCT: StyleOld=0x%08lx, StyleNew=0x%08lx\n",
02496                       ss->styleOld, ss->styleNew);
02497             }
02498             break;
02499         case WM_NCCALCSIZE:
02500             {
02501                 RECT *rc = (RECT *)sp_e->lParam;
02502                 TRACE("Rect (%ld,%ld)-(%ld,%ld)\n",
02503                       rc->left, rc->top, rc->right, rc->bottom);
02504             }
02505             break;
02506         case WM_NOTIFY:
02507             /* if (!enter) break; */
02508             {
02509                 NMHDR * pnmh = (NMHDR*) sp_e->lParam;
02510                 UINT *q, dumplen;
02511                 const SPY_NOTIFY *p;
02512                 WCHAR from_class[60];
02513                 DWORD save_error;
02514 
02515                 p = SPY_Bsearch_Notify (&spnfy_array[0], end_spnfy_array,
02516                                         pnmh->code);
02517                 if (p) {
02518                     TRACE("NMHDR hwndFrom=%p idFrom=0x%08lx code=%s<0x%08x>, extra=0x%x\n",
02519                           pnmh->hwndFrom, pnmh->idFrom, p->name, pnmh->code, p->len);
02520                     dumplen = p->len;
02521 
02522                     /* for CUSTOMDRAW, dump all the data for TOOLBARs */
02523                     if (pnmh->code == NM_CUSTOMDRAW) {
02524                         /* save and restore error code over the next call */
02525                         save_error = GetLastError();
02526                         GetClassNameW(pnmh->hwndFrom, from_class,
02527                                       sizeof(from_class)/sizeof(WCHAR));
02528                         SetLastError(save_error);
02529                         if (strcmpW(TOOLBARCLASSNAMEW, from_class) == 0)
02530                             dumplen = sizeof(NMTBCUSTOMDRAW)-sizeof(NMHDR);
02531                     } else if ((pnmh->code >= HDN_ITEMCHANGINGA) && (pnmh->code <= HDN_ENDDRAG)) {
02532                         dumplen = sizeof(NMHEADERA)-sizeof(NMHDR);
02533                     }
02534                     if (dumplen > 0) {
02535                         q = (UINT *)(pnmh + 1);
02536                         SPY_DumpMem ("NM extra", q, (INT)dumplen);
02537                     }
02538                 }
02539                 else
02540                     TRACE("NMHDR hwndFrom=%p idFrom=0x%08lx code=0x%08x\n",
02541                           pnmh->hwndFrom, pnmh->idFrom, pnmh->code);
02542             }
02543         default:
02544             if (sp_e->data_len > 0)
02545                 SPY_DumpMem ("MSG lParam", (UINT *)sp_e->lParam, sp_e->data_len);
02546             break;
02547         }
02548 
02549 }
02550 /***********************************************************************
02551  *           SPY_EnterMessage
02552  */
02553 void SPY_EnterMessage( INT iFlag, HWND hWnd, UINT msg,
02554                        WPARAM wParam, LPARAM lParam )
02555 {
02556     SPY_INSTANCE sp_e;
02557     int indent;
02558 
02559     if (!TRACE_ON(message) || SPY_EXCLUDE(msg)) return;
02560 
02561     sp_e.msgnum = msg;
02562     sp_e.msg_hwnd = hWnd;
02563     sp_e.lParam = lParam;
02564     sp_e.wParam = wParam;
02565     SPY_GetWndName(&sp_e);
02566     SPY_GetMsgStuff(&sp_e);
02567     indent = get_indent_level();
02568 
02569     /* each SPY_SENDMESSAGE must be complemented by call to SPY_ExitMessage */
02570     switch(iFlag)
02571     {
02572     case SPY_DISPATCHMESSAGE:
02573         TRACE("%*s(%p) %-16s message [%04x] %s dispatched  wp=%08lx lp=%08lx\n",
02574                         indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
02575                         sp_e.msg_name, wParam, lParam);
02576         break;
02577 
02578     case SPY_SENDMESSAGE:
02579         {
02580             char taskName[20];
02581             DWORD tid = GetWindowThreadProcessId( hWnd, NULL );
02582 
02583             if (tid == GetCurrentThreadId()) strcpy( taskName, "self" );
02584             else sprintf( taskName, "tid %04lx", GetCurrentThreadId() );
02585 
02586             TRACE("%*s(%p) %-16s message [%04x] %s sent from %s wp=%08lx lp=%08lx\n",
02587                              indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
02588                              sp_e.msg_name, taskName, wParam, lParam );
02589                 SPY_DumpStructure(&sp_e, TRUE);
02590         }
02591         break;
02592 
02593     case SPY_DEFWNDPROC:
02594         if( SPY_ExcludeDWP ) return;
02595         TRACE("%*s(%p)  DefWindowProc32: %s [%04x]  wp=%08lx lp=%08lx\n",
02596                         indent, "", hWnd, sp_e.msg_name,
02597                         msg, wParam, lParam );
02598         break;
02599     }
02600     set_indent_level( indent + SPY_INDENT_UNIT );
02601 }
02602 
02603 
02604 /***********************************************************************
02605  *           SPY_ExitMessage
02606  */
02607 void SPY_ExitMessage( INT iFlag, HWND hWnd, UINT msg, LRESULT lReturn,
02608                        WPARAM wParam, LPARAM lParam )
02609 {
02610     SPY_INSTANCE sp_e;
02611     int indent;
02612     DWORD save_error = GetLastError();
02613 
02614     if (!TRACE_ON(message) || SPY_EXCLUDE(msg) ||
02615         (SPY_ExcludeDWP && (/*iFlag == SPY_RESULT_DEFWND16 || */iFlag == SPY_RESULT_DEFWND)) )
02616         return;
02617 
02618     sp_e.msgnum = msg;
02619     sp_e.msg_hwnd   = hWnd;
02620     sp_e.lParam = lParam;
02621     sp_e.wParam = wParam;
02622     SPY_GetWndName(&sp_e);
02623     SPY_GetMsgStuff(&sp_e);
02624 
02625     if ((indent = get_indent_level()))
02626     {
02627         indent -= SPY_INDENT_UNIT;
02628         set_indent_level( indent );
02629     }
02630 
02631     switch(iFlag)
02632     {
02633     case SPY_RESULT_DEFWND:
02634         TRACE(" %*s(%p)  DefWindowProc32: %s [%04x] returned %08lx\n",
02635                         indent, "", hWnd, sp_e.msg_name, msg, lReturn );
02636         break;
02637 
02638     case SPY_RESULT_OK:
02639         TRACE(" %*s(%p) %-16s message [%04x] %s returned %08lx\n",
02640                         indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
02641                         sp_e.msg_name, lReturn );
02642         SPY_DumpStructure(&sp_e, FALSE);
02643         break;
02644    }
02645    SetLastError( save_error );
02646 }
02647 
02648 
02649 /***********************************************************************
02650  *           SPY_Init
02651  */
02652 int SPY_Init(void)
02653 {
02654     int i;
02655     UINT j;
02656     char buffer[1024];
02657     const SPY_NOTIFY *p;
02658     const USER_MSG *q;
02659     HKEY hkey;
02660 
02661     if (!TRACE_ON(message)) return TRUE;
02662 
02663     indent_tls_index = TlsAlloc();
02664     /* @@ Wine registry key: HKCU\Software\Wine\Debug */
02665     if(!RegOpenKeyA(HKEY_CURRENT_USER, "Software\\ReactOS\\Debug", &hkey))
02666     {
02667         DWORD type, count = sizeof(buffer);
02668 
02669         buffer[0] = 0;
02670         if (!RegQueryValueExA(hkey, "SpyInclude", 0, &type, (LPBYTE) buffer, &count) &&
02671             strcmp( buffer, "INCLUDEALL" ))
02672         {
02673             TRACE("Include=%s\n", buffer );
02674             for (i = 0; i <= SPY_MAX_MSGNUM; i++)
02675                 SPY_Exclude[i] = (MessageTypeNames[i] && !strstr(buffer,MessageTypeNames[i]));
02676         }
02677 
02678         count = sizeof(buffer);
02679         buffer[0] = 0;
02680         if (!RegQueryValueExA(hkey, "SpyExclude", 0, &type, (LPBYTE) buffer, &count))
02681         {
02682             TRACE("Exclude=%s\n", buffer );
02683             if (!strcmp( buffer, "EXCLUDEALL" ))
02684                 for (i = 0; i <= SPY_MAX_MSGNUM; i++) SPY_Exclude[i] = TRUE;
02685             else
02686                 for (i = 0; i <= SPY_MAX_MSGNUM; i++)
02687                     SPY_Exclude[i] = (MessageTypeNames[i] && strstr(buffer,MessageTypeNames[i]));
02688         }
02689 
02690         SPY_ExcludeDWP = 0;
02691         count = sizeof(buffer);
02692         if(!RegQueryValueExA(hkey, "SpyExcludeDWP", 0, &type, (LPBYTE) buffer, &count))
02693             SPY_ExcludeDWP = atoi(buffer);
02694 
02695         RegCloseKey(hkey);
02696     }
02697 
02698     /* find last good entry in spy notify array and save addr for b-search */
02699     p = &spnfy_array[0];
02700     j = 0xffffffff;
02701     while (p->name) {
02702         if ((UINT)p->value > (UINT)j) {
02703             ERR("Notify message array out of order\n");
02704             ERR("  between values [%08x] %s and [%08x] %s\n",
02705                 j, (p-1)->name, p->value, p->name);
02706             break;
02707         }
02708         j = p->value;
02709         p++;
02710     }
02711     p--;
02712     end_spnfy_array = p;
02713 
02714     /* find last good entry in each common control message array
02715      *  and save addr for b-search.
02716      */
02717     i = 0;
02718     while (cc_array[i].classname) {
02719 
02720         j = 0x0400; /* minimum entry in array */
02721         q = cc_array[i].classmsg;
02722         while(q->name) {
02723             if (q->value <= j) {
02724                 ERR("Class message array out of order for class %s\n",
02725                     debugstr_w(cc_array[i].classname));
02726                 ERR("  between values [%04x] %s and [%04x] %s\n",
02727                     j, (q-1)->name, q->value, q->name);
02728                 break;
02729             }
02730             j = q->value;
02731             q++;
02732         }
02733         q--;
02734         cc_array[i].lastmsg = (USER_MSG *)q;
02735 
02736         i++;
02737     }
02738 
02739     return 1;
02740 }

Generated on Sat May 26 2012 04:37:32 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.