diff --git a/winsup/cygwin/init.cc b/winsup/cygwin/init.cc index 56d4668..eb822a5 100644 --- a/winsup/cygwin/init.cc +++ b/winsup/cygwin/init.cc @@ -55,14 +55,23 @@ munge_threadfunc () if (threadfunc_ix[0]) { - char *threadfunc = ebp[threadfunc_ix[0]]; + char *threadfunc0 = ebp[threadfunc_ix[0]]; + char *threadfunc; + DWORD ret; + + NtQueryInformationThread(GetCurrentThread(), ThreadQuerySetWin32StartAddress, &threadfunc, sizeof(threadfunc), &ret); + + syscall_printf("threadfunc0 %p\n", threadfunc0); + syscall_printf("threadfunc %p\n", threadfunc); + syscall_printf("search_for %p\n", search_for); if (!search_for || threadfunc == search_for) - { - search_for = NULL; - for (i = 0; threadfunc_ix[i]; i++) - ebp[threadfunc_ix[i]] = (char *) threadfunc_fe; - TlsSetValue (_my_oldfunc, threadfunc); - } + { + search_for = NULL; + for (i = 0; threadfunc_ix[i]; i++) + if (ebp[threadfunc_ix[i]] == threadfunc) + ebp[threadfunc_ix[i]] = (char *) threadfunc_fe; + TlsSetValue (_my_oldfunc, threadfunc); + } } } diff --git a/winsup/cygwin/ntdll.h b/winsup/cygwin/ntdll.h index 13a131d..050e848 100644 --- a/winsup/cygwin/ntdll.h +++ b/winsup/cygwin/ntdll.h @@ -1162,7 +1162,8 @@ typedef enum _THREADINFOCLASS { ThreadBasicInformation = 0, ThreadTimes = 1, - ThreadImpersonationToken = 5 + ThreadImpersonationToken = 5, + ThreadQuerySetWin32StartAddress = 9 } THREADINFOCLASS, *PTHREADINFOCLASS; /* Checked on 64 bit. */