[PATCH 4/7] msvcrt: Use trampoline for _beginthreadex().
Piotr Caban
piotr.caban at gmail.com
Tue May 4 07:46:24 CDT 2021
Hi Arek,
On 5/4/21 1:49 PM, Arkadiusz Hiler wrote:
> +/*********************************************************************
> + * _beginthreadex_trampoline
> + */
> +static DWORD CALLBACK _beginthreadex_trampoline(LPVOID arg)
> +{
> + unsigned int retval;
> + _beginthread_trampoline_t local_trampoline;
> + thread_data_t *data = msvcrt_get_thread_data();
> +
> + memcpy(&local_trampoline, arg, sizeof(local_trampoline));
> + data->handle = local_trampoline.thread;
> + free(arg);
> +
> + retval = local_trampoline.start_address_ex(local_trampoline.arglist);
> + _endthreadex(retval);
> +}
Compilation warning:
warning: no return statement in function returning non-void
> /*********************************************************************
> * _beginthreadex (MSVCRT.@)
> */
> @@ -161,12 +180,35 @@ uintptr_t CDECL _beginthreadex(
> unsigned int initflag, /* [in] Initial state of new thread (0 for running or CREATE_SUSPEND for suspended) */
> unsigned int *thrdaddr) /* [out] Points to a 32-bit variable that receives the thread identifier */
> {
> + _beginthread_trampoline_t* trampoline;
> + HANDLE thread;
> +
> TRACE("(%p, %d, %p, %p, %d, %p)\n", security, stack_size, start_address, arglist, initflag, thrdaddr);
>
> - /* FIXME */
> - return (uintptr_t)CreateThread(security, stack_size,
> - start_address, arglist,
> - initflag, thrdaddr);
> + if(!start_address) {
> + *_errno() = EINVAL;
> + return -1;
> + }
The function returns 0 in ucrtbase on invalid argument. I didn't test
what version it changes in.
Thanks,
Piotr
More information about the wine-devel
mailing list