[Bug 36523] Original War: Patcher 1.12.10.12 fails at writing data1.owp`s header - canvas does not allow drawing

wine-bugs at winehq.org wine-bugs at winehq.org
Sun May 25 06:10:26 CDT 2014


https://bugs.winehq.org/show_bug.cgi?id=36523

Anastasius Focht <focht at gmx.net> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
                URL|                            |http://www.owsupport.com/pa
                   |                            |tches/OWPatch_1.12.10.12.ra
                   |                            |r
                 CC|                            |focht at gmx.net
     Ever confirmed|0                           |1

--- Comment #1 from Anastasius Focht <focht at gmx.net> ---
Hello folks,

confirming.

The installer is written in Borland Delphi 6.

Looks like a threading/timing issue with unprotected shared instance data (app
bug).

tid 002d = main thread
tid 002e = secondary 'setup' thread

--- snip ---
$ WINEDEBUG=+tid,+seh,+relay wine ./OWPatch_1.12.10.12.exe >>log.txt 2>&1
...
...
002e:Call KERNEL32.WideCharToMultiByte(00000000,00000000,0016b22c L"Processing
data1.owp: 0 of 6577 files",00000025,0072d904,00000fff,00000000,00000000)
ret=004049b7
002e:Ret  KERNEL32.WideCharToMultiByte() retval=00000025 ret=004049b7
002e:Call user32.InvalidateRect(000200ac,0072e778,00000000) ret=0044b29d
002e:Ret  user32.InvalidateRect() retval=00000001 ret=0044b29d
002e:Call user32.GetDC(00000000) ret=00437c75
002e:Call winex11.drv.CreateDesktopWindow(00030058) ret=7ed17290
002e:Ret  winex11.drv.CreateDesktopWindow() retval=00000001 ret=7ed17290
002e:Ret  user32.GetDC() retval=0004002a ret=00437c75
002e:Call gdi32.MoveToEx(0004002a,00000000,00000000,00000000) ret=00429e67
002e:Ret  gdi32.MoveToEx() retval=00000001 ret=00429e67 
...
002d:Call user32.DrawTextW(0dc100a9,00e90ed4 L"Processing data1.owp: 0 of 6577
files",00000025,0033dbd0,00000040) ret=004827fc
002d:Ret  user32.DrawTextW() retval=0000000d ret=004827fc
002d:Call oleaut32.SysFreeString(00e90ed4 L"Processing data1.owp: 0 of 6577
files") ret=00404fc7
002d:Ret  oleaut32.SysFreeString() retval=00000000 ret=00404fc7
002d:Call oleaut32.SysFreeString(00e8f5c4 L"Processing data1.owp: 0 of 6577
files") ret=00404fc7
002d:Ret  oleaut32.SysFreeString() retval=00000000 ret=00404fc7
002d:Call gdi32.SelectObject(0dc100a9,00010017) ret=0042a23c
002d:Ret  gdi32.SelectObject() retval=00040054 ret=0042a23c
002d:Call gdi32.SelectObject(0dc100a9,00010015) ret=0042a24b
002d:Ret  gdi32.SelectObject() retval=00020063 ret=0042a24b
002d:Call gdi32.SelectObject(0dc100a9,0001001e) ret=0042a25a
002d:Ret  gdi32.SelectObject() retval=00110053 ret=0042a25a
002d:Call gdi32.GetCurrentPositionEx(0dc100a9,0033dc04) ret=0042a135
002d:Ret  gdi32.GetCurrentPositionEx() retval=00000001 ret=0042a135
002d:Call gdi32.RestoreDC(0dc100a9,00000001) ret=0044f532
002d:Ret  gdi32.RestoreDC() retval=00000001 ret=0044f532
002d:Call gdi32.RectVisible(0dc100a9,0033dd90) ret=0044f4de
002d:Ret  gdi32.RectVisible() retval=00000000 ret=0044f4de
002d:Call user32.EndPaint(000200ac,0033ddcc) ret=0044f3e3
002e:Ret  oleaut32.SysReAllocStringLen() retval=00000001 ret=0040500b
002e:Call user32.GetDC(000200ac) ret=004513c0
002d:Ret  user32.EndPaint() retval=00000001 ret=0044f3e3
002e:Call
winex11.drv.GetDC(001700d5,000200ac,0001009e,0072e548,0072e538,0000001a)
ret=7ecf1afe
002e:Ret  winex11.drv.GetDC() retval=00000001 ret=7ecf1afe
002e:Ret  user32.GetDC() retval=001700d5 ret=004513c0
002e:Call gdi32.SetViewportOrgEx(001700d5,000000dc,00000090,00000000)
ret=0044b152
002e:Ret  gdi32.SetViewportOrgEx() retval=00000001 ret=0044b152
002e:Call gdi32.IntersectClipRect(001700d5,00000000,00000000,00000034,0000000d)
ret=0044b164
002e:Ret  gdi32.IntersectClipRect() retval=00000002 ret=0044b164
002d:Call user32.ReleaseDC(000200ac,001700d5) ret=0044996b
002d:Ret  user32.ReleaseDC() retval=00000001 ret=0044996b
002d:Call gdi32.SelectObject(0025004d,00010017) ret=0042a23c
002d:Ret  gdi32.SelectObject() retval=00010018 ret=0042a23c
002d:Call gdi32.SelectObject(0025004d,00010015) ret=0042a24b
002d:Ret  gdi32.SelectObject() retval=00020063 ret=0042a24b
002d:Call gdi32.SelectObject(0025004d,0001001e) ret=0042a25a
002d:Ret  gdi32.SelectObject() retval=00110053 ret=0042a25a
002d:Call gdi32.GetCurrentPositionEx(0025004d,0033dfb8) ret=0042a135
002d:Ret  gdi32.GetCurrentPositionEx() retval=00000001 ret=0042a135
002d:Call user32.ReleaseDC(000200ac,0025004d) ret=0044996b
002d:Ret  user32.ReleaseDC() retval=00000001 ret=0044996b
002d:Ret  window proc 0x350fc8
(hwnd=0x200ac,msg=WM_PAINT,wp=00000000,lp=00000000) retval=00000000
002e:Call user32.LoadStringA(00400000,0000ff61,0072e2cc,00000400) ret=00406e32
002e:Ret  user32.LoadStringA() retval=0000001d ret=00406e32
002d:Ret  user32.DispatchMessageA() retval=00000000 ret=0046be48
002d:Call user32.PeekMessageA(0033e26c,00000000,00000000,00000000,00000001)
ret=0046bdd8
002e:Call KERNEL32.RaiseException(0eedfade,00000001,00000007,0072e6dc)
ret=0042a30a
002d:Call
winex11.drv.MsgWaitForMultipleObjectsEx(00000000,00000000,00000000,000004ff,00000000)
ret=7ed2733f
002d:Ret  winex11.drv.MsgWaitForMultipleObjectsEx() retval=00000102
ret=7ed2733f
002d:Ret  user32.PeekMessageA() retval=00000000 ret=0046bdd8
002d:Call KERNEL32.Sleep(00000001) ret=004e8604 
002e:trace:seh:raise_exception code=eedfade flags=1 addr=0x7b83ac57 ip=7b83ac57
tid=002e
002e:trace:seh:raise_exception  info[0]=0042a30a
002e:trace:seh:raise_exception  info[1]=016600dc
002e:trace:seh:raise_exception  info[2]=ff82210f
002e:trace:seh:raise_exception  info[3]=007dde00
002e:trace:seh:raise_exception  info[4]=007dde00
002e:trace:seh:raise_exception  info[5]=0072e744
002e:trace:seh:raise_exception  info[6]=0072e6f8
002e:trace:seh:raise_exception  eax=7b826c7d ebx=7b8bb000 ecx=0072e6f8
edx=0072e650 esi=0072e6dc edi=0072e6a0
002e:trace:seh:raise_exception  ebp=0072e678 esp=0072e614 cs=0023 ds=002b
es=002b fs=0063 gs=006b flags=00200283
002e:trace:seh:call_stack_handlers calling handler at 0x4bafa1 code=eedfade
flags=1
002e:trace:seh:call_stack_handlers handler at 0x4bafa1 returned 1 
...
002e:Call user32.MessageBoxA(00000000,02c8425c "Setup Thread Error: Canvas does
not allow drawing\r\rError Log Created. Please Include
\"C:\\users\\focht\\Temp\\\\ErrorLog0000.TXT\" with your bug report",004e601c
"Error Report",00000000) ret=004e5df4 
--- snip ---

This seems to happen at the start of 'patch' phase, after extraction of patch
files ('Processing data1.owp: 0 of 6577 files').

Main thread 002d handles a full WM_PAINT at the time when thread 002e also does
drawing operations to some DC (albeit a different one).
My guess is that the app is bugged, not protecting some internal instance data
properly.
This is probably hidden on Windows due to different execution timing/underlying
architecture (gdi32/user32 -> kernel).

You can try the following workaround to pin the process (and its threads) to a
single core.
This has the effect of forcing serialized execution of certain code sections,
making it behave a bit more "atomic".

--- snip ---
$ taskset -c 0 wine ./OWPatch_1.12.10.12.exe
--- snip ---

$ sha1sum OWPatch_1.12.10.12.rar
2d0d42995ef0ecd0eeedeb40b8bb421d3ee983f4  OWPatch_1.12.10.12.rar

$ du -sh OWPatch_1.12.10.12.rar
76M    OWPatch_1.12.10.12.rar

$ wine --version
wine-1.7.19-56-gee13e10

Regards

-- 
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