From 003355946fb4d94bc84929aa227cff65a932a713 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Mon, 15 Oct 2012 18:02:36 +0200 Subject: [PATCH] user32: Delay message spying initialization until needed. --- dlls/user32/spy.c | 138 ++++++++++++++++++++++++++------------------- dlls/user32/user_main.c | 3 - dlls/user32/user_private.h | 1 - 3 files changed, 79 insertions(+), 63 deletions(-) diff --git a/dlls/user32/spy.c b/dlls/user32/spy.c index 6a01ea43b2b..b370aea72ac 100644 --- a/dlls/user32/spy.c +++ b/dlls/user32/spy.c @@ -1998,11 +1998,17 @@ static const SPY_NOTIFY spnfy_array[] = { }; #undef SPNFY -static unsigned char SPY_Exclude[SPY_MAX_MSGNUM+1]; -static unsigned char SPY_ExcludeDWP = 0; +static unsigned char *spy_exclude; -#define SPY_EXCLUDE(msg) \ - (SPY_Exclude[(msg) > SPY_MAX_MSGNUM ? SPY_MAX_MSGNUM : (msg)]) +static inline BOOL exclude_msg( UINT msg ) +{ + return spy_exclude[ min( msg, SPY_MAX_MSGNUM ) ]; +} + +static inline BOOL exclude_dwp(void) +{ + return spy_exclude[SPY_MAX_MSGNUM + 1]; +} typedef struct @@ -2017,7 +2023,7 @@ typedef struct WCHAR wnd_name[16]; /* window name for message */ } SPY_INSTANCE; -static int indent_tls_index; +static int indent_tls_index = TLS_OUT_OF_INDEXES; /*********************************************************************** * get_indent_level @@ -2521,6 +2527,70 @@ static void SPY_DumpStructure(const SPY_INSTANCE *sp_e, BOOL enter) } } + + +/*********************************************************************** + * spy_init + */ +static BOOL spy_init(void) +{ + int i; + char buffer[1024]; + HKEY hkey; + char *exclude; + + if (!TRACE_ON(message)) return FALSE; + + if (indent_tls_index == TLS_OUT_OF_INDEXES) + { + DWORD index = TlsAlloc(); + if (InterlockedCompareExchange( &indent_tls_index, index, TLS_OUT_OF_INDEXES ) != TLS_OUT_OF_INDEXES) + TlsFree( index ); + } + + if (spy_exclude) return TRUE; + exclude = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, SPY_MAX_MSGNUM + 2 ); + + /* @@ Wine registry key: HKCU\Software\Wine\Debug */ + if(!RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Wine\\Debug", &hkey)) + { + DWORD type, count = sizeof(buffer); + + buffer[0] = 0; + if (!RegQueryValueExA(hkey, "SpyInclude", 0, &type, (LPBYTE) buffer, &count) && + strcmp( buffer, "INCLUDEALL" )) + { + TRACE("Include=%s\n", buffer ); + for (i = 0; i <= SPY_MAX_MSGNUM; i++) + exclude[i] = (MessageTypeNames[i] && !strstr(buffer,MessageTypeNames[i])); + } + + count = sizeof(buffer); + buffer[0] = 0; + if (!RegQueryValueExA(hkey, "SpyExclude", 0, &type, (LPBYTE) buffer, &count)) + { + TRACE("Exclude=%s\n", buffer ); + if (!strcmp( buffer, "EXCLUDEALL" )) + for (i = 0; i <= SPY_MAX_MSGNUM; i++) exclude[i] = TRUE; + else + for (i = 0; i <= SPY_MAX_MSGNUM; i++) + exclude[i] = (MessageTypeNames[i] && strstr(buffer,MessageTypeNames[i])); + } + + count = sizeof(buffer); + if(!RegQueryValueExA(hkey, "SpyExcludeDWP", 0, &type, (LPBYTE) buffer, &count)) + exclude[SPY_MAX_MSGNUM + 1] = atoi(buffer); + + RegCloseKey(hkey); + } + + if (InterlockedCompareExchangePointer( (void **)&spy_exclude, exclude, NULL )) + HeapFree( GetProcessHeap(), 0, exclude ); + + return TRUE; +} + + /*********************************************************************** * SPY_EnterMessage */ @@ -2531,7 +2601,7 @@ void SPY_EnterMessage( INT iFlag, HWND hWnd, UINT msg, int indent; DWORD save_error = GetLastError(); - if (!TRACE_ON(message) || SPY_EXCLUDE(msg)) return; + if (!spy_init() || exclude_msg(msg)) return; sp_e.msgnum = msg; sp_e.msg_hwnd = hWnd; @@ -2566,7 +2636,7 @@ void SPY_EnterMessage( INT iFlag, HWND hWnd, UINT msg, break; case SPY_DEFWNDPROC: - if( SPY_ExcludeDWP ) return; + if (exclude_dwp()) return; TRACE("%*s(%p) DefWindowProc:[%04x] %s wp=%08lx lp=%08lx\n", indent, "", hWnd, msg, sp_e.msg_name, wParam, lParam ); break; @@ -2586,8 +2656,8 @@ void SPY_ExitMessage( INT iFlag, HWND hWnd, UINT msg, LRESULT lReturn, int indent; DWORD save_error = GetLastError(); - if (!TRACE_ON(message) || SPY_EXCLUDE(msg) || - (SPY_ExcludeDWP && iFlag == SPY_RESULT_DEFWND)) + if (!TRACE_ON(message) || exclude_msg(msg) || + (exclude_dwp() && iFlag == SPY_RESULT_DEFWND)) return; sp_e.msgnum = msg; @@ -2619,53 +2689,3 @@ void SPY_ExitMessage( INT iFlag, HWND hWnd, UINT msg, LRESULT lReturn, } SetLastError( save_error ); } - - -/*********************************************************************** - * SPY_Init - */ -int SPY_Init(void) -{ - int i; - char buffer[1024]; - HKEY hkey; - - if (!TRACE_ON(message)) return TRUE; - - indent_tls_index = TlsAlloc(); - /* @@ Wine registry key: HKCU\Software\Wine\Debug */ - if(!RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Wine\\Debug", &hkey)) - { - DWORD type, count = sizeof(buffer); - - buffer[0] = 0; - if (!RegQueryValueExA(hkey, "SpyInclude", 0, &type, (LPBYTE) buffer, &count) && - strcmp( buffer, "INCLUDEALL" )) - { - TRACE("Include=%s\n", buffer ); - for (i = 0; i <= SPY_MAX_MSGNUM; i++) - SPY_Exclude[i] = (MessageTypeNames[i] && !strstr(buffer,MessageTypeNames[i])); - } - - count = sizeof(buffer); - buffer[0] = 0; - if (!RegQueryValueExA(hkey, "SpyExclude", 0, &type, (LPBYTE) buffer, &count)) - { - TRACE("Exclude=%s\n", buffer ); - if (!strcmp( buffer, "EXCLUDEALL" )) - for (i = 0; i <= SPY_MAX_MSGNUM; i++) SPY_Exclude[i] = TRUE; - else - for (i = 0; i <= SPY_MAX_MSGNUM; i++) - SPY_Exclude[i] = (MessageTypeNames[i] && strstr(buffer,MessageTypeNames[i])); - } - - SPY_ExcludeDWP = 0; - count = sizeof(buffer); - if(!RegQueryValueExA(hkey, "SpyExcludeDWP", 0, &type, (LPBYTE) buffer, &count)) - SPY_ExcludeDWP = atoi(buffer); - - RegCloseKey(hkey); - } - - return 1; -} diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c index 6e39999cdba..c5b47147a53 100644 --- a/dlls/user32/user_main.c +++ b/dlls/user32/user_main.c @@ -281,9 +281,6 @@ static BOOL process_attach(void) /* Initialize built-in window classes */ CLASS_RegisterBuiltinClasses(); - /* Initialize message spying */ - if (!SPY_Init()) return FALSE; - return TRUE; } diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h index 6e337ca6fd9..3afc7cf09c2 100644 --- a/dlls/user32/user_private.h +++ b/dlls/user32/user_private.h @@ -267,7 +267,6 @@ extern const char *SPY_GetVKeyName(WPARAM wParam) DECLSPEC_HIDDEN; extern void SPY_EnterMessage( INT iFlag, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) DECLSPEC_HIDDEN; extern void SPY_ExitMessage( INT iFlag, HWND hwnd, UINT msg, LRESULT lReturn, WPARAM wParam, LPARAM lParam ) DECLSPEC_HIDDEN; -extern int SPY_Init(void) DECLSPEC_HIDDEN; #include "pshpack1.h" -- 2.11.4.GIT