[Bug 11582] Flash 5 Trial hangs when you click "Try"

wine-bugs at winehq.org wine-bugs at winehq.org
Sun Jun 13 06:30:50 CDT 2010


Anastasius Focht <focht at gmx.net> changed:

           What    |Removed                     |Added
                 CC|                            |focht at gmx.net

--- Comment #8 from Anastasius Focht <focht at gmx.net>  2010-06-13 06:30:49 ---

looks like combination of Wine bug and incredibly stupid app code in some
pathetic software protection scheme.

tid 24 = main thread
tid 26 = debugger thread

--- snip ---
0024:Call user32.CreateWindowExA(00000080,00439f0c
"Turnkexe951396Flash.exe",0045176c "ReleaseNow.com Turnkey
0024:Ret  user32.CreateWindowExA() retval=000501a0 ret=00406f7f.
0024:Ret  KERNEL32.CreateThread() retval=00000054 ret=00401e81
0024:Call KERNEL32.Sleep(00001388) ret=00401e91
0026:Starting thread proc 0x4018f0 (arg=(nil))
0026:Call user32.ShowWindow(000501a0,00000000) ret=00401944
0024:Ret  KERNEL32.Sleep() retval=00000000 ret=00401e91
<thread 0024 live locks here, eating 100% CPU>
--- snip ---

To understand the problem, I present relevant pseudo code snippets of both
threads, made up from disassembly.

Comments are courtesy of
- I picked some to spice this stupid code up ;-)

--- snip main app thread ---

/* reset global variable */
process_info.handle = 0;
/* please work */
thread = CreateThread(0, 0, debugger_thread_proc, 0, 0, &tid);
/* these magic numbers are fscking stupid. */
Sleep( 0x1388);
/* please god, when will the hurting stop? */
while ( !process_info.handle)
WaitForInputIdle( process_info.handle, 0x1388);
--- snip main app thread ---

--- snip debugger thread ---
ShowWindow( main_wnd, 0);
if ( !CreateProcess( ..., (LPPROCESS_INFORMATION) &process_info.handle))
   /* I failed miserably */
   return 0;

/* debugger loop, process events */
for( ;;)
   WaitForDebugEvent( ...)
   ContinueDebugEvent( ...)
--- snip debugger thread ---

After creation, the debugger thread immediately tries to hide the main window -
owned by different thread - before launching the child process -> ShowWindow(
Wine synchronously handles this using SendMessage().

The problem is that the main thread isn't able to process messages at this time
because it's stuck in that incredibly stupid Sleep(

After the main thread delay expires - while debugger thread is still stuck in
ShowWindow() call - the main thread immediately goes into a busy loop, checking
the child process handle.
Because the child process handle is initialized by code run after ShowWindow(),
it will live-lock here.

I'm not sure how Windows handles this - I was too under impression that
ShowWindow() should act synchronously if the window is owned by a different
If the app doesn't live lock in Windows, ShowWindow() behaviour is most likely
different in Windows kernel.


Configure bugmail: http://bugs.winehq.org/userprefs.cgi?tab=email
Do not reply to this email, post in Bugzilla using the
above URL to reply.
------- You are receiving this mail because: -------
You are watching all bug changes.

More information about the wine-bugs mailing list