[PATCH 2/6] ntdll: Redirect wine_dbg_sprintf formatting to ntdll.so.

Rémi Bernon rbernon at codeweavers.com
Sat Nov 21 14:19:09 CST 2020


This adds a new __wine_dbg_vsprintf internal export to format and strdup
a debug message at once, using ms_abi varargs calling convention in all
cases.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/ntdll/ntdll.spec    |  1 +
 dlls/ntdll/thread.c      |  8 ++++++++
 dlls/ntdll/unix/debug.c  | 11 +++++++++++
 dlls/ntdll/unix/loader.c |  1 +
 dlls/ntdll/unixlib.h     |  3 ++-
 dlls/winecrt0/debug.c    | 14 ++++++++++++++
 include/wine/debug.h     | 29 +++++++++--------------------
 7 files changed, 46 insertions(+), 21 deletions(-)

diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index 3a7adc92752..393db5caf20 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -1617,6 +1617,7 @@
 @ cdecl -norelay __wine_dbg_output(str)
 @ cdecl -norelay __wine_dbg_strdup(str)
 @ cdecl -norelay __wine_dbg_vprintf(str ptr)
+@ cdecl -norelay __wine_dbg_vsprintf(str ptr)
 
 # Virtual memory
 @ cdecl -syscall __wine_locked_recvmsg(long ptr long)
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
index a7231d008c6..ada79bf8843 100644
--- a/dlls/ntdll/thread.c
+++ b/dlls/ntdll/thread.c
@@ -82,6 +82,14 @@ int __cdecl __wine_dbg_vprintf( const char *format, __ms_va_list args )
     return unix_funcs->dbg_vprintf( format, args );
 }
 
+/***********************************************************************
+ *		__wine_dbg_vsnprintf  (NTDLL.@)
+ */
+const char * __cdecl __wine_dbg_vsprintf( const char *format, __ms_va_list args )
+{
+    return unix_funcs->dbg_vsprintf( format, args );
+}
+
 /*******************************************************************
  *		KiUserApcDispatcher (NTDLL.@)
  */
diff --git a/dlls/ntdll/unix/debug.c b/dlls/ntdll/unix/debug.c
index fe5c3c64272..2b2d63b7adf 100644
--- a/dlls/ntdll/unix/debug.c
+++ b/dlls/ntdll/unix/debug.c
@@ -485,6 +485,17 @@ int __cdecl __wine_dbg_vprintf( const char *format, __ms_va_list args )
 }
 
 
+/***********************************************************************
+ *      __wine_dbg_vsprintf  (NTDLL.@)
+ */
+const char * __cdecl __wine_dbg_vsprintf( const char *format, __ms_va_list args )
+{
+    char buffer[200];
+    wine_dbg_vsnprintf( buffer, sizeof(buffer), format, args );
+    return __wine_dbg_strdup( buffer );
+}
+
+
 /***********************************************************************
  *		dbg_init
  */
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c
index 310a4dab93c..a515e55662d 100644
--- a/dlls/ntdll/unix/loader.c
+++ b/dlls/ntdll/unix/loader.c
@@ -1547,6 +1547,7 @@ static struct unix_funcs unix_funcs =
     __wine_dbg_output,
     __wine_dbg_header,
     __wine_dbg_vprintf,
+    __wine_dbg_vsprintf,
 };
 
 
diff --git a/dlls/ntdll/unixlib.h b/dlls/ntdll/unixlib.h
index 1e98700a3fd..649ae047e01 100644
--- a/dlls/ntdll/unixlib.h
+++ b/dlls/ntdll/unixlib.h
@@ -27,7 +27,7 @@
 struct _DISPATCHER_CONTEXT;
 
 /* increment this when you change the function table */
-#define NTDLL_UNIXLIB_VERSION 107
+#define NTDLL_UNIXLIB_VERSION 108
 
 struct unix_funcs
 {
@@ -99,6 +99,7 @@ struct unix_funcs
     int           (CDECL *dbg_header)( enum __wine_debug_class cls, struct __wine_debug_channel *channel,
                                        const char *function );
     int           (CDECL *dbg_vprintf)( const char *format, __ms_va_list args );
+    const char *  (CDECL *dbg_vsprintf)( const char *format, __ms_va_list args );
 };
 
 #endif /* __NTDLL_UNIXLIB_H */
diff --git a/dlls/winecrt0/debug.c b/dlls/winecrt0/debug.c
index 5dc93acbecb..d8ba2603145 100644
--- a/dlls/winecrt0/debug.c
+++ b/dlls/winecrt0/debug.c
@@ -34,6 +34,7 @@ WINE_DECLARE_DEBUG_CHANNEL(timestamp);
 static const char * (__cdecl *p__wine_dbg_strdup)( const char *str );
 static int (__cdecl *p__wine_dbg_output)( const char *str );
 static int (__cdecl *p__wine_dbg_vprintf)( const char *format, __ms_va_list args );
+static const char * (__cdecl *p__wine_dbg_vsprintf)( const char *format, __ms_va_list args );
 static unsigned char (__cdecl *p__wine_dbg_get_channel_flags)( struct __wine_debug_channel *channel );
 static int (__cdecl *p__wine_dbg_header)( enum __wine_debug_class cls,
                                           struct __wine_debug_channel *channel,
@@ -186,6 +187,13 @@ static int __cdecl fallback__wine_dbg_vprintf( const char *format, __ms_va_list
     return __wine_dbg_output( str );
 }
 
+static const char * __cdecl fallback__wine_dbg_vsprintf( const char *format, __ms_va_list args )
+{
+    char str[200];
+    vsnprintf( str, sizeof(str), format, args );
+    return __wine_dbg_strdup( str );
+}
+
 static int __cdecl fallback__wine_dbg_header( enum __wine_debug_class cls,
                                               struct __wine_debug_channel *channel,
                                               const char *function )
@@ -250,6 +258,12 @@ int __cdecl __wine_dbg_vprintf( const char *format, __ms_va_list args )
     return p__wine_dbg_vprintf( format, args );
 }
 
+const char * __cdecl __wine_dbg_vsprintf( const char *format, __ms_va_list args )
+{
+    LOAD_FUNC( __wine_dbg_vsprintf );
+    return p__wine_dbg_vsprintf( format, args );
+}
+
 unsigned char __cdecl __wine_dbg_get_channel_flags( struct __wine_debug_channel *channel )
 {
     LOAD_FUNC( __wine_dbg_get_channel_flags );
diff --git a/include/wine/debug.h b/include/wine/debug.h
index 7024ef270fc..5321429f5c5 100644
--- a/include/wine/debug.h
+++ b/include/wine/debug.h
@@ -149,6 +149,7 @@ extern int __cdecl __wine_dbg_output( const char *str );
 extern int __cdecl __wine_dbg_header( enum __wine_debug_class cls, struct __wine_debug_channel *channel,
                                       const char *function );
 extern int __cdecl __wine_dbg_vprintf( const char *format, __ms_va_list args );
+extern const char * __cdecl __wine_dbg_vsprintf( const char *format, __ms_va_list args );
 
 /*
  * Exported definitions and macros
@@ -158,28 +159,16 @@ extern int __cdecl __wine_dbg_vprintf( const char *format, __ms_va_list args );
    quotes.  The string will be valid for some time, but not indefinitely
    as strings are re-used.  */
 
-#if (defined(__x86_64__) || defined(__aarch64__)) && defined(__GNUC__) && defined(__WINE_USE_MSVCRT)
-# define __wine_dbg_cdecl __cdecl
-# define __wine_dbg_va_list __builtin_ms_va_list
-# define __wine_dbg_va_start(list,arg) __builtin_ms_va_start(list,arg)
-# define __wine_dbg_va_end(list) __builtin_ms_va_end(list)
-#else
-# define __wine_dbg_cdecl
-# define __wine_dbg_va_list va_list
-# define __wine_dbg_va_start(list,arg) va_start(list,arg)
-# define __wine_dbg_va_end(list) va_end(list)
-#endif
-
-static const char * __wine_dbg_cdecl wine_dbg_sprintf( const char *format, ... ) __WINE_PRINTF_ATTR(1,2);
-static inline const char * __wine_dbg_cdecl wine_dbg_sprintf( const char *format, ... )
+static const char * __cdecl wine_dbg_sprintf( const char *format, ... ) __WINE_PRINTF_ATTR(1,2);
+static inline const char * __cdecl wine_dbg_sprintf( const char *format, ... )
 {
-    char buffer[200];
-    __wine_dbg_va_list args;
+    const char *ret;
+    __ms_va_list args;
 
-    __wine_dbg_va_start( args, format );
-    vsnprintf( buffer, sizeof(buffer), format, args );
-    __wine_dbg_va_end( args );
-    return __wine_dbg_strdup( buffer );
+    __ms_va_start( args, format );
+    ret = __wine_dbg_vsprintf( format, args );
+    __ms_va_end( args );
+    return ret;
 }
 
 static int __cdecl wine_dbg_printf( const char *format, ... ) __WINE_PRINTF_ATTR(1,2);
-- 
2.29.2




More information about the wine-devel mailing list