Relay tracing would crash if it came upon a function call with an
invalid pointer as a parameter.
This commit is contained in:
parent
d7d564b227
commit
42a074dfcd
|
@ -10,6 +10,7 @@
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
#include "debugtools.h"
|
#include "debugtools.h"
|
||||||
|
#include "wine/exception.h"
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
#include "winbase.h"
|
#include "winbase.h"
|
||||||
#include "winnt.h"
|
#include "winnt.h"
|
||||||
|
@ -29,6 +30,14 @@ struct debug_info
|
||||||
|
|
||||||
static struct debug_info tmp;
|
static struct debug_info tmp;
|
||||||
|
|
||||||
|
/* filter for page-fault exceptions */
|
||||||
|
static WINE_EXCEPTION_FILTER(page_fault)
|
||||||
|
{
|
||||||
|
if (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION)
|
||||||
|
return EXCEPTION_EXECUTE_HANDLER;
|
||||||
|
return EXCEPTION_CONTINUE_SEARCH;
|
||||||
|
}
|
||||||
|
|
||||||
/* get the debug info pointer for the current thread */
|
/* get the debug info pointer for the current thread */
|
||||||
static inline struct debug_info *get_info(void)
|
static inline struct debug_info *get_info(void)
|
||||||
{
|
{
|
||||||
|
@ -69,20 +78,11 @@ static inline void release( void *ptr )
|
||||||
info->str_pos = ptr;
|
info->str_pos = ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/* put an ASCII string into the debug buffer */
|
||||||
* wine_dbgstr_an (NTDLL.@)
|
inline static char *put_string_a( const char *src, int n )
|
||||||
*/
|
|
||||||
const char *wine_dbgstr_an( const char *src, int n )
|
|
||||||
{
|
{
|
||||||
char *dst, *res;
|
char *dst, *res;
|
||||||
|
|
||||||
if (!HIWORD(src))
|
|
||||||
{
|
|
||||||
if (!src) return "(null)";
|
|
||||||
res = gimme1(6);
|
|
||||||
sprintf(res, "#%04x", LOWORD(src) );
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
if (n < 0) n = 0;
|
if (n < 0) n = 0;
|
||||||
else if (n > 200) n = 200;
|
else if (n > 200) n = 200;
|
||||||
dst = res = gimme1 (n * 4 + 6);
|
dst = res = gimme1 (n * 4 + 6);
|
||||||
|
@ -121,20 +121,11 @@ const char *wine_dbgstr_an( const char *src, int n )
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/* put a Unicode string into the debug buffer */
|
||||||
* wine_dbgstr_wn (NTDLL.@)
|
inline static char *put_string_w( const WCHAR *src, int n )
|
||||||
*/
|
|
||||||
const char *wine_dbgstr_wn( const WCHAR *src, int n )
|
|
||||||
{
|
{
|
||||||
char *dst, *res;
|
char *dst, *res;
|
||||||
|
|
||||||
if (!HIWORD(src))
|
|
||||||
{
|
|
||||||
if (!src) return "(null)";
|
|
||||||
res = gimme1(6);
|
|
||||||
sprintf(res, "#%04x", LOWORD(src) );
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
if (n < 0) n = 0;
|
if (n < 0) n = 0;
|
||||||
else if (n > 200) n = 200;
|
else if (n > 200) n = 200;
|
||||||
dst = res = gimme1 (n * 5 + 7);
|
dst = res = gimme1 (n * 5 + 7);
|
||||||
|
@ -173,6 +164,69 @@ const char *wine_dbgstr_wn( const WCHAR *src, int n )
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* wine_dbgstr_an (NTDLL.@)
|
||||||
|
*/
|
||||||
|
const char *wine_dbgstr_an( const char *src, int n )
|
||||||
|
{
|
||||||
|
char *res, *old_pos;
|
||||||
|
struct debug_info *info;
|
||||||
|
|
||||||
|
if (!HIWORD(src))
|
||||||
|
{
|
||||||
|
if (!src) return "(null)";
|
||||||
|
res = gimme1(6);
|
||||||
|
sprintf(res, "#%04x", LOWORD(src) );
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
/* save current position to restore it on exception */
|
||||||
|
info = NtCurrentTeb()->debug_info;
|
||||||
|
old_pos = info->str_pos;
|
||||||
|
__TRY
|
||||||
|
{
|
||||||
|
res = put_string_a( src, n );
|
||||||
|
}
|
||||||
|
__EXCEPT(page_fault)
|
||||||
|
{
|
||||||
|
release( old_pos );
|
||||||
|
return "(invalid)";
|
||||||
|
}
|
||||||
|
__ENDTRY
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* wine_dbgstr_wn (NTDLL.@)
|
||||||
|
*/
|
||||||
|
const char *wine_dbgstr_wn( const WCHAR *src, int n )
|
||||||
|
{
|
||||||
|
char *res, *old_pos;
|
||||||
|
struct debug_info *info;
|
||||||
|
|
||||||
|
if (!HIWORD(src))
|
||||||
|
{
|
||||||
|
if (!src) return "(null)";
|
||||||
|
res = gimme1(6);
|
||||||
|
sprintf(res, "#%04x", LOWORD(src) );
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* save current position to restore it on exception */
|
||||||
|
info = NtCurrentTeb()->debug_info;
|
||||||
|
old_pos = info->str_pos;
|
||||||
|
__TRY
|
||||||
|
{
|
||||||
|
res = put_string_w( src, n );
|
||||||
|
}
|
||||||
|
__EXCEPT(page_fault)
|
||||||
|
{
|
||||||
|
release( old_pos );
|
||||||
|
return "(invalid)";
|
||||||
|
}
|
||||||
|
__ENDTRY
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* wine_dbgstr_guid (NTDLL.@)
|
* wine_dbgstr_guid (NTDLL.@)
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue