Alexandre Julliard : ntdll: Add a wrapper to call the thread entry point for broken apps.

Ken Thomases ken at codeweavers.com
Wed Mar 14 07:38:18 CDT 2007


On Mar 14, 2007, at 7:25 AM, Alexandre Julliard wrote:

> Module: wine
> Branch: master
> Commit: 7744443febb04213cf014b007a83744a66544d6c
> URL:    http://source.winehq.org/git/wine.git/? 
> a=commit;h=7744443febb04213cf014b007a83744a66544d6c
>
> Author: Alexandre Julliard <julliard at winehq.org>
> Date:   Wed Mar 14 12:28:38 2007 +0100
>
> ntdll: Add a wrapper to call the thread entry point for broken apps.
>
> ---
>
>  dlls/ntdll/thread.c |   25 ++++++++++++++++++++++---
>  1 files changed, 22 insertions(+), 3 deletions(-)
>
> diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
> index 9656331..d0871a1 100644
> --- a/dlls/ntdll/thread.c
> +++ b/dlls/ntdll/thread.c
> @@ -349,6 +349,26 @@ static PUNHANDLED_EXCEPTION_FILTER  
> get_unhandled_exception_filter(void)
>      return unhandled_exception_filter;
>  }
>
> +#ifdef __i386__
> +/* wrapper for apps that don't declare the thread function  
> correctly */
> +extern DWORD call_thread_entry_point( PRTL_THREAD_START_ROUTINE  
> entry, void *arg );
> +__ASM_GLOBAL_FUNC(call_thread_entry_point,
> +                  "pushl %ebp\n\t"
> +                  "movl %esp,%ebp\n\t"
> +                  "subl $4,%esp\n\t"
> +                  "pushl 12(%ebp)\n\t"
> +                  "movl 8(%ebp),%eax\n\t"
> +                  "call *%eax\n\t"
> +                  "leave\n\t"
> +                  "ret" );
> +#else
> +static inline DWORD call_thread_entry_point 
> ( PRTL_THREAD_START_ROUTINE entry, void *arg )
> +{
> +    LPTHREAD_START_ROUTINE func = (LPTHREAD_START_ROUTINE)rtl_func;

Should the above have "entry" instead of "rtl_func"?

> +    return func( arg );
> +}
> +#endif
> +
>  / 
> ********************************************************************** 
> *
>   *           call_thread_func
>   *
> @@ -356,16 +376,15 @@ static PUNHANDLED_EXCEPTION_FILTER  
> get_unhandled_exception_filter(void)
>   */
>  static void DECLSPEC_NORETURN call_thread_func 
> ( PRTL_THREAD_START_ROUTINE rtl_func, void *arg )
>  {
> -    LPTHREAD_START_ROUTINE func = (LPTHREAD_START_ROUTINE)rtl_func;
>      DWORD exit_code;
>      BOOL last;
>
>      MODULE_DllThreadAttach( NULL );
>
>      if (TRACE_ON(relay))
> -        DPRINTF( "%04x:Starting thread proc %p (arg=%p)\n",  
> GetCurrentThreadId(), func, arg );
> +        DPRINTF( "%04x:Starting thread proc %p (arg=%p)\n",  
> GetCurrentThreadId(), rtl_func, arg );
>
> -    exit_code = func( arg );
> +    exit_code = call_thread_entry_point( rtl_func, arg );
>
>      /* send the exit code to the server */
>      SERVER_START_REQ( terminate_thread )
>
>
>




More information about the wine-devel mailing list