Add message's spy into user32.dll. In order to enable, just uncomment #define YDEBUG in spy.c file and optionally set the messages you want to include / exclude in the registry (HKCU\ReactOS\Debug).

When it's turned off (YDEBUG is not defined), it doesn't provide any slow-down to the system.

DefWindowProc() functions are slightly refactored to have one exit point instead of numerous returns in a switch-case statement.

FIXME: maybe DPRINTs will be changed to DbgPrint because it's pointless to display path to the spy.c file everytime.

svn path=/trunk/; revision=23330
This commit is contained in:
Aleksey Bragin 2006-07-28 13:52:23 +00:00
parent 3d97c16cd1
commit b9673c3ca0
11 changed files with 2767 additions and 29 deletions

View file

@ -84,6 +84,11 @@ HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WINXP",
HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WINXP","SPMajorVersion",0x00010001,0x00000001 HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WINXP","SPMajorVersion",0x00010001,0x00000001
HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WINXP","SPMinorVersion",0x00010001,0x00000000 HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WINXP","SPMinorVersion",0x00010001,0x00000000
; DEBUG: Windows Messages SPY configuration
HKCU,"SOFTWARE\ReactOS\Debug","SpyInclude",0x00020000,"INCLUDEALL"
;HKCU,"SOFTWARE\ReactOS\Debug","SpyExclude",0x00020000,""
;HKCU,"SOFTWARE\ReactOS\Debug","SpyExcludeDWP",0x00020000,""
; GUI Setup ; GUI Setup
HKCU, "Control Panel\Desktop\WindowMetrics","CaptionFont",0x00000001,f5,ff,ff,ff,00,00,00,\ HKCU, "Control Panel\Desktop\WindowMetrics","CaptionFont",0x00000001,f5,ff,ff,ff,00,00,00,\

View file

@ -1867,8 +1867,8 @@ static LRESULT ComboWndProc_common( HWND hwnd, UINT message,
{ {
LPHEADCOMBO lphc = (LPHEADCOMBO)GetWindowLongPtrW( hwnd, 0 ); LPHEADCOMBO lphc = (LPHEADCOMBO)GetWindowLongPtrW( hwnd, 0 );
//TRACE("[%p]: msg %s wp %08x lp %08lx\n", TRACE("[%p]: msg %s wp %08x lp %08lx\n",
// hwnd, SPY_GetMsgName(message, hwnd), wParam, lParam ); hwnd, SPY_GetMsgName(message, hwnd), wParam, lParam );
if( lphc || message == WM_NCCREATE ) if( lphc || message == WM_NCCREATE )
switch(message) switch(message)

View file

@ -445,7 +445,7 @@ static LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg,
EDITSTATE *es = (EDITSTATE *)GetWindowLongPtrW( hwnd, 0 ); EDITSTATE *es = (EDITSTATE *)GetWindowLongPtrW( hwnd, 0 );
LRESULT result = 0; LRESULT result = 0;
//TRACE("hwnd=%p msg=%x (%s) wparam=%x lparam=%lx\n", hwnd, msg, SPY_GetMsgName(msg, hwnd), wParam, lParam); TRACE("hwnd=%p msg=%x (%s) wparam=%x lparam=%lx\n", hwnd, msg, SPY_GetMsgName(msg, hwnd), wParam, lParam);
if (!es && msg != WM_NCCREATE) if (!es && msg != WM_NCCREATE)
return DefWindowProcT(hwnd, msg, wParam, lParam, unicode); return DefWindowProcT(hwnd, msg, wParam, lParam, unicode);
@ -1108,7 +1108,7 @@ static LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg,
if (es) EDIT_UnlockBuffer(es, FALSE); if (es) EDIT_UnlockBuffer(es, FALSE);
//TRACE("hwnd=%p msg=%x (%s) -- 0x%08lx\n", hwnd, msg, SPY_GetMsgName(msg, hwnd), result); TRACE("hwnd=%p msg=%x (%s) -- 0x%08lx\n", hwnd, msg, SPY_GetMsgName(msg, hwnd), result);
return result; return result;
} }

View file

@ -2634,8 +2634,8 @@ static LRESULT WINAPI ListBoxWndProc_common( HWND hwnd, UINT msg,
} }
if (descr->style & LBS_COMBOBOX) lphc = descr->lphc; if (descr->style & LBS_COMBOBOX) lphc = descr->lphc;
//TRACE("[%p]: msg %s wp %08x lp %08lx\n", TRACE("[%p]: msg %s wp %08x lp %08lx\n",
// hwnd, SPY_GetMsgName(msg, hwnd), wParam, lParam ); hwnd, SPY_GetMsgName(msg, hwnd), wParam, lParam );
switch(msg) switch(msg)
{ {
#ifndef __REACTOS__ #ifndef __REACTOS__

View file

@ -137,5 +137,22 @@ BOOL STDCALL GdiDllInitialize(HANDLE, DWORD, LPVOID);
void InitStockObjects(void); void InitStockObjects(void);
VOID DeleteFrameBrushes(VOID); VOID DeleteFrameBrushes(VOID);
/* message spy definitions */
#define SPY_DISPATCHMESSAGE 0x0101
#define SPY_SENDMESSAGE 0x0103
#define SPY_DEFWNDPROC 0x0105
#define SPY_RESULT_OK 0x0001
#define SPY_RESULT_INVALIDHWND 0x0003
#define SPY_RESULT_DEFWND 0x0005
extern const char *SPY_GetMsgName(UINT msg, HWND hWnd);
extern const char *SPY_GetVKeyName(WPARAM wParam);
extern void SPY_EnterMessage(INT iFlag, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
extern void SPY_ExitMessage(INT iFlag, HWND hwnd, UINT msg,
LRESULT lReturn, WPARAM wParam, LPARAM lParam);
extern int SPY_Init(void);
#endif #endif
/* EOF */ /* EOF */

View file

@ -101,6 +101,10 @@ DllMain(
Cleanup(); Cleanup();
return FALSE; return FALSE;
} }
/* Initialize message spying */
if (!SPY_Init()) return FALSE;
break; break;
case DLL_THREAD_ATTACH: case DLL_THREAD_ATTACH:

View file

@ -71,6 +71,7 @@
<file>paint.c</file> <file>paint.c</file>
<file>prop.c</file> <file>prop.c</file>
<file>rect.c</file> <file>rect.c</file>
<file>spy.c</file>
<file>text.c</file> <file>text.c</file>
<file>window.c</file> <file>window.c</file>
<file>winpos.c</file> <file>winpos.c</file>

View file

@ -1538,6 +1538,9 @@ DefWindowProcA(HWND hWnd,
WPARAM wParam, WPARAM wParam,
LPARAM lParam) LPARAM lParam)
{ {
LRESULT Result = 0;
SPY_EnterMessage(SPY_DEFWNDPROC, hWnd, Msg, wParam, lParam);
switch (Msg) switch (Msg)
{ {
case WM_NCCREATE: case WM_NCCREATE:
@ -1558,12 +1561,14 @@ DefWindowProcA(HWND hWnd,
else else
NtUserDefSetText(hWnd, NULL); NtUserDefSetText(hWnd, NULL);
return (1); Result = 1;
break;
} }
case WM_GETTEXTLENGTH: case WM_GETTEXTLENGTH:
{ {
return (LRESULT)NtUserInternalGetWindowText(hWnd, NULL, 0); Result = (LRESULT)NtUserInternalGetWindowText(hWnd, NULL, 0);
break;
} }
case WM_GETTEXT: case WM_GETTEXT:
@ -1574,7 +1579,10 @@ DefWindowProcA(HWND hWnd,
Buffer = HeapAlloc(GetProcessHeap(), 0, wParam * sizeof(WCHAR)); Buffer = HeapAlloc(GetProcessHeap(), 0, wParam * sizeof(WCHAR));
if (!Buffer) if (!Buffer)
return FALSE; {
Result = 0;
break;
}
Length = NtUserInternalGetWindowText(hWnd, Buffer, wParam); Length = NtUserInternalGetWindowText(hWnd, Buffer, wParam);
if (Length > 0 && wParam > 0 && if (Length > 0 && wParam > 0 &&
!WideCharToMultiByte(CP_ACP, 0, Buffer, -1, !WideCharToMultiByte(CP_ACP, 0, Buffer, -1,
@ -1585,7 +1593,8 @@ DefWindowProcA(HWND hWnd,
HeapFree(GetProcessHeap(), 0, Buffer); HeapFree(GetProcessHeap(), 0, Buffer);
return (LRESULT)Length; Result = (LRESULT)Length;
break;
} }
case WM_SETTEXT: case WM_SETTEXT:
@ -1607,11 +1616,12 @@ DefWindowProcA(HWND hWnd,
{ {
DefWndNCPaint(hWnd, (HRGN)1, -1); DefWndNCPaint(hWnd, (HRGN)1, -1);
} }
return TRUE;
Result = 1;
break;
} }
/* /* FIXME: Implement these. */
FIXME: Implement these.
case WM_IME_CHAR: case WM_IME_CHAR:
case WM_IME_KEYDOWN: case WM_IME_KEYDOWN:
case WM_IME_KEYUP: case WM_IME_KEYUP:
@ -1620,10 +1630,14 @@ DefWindowProcA(HWND hWnd,
case WM_IME_ENDCOMPOSITION: case WM_IME_ENDCOMPOSITION:
case WM_IME_SELECT: case WM_IME_SELECT:
case WM_IME_SETCONTEXT: case WM_IME_SETCONTEXT:
*/ DPRINT1("FIXME: WM_IME_* conversion isn't implemented yet!");
/* fall through */
default:
Result = User32DefWindowProc(hWnd, Msg, wParam, lParam, FALSE);
} }
return User32DefWindowProc(hWnd, Msg, wParam, lParam, FALSE); SPY_ExitMessage(SPY_RESULT_DEFWND, hWnd, Msg, Result, wParam, lParam);
return Result;
} }
@ -1633,6 +1647,9 @@ DefWindowProcW(HWND hWnd,
WPARAM wParam, WPARAM wParam,
LPARAM lParam) LPARAM lParam)
{ {
LRESULT Result = 0;
SPY_EnterMessage(SPY_DEFWNDPROC, hWnd, Msg, wParam, lParam);
switch (Msg) switch (Msg)
{ {
case WM_NCCREATE: case WM_NCCREATE:
@ -1646,17 +1663,20 @@ DefWindowProcW(HWND hWnd,
RtlInitUnicodeString(&UnicodeString, (LPWSTR)cs->lpszName); RtlInitUnicodeString(&UnicodeString, (LPWSTR)cs->lpszName);
NtUserDefSetText( hWnd, (cs->lpszName ? &UnicodeString : NULL)); NtUserDefSetText( hWnd, (cs->lpszName ? &UnicodeString : NULL));
return (1); Result = 1;
break;
} }
case WM_GETTEXTLENGTH: case WM_GETTEXTLENGTH:
{ {
return (LRESULT)NtUserInternalGetWindowText(hWnd, NULL, 0); Result = (LRESULT)NtUserInternalGetWindowText(hWnd, NULL, 0);
break;
} }
case WM_GETTEXT: case WM_GETTEXT:
{ {
return (LRESULT)NtUserInternalGetWindowText(hWnd, (PWSTR)lParam, wParam); Result = (LRESULT)NtUserInternalGetWindowText(hWnd, (PWSTR)lParam, wParam);
break;
} }
case WM_SETTEXT: case WM_SETTEXT:
@ -1672,22 +1692,30 @@ DefWindowProcW(HWND hWnd,
{ {
DefWndNCPaint(hWnd, (HRGN)1, -1); DefWndNCPaint(hWnd, (HRGN)1, -1);
} }
return (1); Result = 1;
break;
} }
case WM_IME_CHAR: case WM_IME_CHAR:
{ {
SendMessageW(hWnd, WM_CHAR, wParam, lParam); SendMessageW(hWnd, WM_CHAR, wParam, lParam);
return (0); Result = 0;
break;
} }
case WM_IME_SETCONTEXT: case WM_IME_SETCONTEXT:
{ {
/* FIXME */ /* FIXME */
return (0); DPRINT1("FIXME: WM_IME_SETCONTEXT is not implemented!");
Result = 0;
break;
} }
}
return User32DefWindowProc(hWnd, Msg, wParam, lParam, TRUE); default:
Result = User32DefWindowProc(hWnd, Msg, wParam, lParam, TRUE);
}
SPY_ExitMessage(SPY_RESULT_DEFWND, hWnd, Msg, Result, wParam, lParam);
return Result;
} }

View file

@ -1050,7 +1050,7 @@ static LRESULT MDIClientWndProc_common( HWND hwnd, UINT message,
{ {
MDICLIENTINFO *ci = NULL; MDICLIENTINFO *ci = NULL;
// TRACE("%p %04x (%s) %08x %08lx\n", hwnd, message, SPY_GetMsgName(message, hwnd), wParam, lParam); TRACE("%p %04x (%s) %08x %08lx\n", hwnd, message, SPY_GetMsgName(message, hwnd), wParam, lParam);
if (WM_NCCREATE != message && NULL == (ci = get_client_info(hwnd))) if (WM_NCCREATE != message && NULL == (ci = get_client_info(hwnd)))
{ {
@ -1368,7 +1368,7 @@ LRESULT WINAPI DefFrameProcW( HWND hwnd, HWND hwndMDIClient,
{ {
MDICLIENTINFO *ci = get_client_info( hwndMDIClient ); MDICLIENTINFO *ci = get_client_info( hwndMDIClient );
// TRACE("%p %p %04x (%s) %08x %08lx\n", hwnd, hwndMDIClient, message, SPY_GetMsgName(message, hwnd), wParam, lParam); TRACE("%p %p %04x (%s) %08x %08lx\n", hwnd, hwndMDIClient, message, SPY_GetMsgName(message, hwnd), wParam, lParam);
if (ci) if (ci)
{ {
@ -1466,7 +1466,7 @@ LRESULT WINAPI DefMDIChildProcA( HWND hwnd, UINT message,
HWND client = GetParent(hwnd); HWND client = GetParent(hwnd);
MDICLIENTINFO *ci = get_client_info( client ); MDICLIENTINFO *ci = get_client_info( client );
// TRACE("%p %04x (%s) %08x %08lx\n", hwnd, message, SPY_GetMsgName(message, hwnd), wParam, lParam); TRACE("%p %04x (%s) %08x %08lx\n", hwnd, message, SPY_GetMsgName(message, hwnd), wParam, lParam);
#ifndef __REACTOS__ #ifndef __REACTOS__
hwnd = WIN_GetFullHandle( hwnd ); hwnd = WIN_GetFullHandle( hwnd );
#endif #endif
@ -1509,7 +1509,7 @@ LRESULT WINAPI DefMDIChildProcW( HWND hwnd, UINT message,
HWND client = GetParent(hwnd); HWND client = GetParent(hwnd);
MDICLIENTINFO *ci = get_client_info( client ); MDICLIENTINFO *ci = get_client_info( client );
// TRACE("%p %04x (%s) %08x %08lx\n", hwnd, message, SPY_GetMsgName(message, hwnd), wParam, lParam); TRACE("%p %04x (%s) %08x %08lx\n", hwnd, message, SPY_GetMsgName(message, hwnd), wParam, lParam);
#ifndef __REACTOS__ #ifndef __REACTOS__
hwnd = WIN_GetFullHandle( hwnd ); hwnd = WIN_GetFullHandle( hwnd );
#endif #endif

View file

@ -1297,8 +1297,12 @@ DispatchMessageA(CONST MSG *lpmsg)
if (! Info.HandledByKernel) if (! Info.HandledByKernel)
{ {
/* We need to send the message ourselves */ /* We need to send the message ourselves */
SPY_EnterMessage(SPY_DISPATCHMESSAGE, Info.Msg.hwnd, Info.Msg.message,
Info.Msg.wParam, Info.Msg.lParam);
Result = IntCallWindowProcA(Info.Ansi, Info.Proc, Info.Msg.hwnd, Result = IntCallWindowProcA(Info.Ansi, Info.Proc, Info.Msg.hwnd,
Info.Msg.message, Info.Msg.wParam, Info.Msg.lParam); Info.Msg.message, Info.Msg.wParam, Info.Msg.lParam);
SPY_ExitMessage(SPY_RESULT_OK, Info.Msg.hwnd, Info.Msg.message, Result,
Info.Msg.wParam, Info.Msg.lParam);
} }
MsgConversionCleanup(lpmsg, TRUE, TRUE, &Result); MsgConversionCleanup(lpmsg, TRUE, TRUE, &Result);
@ -1321,8 +1325,12 @@ DispatchMessageW(CONST MSG *lpmsg)
if (! Info.HandledByKernel) if (! Info.HandledByKernel)
{ {
/* We need to send the message ourselves */ /* We need to send the message ourselves */
SPY_EnterMessage(SPY_DISPATCHMESSAGE, Info.Msg.hwnd, Info.Msg.message,
Info.Msg.wParam, Info.Msg.lParam);
Result = IntCallWindowProcW(Info.Ansi, Info.Proc, Info.Msg.hwnd, Result = IntCallWindowProcW(Info.Ansi, Info.Proc, Info.Msg.hwnd,
Info.Msg.message, Info.Msg.wParam, Info.Msg.lParam); Info.Msg.message, Info.Msg.wParam, Info.Msg.lParam);
SPY_ExitMessage(SPY_RESULT_OK, Info.Msg.hwnd, Info.Msg.message, Result,
Info.Msg.wParam, Info.Msg.lParam);
} }
MsgConversionCleanup(lpmsg, FALSE, TRUE, &Result); MsgConversionCleanup(lpmsg, FALSE, TRUE, &Result);
@ -1791,12 +1799,15 @@ SendMessageTimeoutA(
return FALSE; return FALSE;
} }
SPY_EnterMessage(SPY_SENDMESSAGE, hWnd, Msg, wParam, lParam);
Info.Ansi = TRUE; Info.Ansi = TRUE;
Result = NtUserSendMessageTimeout(UcMsg.hwnd, UcMsg.message, Result = NtUserSendMessageTimeout(UcMsg.hwnd, UcMsg.message,
UcMsg.wParam, UcMsg.lParam, UcMsg.wParam, UcMsg.lParam,
fuFlags, uTimeout, (ULONG_PTR*)lpdwResult, &Info); fuFlags, uTimeout, (ULONG_PTR*)lpdwResult, &Info);
if(!Result) if(!Result)
{ {
SPY_ExitMessage(SPY_RESULT_OK, hWnd, Msg, Result, wParam, lParam);
return FALSE; return FALSE;
} }
if (! Info.HandledByKernel) if (! Info.HandledByKernel)
@ -1818,7 +1829,8 @@ SendMessageTimeoutA(
UcMsg.message, UcMsg.wParam, UcMsg.lParam); UcMsg.message, UcMsg.wParam, UcMsg.lParam);
if (! MsgiAnsiToUnicodeReply(&UcMsg, &AnsiMsg, &Result)) if (! MsgiAnsiToUnicodeReply(&UcMsg, &AnsiMsg, &Result))
{ {
return FALSE; SPY_ExitMessage(SPY_RESULT_OK, hWnd, Msg, Result, wParam, lParam);
return FALSE;
} }
} }
if(lpdwResult) if(lpdwResult)
@ -1830,10 +1842,12 @@ SendMessageTimeoutA(
/* Message sent by kernel. Convert back to Ansi */ /* Message sent by kernel. Convert back to Ansi */
if (! MsgiAnsiToUnicodeReply(&UcMsg, &AnsiMsg, &Result)) if (! MsgiAnsiToUnicodeReply(&UcMsg, &AnsiMsg, &Result))
{ {
return FALSE; SPY_ExitMessage(SPY_RESULT_OK, hWnd, Msg, Result, wParam, lParam);
return FALSE;
} }
} }
SPY_ExitMessage(SPY_RESULT_OK, hWnd, Msg, Result, wParam, lParam);
return Result; return Result;
} }
@ -1855,6 +1869,8 @@ SendMessageTimeoutW(
NTUSERSENDMESSAGEINFO Info; NTUSERSENDMESSAGEINFO Info;
LRESULT Result; LRESULT Result;
SPY_EnterMessage(SPY_SENDMESSAGE, hWnd, Msg, wParam, lParam);
Info.Ansi = FALSE; Info.Ansi = FALSE;
Result = NtUserSendMessageTimeout(hWnd, Msg, wParam, lParam, fuFlags, uTimeout, Result = NtUserSendMessageTimeout(hWnd, Msg, wParam, lParam, fuFlags, uTimeout,
lpdwResult, &Info); lpdwResult, &Info);
@ -1864,9 +1880,12 @@ SendMessageTimeoutW(
Result = IntCallWindowProcW(Info.Ansi, Info.Proc, hWnd, Msg, wParam, lParam); Result = IntCallWindowProcW(Info.Ansi, Info.Proc, hWnd, Msg, wParam, lParam);
if(lpdwResult) if(lpdwResult)
*lpdwResult = Result; *lpdwResult = Result;
SPY_ExitMessage(SPY_RESULT_OK, hWnd, Msg, Result, wParam, lParam);
return TRUE; return TRUE;
} }
SPY_ExitMessage(SPY_RESULT_OK, hWnd, Msg, Result, wParam, lParam);
return Result; return Result;
} }

File diff suppressed because it is too large Load diff