diff --git a/dlls/kernel/relay16.c b/dlls/kernel/relay16.c index dc7bc6a66dc..e739115e686 100644 --- a/dlls/kernel/relay16.c +++ b/dlls/kernel/relay16.c @@ -47,6 +47,13 @@ static const WCHAR **debug_relay_includelist; static const WCHAR **debug_snoop_excludelist; static const WCHAR **debug_snoop_includelist; +/* compare an ASCII and a Unicode string without depending on the current codepage */ +inline static int strcmpiAW( const char *strA, const WCHAR *strW ) +{ + while (*strA && (toupperW((unsigned char)*strA) == toupperW(*strW))) { strA++; strW++; } + return toupperW((unsigned char)*strA) - toupperW(*strW); +} + /* compare an ASCII and a Unicode string without depending on the current codepage */ inline static int strncmpiAW( const char *strA, const WCHAR *strW, int n ) { @@ -155,42 +162,49 @@ void RELAY16_InitDebugLists(void) } +/*********************************************************************** + * check_list + * + * Check if a given module and function is in the list. + */ +static BOOL check_list( const char *module, int ordinal, const char *func, const WCHAR **list ) +{ + char ord_str[10]; + + sprintf( ord_str, "%d", ordinal ); + for(; *list; list++) + { + const WCHAR *p = strrchrW( *list, '.' ); + if (p && p > *list) /* check module and function */ + { + int len = p - *list; + if (strncmpiAW( module, *list, len-1 ) || module[len]) continue; + if (p[1] == '*' && !p[2]) return TRUE; + if (!strcmpiAW( ord_str, p + 1 )) return TRUE; + if (func && !strcmpiAW( func, p + 1 )) return TRUE; + } + else /* function only */ + { + if (func && !strcmpiAW( func, *list )) return TRUE; + } + } + return FALSE; +} + + /*********************************************************************** * RELAY_ShowDebugmsgRelay * * Simple function to decide if a particular debugging message is * wanted. */ -static int RELAY_ShowDebugmsgRelay(const char *func) +static BOOL RELAY_ShowDebugmsgRelay(const char *module, int ordinal, const char *func) { - if(debug_relay_excludelist || debug_relay_includelist) { - const char *term = strchr(func, ':'); - const WCHAR **listitem; - int len, len2, itemlen, show; - - if(debug_relay_excludelist) { - show = 1; - listitem = debug_relay_excludelist; - } else { - show = 0; - listitem = debug_relay_includelist; - } - assert(term); - assert(strlen(term) > 2); - len = term - func; - len2 = strchr(func, '.') - func; - assert(len2 && len2 > 0 && len2 < 64); - term += 2; - for(; *listitem; listitem++) - { - itemlen = strlenW(*listitem); - if (itemlen == len && !strncmpiAW(func, *listitem, len)) return !show; - if (itemlen == len2 && !strncmpiAW(func, *listitem, len2)) return !show; - if (!strncmpiAW(term, *listitem, itemlen) && !term[itemlen]) return !show; - } - return show; - } - return 1; + if (debug_relay_excludelist && check_list( module, ordinal, func, debug_relay_excludelist )) + return FALSE; + if (debug_relay_includelist && !check_list( module, ordinal, func, debug_relay_includelist )) + return FALSE; + return TRUE; } @@ -200,34 +214,13 @@ static int RELAY_ShowDebugmsgRelay(const char *func) * Simple function to decide if a particular debugging message is * wanted. */ -int SNOOP16_ShowDebugmsgSnoop(const char *dll, int ord, const char *fname) +int SNOOP16_ShowDebugmsgSnoop(const char *module, int ordinal, const char *func) { - if(debug_snoop_excludelist || debug_snoop_includelist) { - const WCHAR **listitem; - char buf[80]; - int len, len2, itemlen, show; - - if(debug_snoop_excludelist) { - show = 1; - listitem = debug_snoop_excludelist; - } else { - show = 0; - listitem = debug_snoop_includelist; - } - len = strlen(dll); - assert(len < 64); - sprintf(buf, "%s.%d", dll, ord); - len2 = strlen(buf); - for(; *listitem; listitem++) - { - itemlen = strlenW(*listitem); - if (itemlen == len && !strncmpiAW( buf, *listitem, len)) return !show; - if (itemlen == len2 && !strncmpiAW(buf, *listitem, len2)) return !show; - if (fname && !strncmpiAW(fname, *listitem, itemlen) && !fname[itemlen]) return !show; - } - return show; - } - return 1; + if (debug_snoop_excludelist && check_list( module, ordinal, func, debug_snoop_excludelist )) + return FALSE; + if (debug_snoop_includelist && !check_list( module, ordinal, func, debug_snoop_includelist )) + return FALSE; + return TRUE; } @@ -236,7 +229,7 @@ int SNOOP16_ShowDebugmsgSnoop(const char *dll, int ord, const char *fname) * * Return the ordinal, name, and type info corresponding to a CS:IP address. */ -static const CALLFROM16 *get_entry_point( STACK16FRAME *frame, LPSTR name, WORD *pOrd ) +static const CALLFROM16 *get_entry_point( STACK16FRAME *frame, LPSTR module, LPSTR func, WORD *pOrd ) { WORD i, max_offset; register BYTE *p; @@ -271,16 +264,16 @@ static const CALLFROM16 *get_entry_point( STACK16FRAME *frame, LPSTR name, WORD /* (built-in modules have no non-resident table) */ p = (BYTE *)pModule + pModule->name_table; + memcpy( module, p + 1, *p ); + module[*p] = 0; + while (*p) { p += *p + 1 + sizeof(WORD); if (*(WORD *)(p + *p + 1) == *pOrd) break; } - - sprintf( name, "%.*s.%d: %.*s", - *((BYTE *)pModule + pModule->name_table), - (char *)pModule + pModule->name_table + 1, - *pOrd, *p, (char *)(p + 1) ); + memcpy( func, p + 1, *p ); + func[*p] = 0; /* Retrieve entry point call structure */ p = MapSL( MAKESEGPTR( frame->module_cs, frame->callfrom_ip ) ); @@ -296,17 +289,17 @@ void RELAY_DebugCallFrom16( CONTEXT86 *context ) { STACK16FRAME *frame; WORD ordinal; - char *args16, funstr[80]; + char *args16, module[10], func[64]; const CALLFROM16 *call; int i; if (!TRACE_ON(relay)) return; frame = CURRENT_STACK16; - call = get_entry_point( frame, funstr, &ordinal ); + call = get_entry_point( frame, module, func, &ordinal ); if (!call) return; /* happens for the two snoop register relays */ - if (!RELAY_ShowDebugmsgRelay(funstr)) return; - DPRINTF( "%04lx:Call %s(",GetCurrentThreadId(),funstr); + if (!RELAY_ShowDebugmsgRelay( module, ordinal, func )) return; + DPRINTF( "%04lx:Call %s.%d: %s(",GetCurrentThreadId(), module, ordinal, func ); args16 = (char *)(frame + 1); if (call->lret == 0xcb66) /* cdecl */ @@ -407,15 +400,15 @@ void RELAY_DebugCallFrom16Ret( CONTEXT86 *context, int ret_val ) { STACK16FRAME *frame; WORD ordinal; - char funstr[80]; + char module[10], func[64]; const CALLFROM16 *call; if (!TRACE_ON(relay)) return; frame = CURRENT_STACK16; - call = get_entry_point( frame, funstr, &ordinal ); + call = get_entry_point( frame, module, func, &ordinal ); if (!call) return; - if (!RELAY_ShowDebugmsgRelay(funstr)) return; - DPRINTF( "%04lx:Ret %s() ",GetCurrentThreadId(),funstr); + if (!RELAY_ShowDebugmsgRelay( module, ordinal, func )) return; + DPRINTF( "%04lx:Ret %s.%d: %s() ", GetCurrentThreadId(), module, ordinal, func ); if (call->arg_types[0] & ARG_REGISTER) { diff --git a/dlls/ntdll/relay.c b/dlls/ntdll/relay.c index 996a867a75c..4f73b0bc089 100644 --- a/dlls/ntdll/relay.c +++ b/dlls/ntdll/relay.c @@ -258,43 +258,48 @@ static WINE_EXCEPTION_FILTER(page_fault) return EXCEPTION_CONTINUE_SEARCH; } +/*********************************************************************** + * check_list + * + * Check if a given module and function is in the list. + */ +static BOOL check_list( const char *module, int ordinal, const char *func, const WCHAR **list ) +{ + char ord_str[10]; + + sprintf( ord_str, "%d", ordinal ); + for(; *list; list++) + { + const WCHAR *p = strrchrW( *list, '.' ); + if (p && p > *list) /* check module and function */ + { + int len = p - *list; + if (strncmpiAW( module, *list, len-1 ) || module[len]) continue; + if (p[1] == '*' && !p[2]) return TRUE; + if (!strcmpAW( ord_str, p + 1 )) return TRUE; + if (func && !strcmpAW( func, p + 1 )) return TRUE; + } + else /* function only */ + { + if (func && !strcmpAW( func, *list )) return TRUE; + } + } + return FALSE; +} + + /*********************************************************************** * check_relay_include * * Check if a given function must be included in the relay output. */ -static BOOL check_relay_include( const char *module, const char *func ) +static BOOL check_relay_include( const char *module, int ordinal, const char *func ) { - const WCHAR **listitem; - BOOL show; - - if (!debug_relay_excludelist && !debug_relay_includelist) return TRUE; - if (debug_relay_excludelist) - { - show = TRUE; - listitem = debug_relay_excludelist; - } - else - { - show = FALSE; - listitem = debug_relay_includelist; - } - for(; *listitem; listitem++) - { - WCHAR *p = strrchrW( *listitem, '.' ); - if (p && p > *listitem) /* check module and function */ - { - int len = p - *listitem; - if (strncmpiAW( module, *listitem, len-1 ) || module[len]) continue; - if (p[1] == '*' && !p[2]) return !show; - if (!strcmpAW( func, p + 1 )) return !show; - } - else /* function only */ - { - if (!strcmpAW( func, *listitem )) return !show; - } - } - return show; + if (debug_relay_excludelist && check_list( module, ordinal, func, debug_relay_excludelist )) + return FALSE; + if (debug_relay_includelist && !check_list( module, ordinal, func, debug_relay_includelist )) + return FALSE; + return TRUE; } @@ -734,8 +739,8 @@ void RELAY_SetupDLL( HMODULE module ) if (!debug->call) continue; /* not a normal function */ if (debug->call != 0xe8 && debug->call != 0xe9) break; /* not a debug thunk at all */ - if ((name = find_exported_name( module, exports, i + exports->Base ))) - on = check_relay_include( dllname, name ); + name = find_exported_name( module, exports, i + exports->Base ); + on = check_relay_include( dllname, i + exports->Base, name ); if (on) { @@ -763,35 +768,13 @@ void RELAY_SetupDLL( HMODULE module ) * Simple function to decide if a particular debugging message is * wanted. */ -static int SNOOP_ShowDebugmsgSnoop(const char *dll, int ord, const char *fname) +static BOOL SNOOP_ShowDebugmsgSnoop(const char *module, int ordinal, const char *func) { - if(debug_snoop_excludelist || debug_snoop_includelist) { - const WCHAR **listitem; - char buf[80]; - int len, len2, itemlen, show; - - if(debug_snoop_excludelist) { - show = 1; - listitem = debug_snoop_excludelist; - } else { - show = 0; - listitem = debug_snoop_includelist; - } - len = strlen(dll); - assert(len < 64); - sprintf(buf, "%s.%d", dll, ord); - len2 = strlen(buf); - for(; *listitem; listitem++) - { - itemlen = strlenW(*listitem); - if((itemlen == len && !strncmpiAW( buf, *listitem, len)) || - (itemlen == len2 && !strncmpiAW(buf, *listitem, len2)) || - (fname && !strcmpAW(fname, *listitem))) - return !show; - } - return show; - } - return 1; + if (debug_snoop_excludelist && check_list( module, ordinal, func, debug_snoop_excludelist )) + return FALSE; + if (debug_snoop_includelist && !check_list( module, ordinal, func, debug_snoop_includelist )) + return FALSE; + return TRUE; } diff --git a/documentation/wine.conf.man b/documentation/wine.conf.man index 7c2f46bd3be..063c4fd909a 100644 --- a/documentation/wine.conf.man +++ b/documentation/wine.conf.man @@ -1,5 +1,5 @@ .\" -*- nroff -*- -.TH WINE.CONF 5 "September 1, 2001" "Version 20010824" "Wine Configuration File" +.TH WINE.CONF 5 "September 2003" "Version 20030911" "Wine Configuration File" .SH NAME wine.conf \- Wine configuration file .SH DESCRIPTION @@ -273,18 +273,6 @@ Used to specify which messages will be excluded from the logfile. default: none .br Used to specify which messages will be included in the logfile. .PP -.I format: """RelayExclude""=""""" -.br -default: none -.br -Used to specify which functions will be excluded from a relay debug log. -.PP -.I format: """RelayInclude""=""""" -.br -default: include all functions -.br -Used to specify which functions will be included in a relay debug log. -.PP .I format: """RelayFromExclude""=""""" .br default: none @@ -297,21 +285,32 @@ default: include all modules .br Used to specify the set of modules whose calls are included in a relay debug log. .PP -.I format: """SnoopExclude""=""""" +.I format: """RelayExclude""=""""" .br default: none -.br -Used to specify which functions will be included in snoop debug log. +.br +Used to specify which functions will be excluded from a relay debug log. .PP -.I format: """SnoopInclude""=""""" +.I format: """RelayInclude""=""""" .br default: include all functions .br -Used to specify which functions will be included in snoop debug log. +Used to specify which functions will be included in a relay debug log. +.PP +.I format: """SnoopExclude""=""""" +.br +default: none +.br +Used to specify which functions will be excluded from the snoop debug log. +.PP +.I format: """SnoopInclude""=""""" +.br +default: include all functions +.br +Used to specify which functions will be included in the snoop debug log. .PP For Relay and Snoop .* includes or excludes the whole dll. Exclude -entries overwrite Include entries. -.br +entries have priority over Include entries. .PP .B [Tweak.Layout] .br