- Add support to dump memory at lParam location on common control
messages.
- Fixed remaining Toolbar and Pager notify dump amounts.
- Separate memory dump code for easy use.
diff --git a/windows/spy.c b/windows/spy.c
index fde54bd..723b758 100644
--- a/windows/spy.c
+++ b/windows/spy.c
@@ -1233,7 +1233,12 @@
USER_MSG *lastmsg; /* pointer to last USER_MSG for class */
} CONTROL_CLASS;
-#define USM(a,b) { #a ,a,sizeof(b)}
+#define USM(a,b) { #a ,a,b}
+#define SZOF(a) sizeof(a)
+
+/* To dump memory at the lParam for any of these messages, */
+/* replace the "0" with a "SZOF(structure)", or with a */
+/* number. (First method prefered.) */
static const USER_MSG rebar_array[] = {
USM(RB_INSERTBANDA, 0),
@@ -1377,7 +1382,7 @@
USM(CBEM_SETEXTENDEDSTYLE ,0),
{0,0,0} };
-
+#undef SZOF
#undef USM
static CONTROL_CLASS cc_array[] = {
@@ -1513,11 +1518,11 @@
SPNFY(TBN_CUSTHELP, NMHDR),
SPNFY(TBN_DROPDOWN, NMTOOLBARA),
SPNFY(TBN_GETOBJECT, NMOBJECTNOTIFY),
- SPNFY(TBN_HOTITEMCHANGE, NMHDR), /* NMTBHOTITEM), */
+ SPNFY(TBN_HOTITEMCHANGE, NMTBHOTITEM),
SPNFY(TBN_DRAGOUT, NMTOOLBARA),
SPNFY(TBN_DELETINGBUTTON, NMTOOLBARA),
- SPNFY(TBN_GETDISPINFOA, NMHDR), /* NMTBDISPINFO), */
- SPNFY(TBN_GETDISPINFOW, NMHDR), /* NMTBDISPINFO), */
+ SPNFY(TBN_GETDISPINFOA, NMTBDISPINFOA),
+ SPNFY(TBN_GETDISPINFOW, NMTBDISPINFOW),
SPNFY(TBN_GETINFOTIPA, NMTBGETINFOTIPA),
SPNFY(TBN_GETINFOTIPW, NMTBGETINFOTIPW),
SPNFY(TBN_GETBUTTONINFOW, NMTOOLBARW),
@@ -1547,6 +1552,8 @@
/* IP Adderss 0U-860U to 0U-879U */
/* Status bar 0U-880U to 0U-899U */
/* Pager 0U-900U to 0U-950U */
+ SPNFY(PGN_SCROLL, NMPGSCROLL),
+ SPNFY(PGN_CALCSIZE, NMPGCALCSIZE),
{0,0,0}};
static const SPY_NOTIFY *end_spnfy_array; /* ptr to last good entry in array */
#undef SPNFY
@@ -1669,6 +1676,7 @@
strncpy (sp_e->msg_name, SPY_GetMsgInternal( sp_e->msgnum, TRUE ),
sizeof(sp_e->msg_name)-1);
+ sp_e->data_len = 0;
if (strncmp(sp_e->msg_name, "WM_USER+", 8) == 0) {
INT i = 0;
@@ -1803,16 +1811,46 @@
}
/***********************************************************************
+ * SPY_DumpMem
+ */
+void SPY_DumpMem (LPSTR header, UINT *q, INT len)
+{
+ int i;
+
+ for(i=0; i<len-12; i+=16) {
+ TRACE("%s [%04x] %08x %08x %08x %08x\n",
+ header, i, *q, *(q+1), *(q+2), *(q+3));
+ q += 4;
+ }
+ switch (len - i) {
+ case 12:
+ TRACE("%s [%04x] %08x %08x %08x\n",
+ header, i, *q, *(q+1), *(q+2));
+ break;
+ case 8:
+ TRACE("%s [%04x] %08x %08x\n",
+ header, i, *q, *(q+1));
+ break;
+ case 4:
+ TRACE("%s [%04x] %08x\n",
+ header, i, *q);
+ break;
+ default:
+ break;
+ }
+}
+
+/***********************************************************************
* SPY_DumpStructure
*/
-void SPY_DumpStructure (UINT msg, BOOL enter, LPARAM structure)
+void SPY_DumpStructure (SPY_INSTANCE *sp_e, BOOL enter)
{
- switch (msg)
+ switch (sp_e->msgnum)
{
case WM_DRAWITEM:
if (!enter) break;
{
- DRAWITEMSTRUCT *lpdis = (DRAWITEMSTRUCT*) structure;
+ DRAWITEMSTRUCT *lpdis = (DRAWITEMSTRUCT*) sp_e->lParam;
TRACE("DRAWITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n",
lpdis->CtlType, lpdis->CtlID);
TRACE("itemID=0x%08x itemAction=0x%08x itemState=0x%08x\n",
@@ -1825,7 +1863,7 @@
break;
case WM_MEASUREITEM:
{
- MEASUREITEMSTRUCT *lpmis = (MEASUREITEMSTRUCT*) structure;
+ MEASUREITEMSTRUCT *lpmis = (MEASUREITEMSTRUCT*) sp_e->lParam;
TRACE("MEASUREITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n",
lpmis->CtlType, lpmis->CtlID);
TRACE("itemID=0x%08x itemWidth=0x%08x itemHeight=0x%08x\n",
@@ -1837,7 +1875,7 @@
if (!enter) break;
case WM_WINDOWPOSCHANGING:
{
- WINDOWPOS *lpwp = (WINDOWPOS *)structure;
+ WINDOWPOS *lpwp = (WINDOWPOS *)sp_e->lParam;
TRACE("WINDOWPOS hwnd=0x%04x, after=0x%04x, at (%d,%d) w=%d h=%d, flags=0x%08x\n",
lpwp->hwnd, lpwp->hwndInsertAfter, lpwp->x, lpwp->y,
lpwp->cx, lpwp->cy, lpwp->flags);
@@ -1847,14 +1885,14 @@
if (!enter) break;
case WM_STYLECHANGING:
{
- LPSTYLESTRUCT ss = (LPSTYLESTRUCT) structure;
+ LPSTYLESTRUCT ss = (LPSTYLESTRUCT) sp_e->lParam;
TRACE("STYLESTRUCT: StyleOld=0x%08lx, StyleNew=0x%08lx\n",
ss->styleOld, ss->styleNew);
}
break;
case WM_NCCALCSIZE:
{
- RECT *rc = (RECT *)structure;
+ RECT *rc = (RECT *)sp_e->lParam;
TRACE("Rect (%d,%d)-(%d,%d)\n",
rc->left, rc->top, rc->right, rc->bottom);
}
@@ -1862,7 +1900,7 @@
case WM_NOTIFY:
if (!enter) break;
{
- NMHDR * pnmh = (NMHDR*) structure;
+ NMHDR * pnmh = (NMHDR*) sp_e->lParam;
UINT *q;
const SPY_NOTIFY *p;
@@ -1872,29 +1910,8 @@
TRACE("NMHDR hwndFrom=0x%08x idFrom=0x%08x code=%s<0x%08x>, extra=0x%x\n",
pnmh->hwndFrom, pnmh->idFrom, p->name, pnmh->code, p->len);
if (p->len > 0) {
- int i;
q = (UINT *)(pnmh + 1);
- for(i=0; i<((INT)p->len)-12; i+=16) {
- TRACE("NM extra [%04x] %08x %08x %08x %08x\n",
- i, *q, *(q+1), *(q+2), *(q+3));
- q += 4;
- }
- switch (p->len - i) {
- case 12:
- TRACE("NM extra [%04x] %08x %08x %08x\n",
- i, *q, *(q+1), *(q+2));
- break;
- case 8:
- TRACE("NM extra [%04x] %08x %08x\n",
- i, *q, *(q+1));
- break;
- case 4:
- TRACE("NM extra [%04x] %08x\n",
- i, *q);
- break;
- default:
- break;
- }
+ SPY_DumpMem ("NM extra", q, (INT)p->len);
}
}
else
@@ -1902,6 +1919,8 @@
pnmh->hwndFrom, pnmh->idFrom, pnmh->code);
}
default:
+ if (sp_e->data_len > 0)
+ SPY_DumpMem ("MSG lParam", (UINT *)sp_e->lParam, sp_e->data_len);
break;
}
@@ -1960,7 +1979,7 @@
{ TRACE("%*s(%08x) %-16s message [%04x] %s sent from %s wp=%08x lp=%08lx\n",
SPY_IndentLevel, "", hWnd, sp_e.wnd_name, msg,
sp_e.msg_name, taskName, wParam, lParam );
- SPY_DumpStructure(msg, TRUE, lParam);
+ SPY_DumpStructure(&sp_e, TRUE);
}
}
break;
@@ -2026,7 +2045,7 @@
TRACE(" %*s(%08x) %-16s message [%04x] %s returned %08lx\n",
SPY_IndentLevel, "", hWnd, sp_e.wnd_name, msg,
sp_e.msg_name, lReturn );
- SPY_DumpStructure(msg, FALSE, lParam);
+ SPY_DumpStructure(&sp_e, FALSE);
break;
case SPY_RESULT_INVALIDHWND16: