Alexandre Julliard : ntdll: Copy the implementation of __wine_dbg_strdup and __wine_dbg_header to the PE side.
Alexandre Julliard
julliard at winehq.org
Tue Jun 15 16:19:26 CDT 2021
Module: wine
Branch: master
Commit: c2d84da8134cc9d07a114561c10c75bf91078370
URL: https://source.winehq.org/git/wine.git/?a=commit;h=c2d84da8134cc9d07a114561c10c75bf91078370
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Jun 15 17:16:30 2021 +0200
ntdll: Copy the implementation of __wine_dbg_strdup and __wine_dbg_header to the PE side.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/thread.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++--
dlls/ntdll/unix/debug.c | 10 +++++-----
dlls/ntdll/unix/loader.c | 2 --
dlls/ntdll/unixlib.h | 5 +----
4 files changed, 56 insertions(+), 13 deletions(-)
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
index bcf010724c4..d86d20448bf 100644
--- a/dlls/ntdll/thread.c
+++ b/dlls/ntdll/thread.c
@@ -34,12 +34,33 @@
WINE_DECLARE_DEBUG_CHANNEL(relay);
WINE_DECLARE_DEBUG_CHANNEL(thread);
+WINE_DECLARE_DEBUG_CHANNEL(pid);
+WINE_DECLARE_DEBUG_CHANNEL(timestamp);
struct _KUSER_SHARED_DATA *user_shared_data = (void *)0x7ffe0000;
+struct debug_info
+{
+ unsigned int str_pos; /* current position in strings buffer */
+ unsigned int out_pos; /* current position in output buffer */
+ char strings[1020]; /* buffer for temporary strings */
+ char output[1020]; /* current output line */
+};
+
+C_ASSERT( sizeof(struct debug_info) == 0x800 );
+
static int nb_debug_options;
static struct __wine_debug_channel *debug_options;
+static inline struct debug_info *get_info(void)
+{
+#ifdef _WIN64
+ return (struct debug_info *)((TEB32 *)((char *)NtCurrentTeb() + 0x2000) + 1);
+#else
+ return (struct debug_info *)(NtCurrentTeb() + 1);
+#endif
+}
+
static void init_options(void)
{
unsigned int offset = page_size * (sizeof(void *) / 4);
@@ -81,7 +102,14 @@ unsigned char __cdecl __wine_dbg_get_channel_flags( struct __wine_debug_channel
*/
const char * __cdecl __wine_dbg_strdup( const char *str )
{
- return unix_funcs->dbg_strdup( str );
+ struct debug_info *info = get_info();
+ unsigned int pos = info->str_pos;
+ size_t n = strlen( str ) + 1;
+
+ assert( n <= sizeof(info->strings) );
+ if (pos + n > sizeof(info->strings)) pos = 0;
+ info->str_pos = pos + n;
+ return memcpy( info->strings + pos, str, n );
}
/***********************************************************************
@@ -90,7 +118,27 @@ const char * __cdecl __wine_dbg_strdup( const char *str )
int __cdecl __wine_dbg_header( enum __wine_debug_class cls, struct __wine_debug_channel *channel,
const char *function )
{
- return unix_funcs->dbg_header( cls, channel, function );
+ static const char * const classes[] = { "fixme", "err", "warn", "trace" };
+ struct debug_info *info = get_info();
+ char *pos = info->output;
+
+ if (!(__wine_dbg_get_channel_flags( channel ) & (1 << cls))) return -1;
+
+ /* only print header if we are at the beginning of the line */
+ if (info->out_pos) return 0;
+
+ if (TRACE_ON(timestamp))
+ {
+ ULONG ticks = NtGetTickCount();
+ pos += sprintf( pos, "%3u.%03u:", ticks / 1000, ticks % 1000 );
+ }
+ if (TRACE_ON(pid)) pos += sprintf( pos, "%04x:", GetCurrentProcessId() );
+ pos += sprintf( pos, "%04x:", GetCurrentThreadId() );
+ if (function && cls < ARRAY_SIZE( classes ))
+ pos += snprintf( pos, sizeof(info->output) - (pos - info->output), "%s:%s:%s ",
+ classes[cls], channel->name, function );
+ info->out_pos = pos - info->output;
+ return info->out_pos;
}
/***********************************************************************
diff --git a/dlls/ntdll/unix/debug.c b/dlls/ntdll/unix/debug.c
index 753bc36e469..0272e68bea6 100644
--- a/dlls/ntdll/unix/debug.c
+++ b/dlls/ntdll/unix/debug.c
@@ -277,7 +277,7 @@ int __cdecl __wine_dbg_header( enum __wine_debug_class cls, struct __wine_debug_
{
static const char * const classes[] = { "fixme", "err", "warn", "trace" };
struct debug_info *info = get_info();
- char buffer[200], *pos = buffer;
+ char *pos = info->output;
if (!(__wine_dbg_get_channel_flags( channel ) & (1 << cls))) return -1;
@@ -295,10 +295,10 @@ int __cdecl __wine_dbg_header( enum __wine_debug_class cls, struct __wine_debug_
pos += sprintf( pos, "%04x:", GetCurrentThreadId() );
}
if (function && cls < ARRAY_SIZE( classes ))
- snprintf( pos, sizeof(buffer) - (pos - buffer), "%s:%s:%s ",
- classes[cls], channel->name, function );
-
- return append_output( info, buffer, strlen( buffer ));
+ pos += snprintf( pos, sizeof(info->output) - (pos - info->output), "%s:%s:%s ",
+ classes[cls], channel->name, function );
+ info->out_pos = pos - info->output;
+ return info->out_pos;
}
/***********************************************************************
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c
index 0b2a7f3721c..fca63141ba3 100644
--- a/dlls/ntdll/unix/loader.c
+++ b/dlls/ntdll/unix/loader.c
@@ -1850,9 +1850,7 @@ static struct unix_funcs unix_funcs =
init_builtin_dll,
init_unix_lib,
unwind_builtin_dll,
- __wine_dbg_strdup,
__wine_dbg_output,
- __wine_dbg_header,
};
diff --git a/dlls/ntdll/unixlib.h b/dlls/ntdll/unixlib.h
index d0f2f4ed508..cbe5c9d3ccd 100644
--- a/dlls/ntdll/unixlib.h
+++ b/dlls/ntdll/unixlib.h
@@ -26,7 +26,7 @@
struct _DISPATCHER_CONTEXT;
/* increment this when you change the function table */
-#define NTDLL_UNIXLIB_VERSION 121
+#define NTDLL_UNIXLIB_VERSION 122
struct unix_funcs
{
@@ -80,10 +80,7 @@ struct unix_funcs
CONTEXT *context );
/* debugging functions */
- const char * (CDECL *dbg_strdup)( const char *str );
int (CDECL *dbg_output)( const char *str );
- int (CDECL *dbg_header)( enum __wine_debug_class cls, struct __wine_debug_channel *channel,
- const char *function );
};
#endif /* __NTDLL_UNIXLIB_H */
More information about the wine-cvs
mailing list