ntdll: Make the relay debug code more generic to allow supporting 64-bit platforms.

This commit is contained in:
Alexandre Julliard 2008-12-27 20:02:34 +01:00
parent 01722d6010
commit f55476359c
1 changed files with 40 additions and 35 deletions

View File

@ -40,14 +40,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(relay);
#ifdef __i386__
WINE_DECLARE_DEBUG_CHANNEL(snoop);
WINE_DECLARE_DEBUG_CHANNEL(seh);
struct relay_descr /* descriptor for a module */
{
void *magic; /* signature */
void *relay_from_32; /* functions to call from relay thunks */
void *relay_from_32_regs;
void *relay_call; /* functions to call from relay thunks */
void *relay_call_regs;
void *private; /* reserved for the relay code private data */
const char *entry_point_base; /* base address of entry point thunks */
const unsigned int *entry_point_offsets; /* offsets of entry points thunks */
@ -302,25 +299,25 @@ static BOOL check_from_module( const WCHAR **includelist, const WCHAR **excludel
/***********************************************************************
* RELAY_PrintArgs
*/
static inline void RELAY_PrintArgs( const int *args, int nb_args, unsigned int typemask )
static inline void RELAY_PrintArgs( const INT_PTR *args, int nb_args, unsigned int typemask )
{
while (nb_args--)
{
if ((typemask & 3) && HIWORD(*args))
{
if (typemask & 2)
DPRINTF( "%08x %s", *args, debugstr_w((LPCWSTR)*args) );
DPRINTF( "%08lx %s", *args, debugstr_w((LPCWSTR)*args) );
else
DPRINTF( "%08x %s", *args, debugstr_a((LPCSTR)*args) );
DPRINTF( "%08lx %s", *args, debugstr_a((LPCSTR)*args) );
}
else DPRINTF( "%08x", *args );
else DPRINTF( "%08lx", *args );
if (nb_args) DPRINTF( "," );
args++;
typemask >>= 2;
}
}
extern LONGLONG call_entry_point( void *func, int nb_args, const int *args );
extern LONGLONG call_entry_point( void *func, int nb_args, const INT_PTR *args );
__ASM_GLOBAL_FUNC( call_entry_point,
"\tpushl %ebp\n"
"\tmovl %esp,%ebp\n"
@ -345,11 +342,11 @@ __ASM_GLOBAL_FUNC( call_entry_point,
/***********************************************************************
* relay_call_from_32
* relay_call
*
* stack points to the return address, i.e. the first argument is stack[1].
*/
static LONGLONG WINAPI relay_call_from_32( struct relay_descr *descr, unsigned int idx, const int *stack )
static LONGLONG WINAPI relay_call( struct relay_descr *descr, unsigned int idx, const INT_PTR *stack )
{
LONGLONG ret;
WORD ordinal = LOWORD(idx);
@ -367,7 +364,7 @@ static LONGLONG WINAPI relay_call_from_32( struct relay_descr *descr, unsigned i
else
DPRINTF( "%04x:Call %s.%u(", GetCurrentThreadId(), data->dllname, data->base + ordinal );
RELAY_PrintArgs( stack + 1, nb_args, descr->arg_types[ordinal] );
DPRINTF( ") ret=%08x\n", stack[0] );
DPRINTF( ") ret=%08lx\n", stack[0] );
ret = call_entry_point( entry_point->orig_func, nb_args, stack + 1 );
@ -377,21 +374,21 @@ static LONGLONG WINAPI relay_call_from_32( struct relay_descr *descr, unsigned i
DPRINTF( "%04x:Ret %s.%u()", GetCurrentThreadId(), data->dllname, data->base + ordinal );
if (flags & 1) /* 64-bit return value */
DPRINTF( " retval=%08x%08x ret=%08x\n",
DPRINTF( " retval=%08x%08x ret=%08lx\n",
(UINT)(ret >> 32), (UINT)ret, stack[0] );
else
DPRINTF( " retval=%08x ret=%08x\n", (UINT)ret, stack[0] );
DPRINTF( " retval=%08lx ret=%08lx\n", (UINT_PTR)ret, stack[0] );
}
return ret;
}
/***********************************************************************
* relay_call_from_32_regs
* relay_call_regs
*/
void WINAPI __regs_relay_call_from_32_regs( struct relay_descr *descr, unsigned int idx,
unsigned int orig_eax, unsigned int ret_addr,
CONTEXT86 *context )
void WINAPI __regs_relay_call_regs( struct relay_descr *descr, unsigned int idx,
unsigned int orig_eax, unsigned int ret_addr,
CONTEXT86 *context )
{
WORD ordinal = LOWORD(idx);
BYTE nb_args = LOBYTE(HIWORD(idx));
@ -399,8 +396,8 @@ void WINAPI __regs_relay_call_from_32_regs( struct relay_descr *descr, unsigned
struct relay_private_data *data = descr->private;
struct relay_entry_point *entry_point = data->entry_points + ordinal;
BYTE *orig_func = entry_point->orig_func;
int *args = (int *)context->Esp;
int args_copy[32];
INT_PTR *args = (INT_PTR *)context->Esp;
INT_PTR args_copy[32];
/* restore the context to what it was before the relay thunk */
context->Eax = orig_eax;
@ -452,8 +449,8 @@ void WINAPI __regs_relay_call_from_32_regs( struct relay_descr *descr, unsigned
context->SegDs, context->SegEs, context->SegFs, context->SegGs, context->EFlags );
}
}
extern void WINAPI relay_call_from_32_regs(void);
DEFINE_REGS_ENTRYPOINT( relay_call_from_32_regs, 16, 16 )
extern void WINAPI relay_call_regs(void);
DEFINE_REGS_ENTRYPOINT( relay_call_regs, 16, 16 )
/***********************************************************************
@ -502,8 +499,8 @@ void RELAY_SetupDLL( HMODULE module )
(exports->NumberOfFunctions-1) * sizeof(data->entry_points) )))
return;
descr->relay_from_32 = relay_call_from_32;
descr->relay_from_32_regs = relay_call_from_32_regs;
descr->relay_call = relay_call;
descr->relay_call_regs = relay_call_regs;
descr->private = data;
data->module = module;
@ -538,12 +535,30 @@ void RELAY_SetupDLL( HMODULE module )
}
}
#else /* __i386__ */
FARPROC RELAY_GetProcAddress( HMODULE module, const IMAGE_EXPORT_DIRECTORY *exports,
DWORD exp_size, FARPROC proc, DWORD ordinal, const WCHAR *user )
{
return proc;
}
void RELAY_SetupDLL( HMODULE module )
{
}
#endif /* __i386__ */
/***********************************************************************/
/* snoop support */
/***********************************************************************/
#ifdef __i386__
WINE_DECLARE_DEBUG_CHANNEL(seh);
WINE_DECLARE_DEBUG_CHANNEL(snoop);
#include "pshpack1.h"
typedef struct
@ -931,22 +946,12 @@ DEFINE_REGS_ENTRYPOINT( SNOOP_Return, 0, 0 )
#else /* __i386__ */
FARPROC RELAY_GetProcAddress( HMODULE module, const IMAGE_EXPORT_DIRECTORY *exports,
DWORD exp_size, FARPROC proc, DWORD ordinal, const WCHAR *user )
{
return proc;
}
FARPROC SNOOP_GetProcAddress( HMODULE hmod, const IMAGE_EXPORT_DIRECTORY *exports, DWORD exp_size,
FARPROC origfun, DWORD ordinal, const WCHAR *user )
{
return origfun;
}
void RELAY_SetupDLL( HMODULE module )
{
}
void SNOOP_SetupDLL( HMODULE hmod )
{
FIXME("snooping works only on i386 for now.\n");