[Bug 32451] Multiple GOG.com installer bundles show a broken/unresponsive dialog window during installation (process running of wndproc slots)
wine-bugs at winehq.org
wine-bugs at winehq.org
Fri Oct 4 11:37:36 CDT 2013
http://bugs.winehq.org/show_bug.cgi?id=32451
Anastasius Focht <focht at gmx.net> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
CC| |focht at gmx.net
Component|-unknown |user32
Summary|Cannot install the witcher |Multiple GOG.com installer
|enhanced edition from GOG |bundles show a
|(installation freeze) |broken/unresponsive dialog
| |window during installation
| |(process running of wndproc
| |slots)
Ever Confirmed|0 |1
--- Comment #8 from Anastasius Focht <focht at gmx.net> 2013-10-04 11:37:36 CDT ---
Hello folks,
confirming, affects multiple GOG.com installer bundles.
The problem seems to be that one sub-installer process runs of winproc slots as
indicated by "fixme:win:alloc_winproc too many winprocs, cannot allocate one"
messages.
Attaching debugger during install and setting a breakpoint on alloc_winproc
gives:
--- snip ---
Wine-dbg>info thread
process tid prio (all id:s are in hex)
...
0000002a setup_nwn2_complete_2.1.0.6.exe
0000002b 0
0000002c (D) C:\users\focht\Temp\is-K7HIQ.tmp\setup_nwn2_complete_2.1.0.6.tmp
0000002d 0 <==
...
Wine-dbg>info share
Module Address Debug info Name (125 modules)
PE 400000- 537000 Export setup_nwn2_complete_2.1.0.6.tmp
PE 7b0000- 7c5000 Export innocallback
PE 7d0000- 7ea000 Export gameuxinstallhelper
PE 7f0000- 805000 Export crcdll
PE 810000- 81e000 Export botva2
PE 10000000-10014000 Export get_hw_caps
...
Backtrace:
=>0 0x7e9b66a8 alloc_winproc(func=0xdd6db68, unicode=0)
[/home/focht/projects/wine/wine-git/dlls/user32/winproc.c:146] in user32
(0x0032ecb8)
1 0x7e97b5c3 SetTimer+0x3b(hwnd=0x40022, id=0x1, timeout=0x64,
proc=0xdd6db68) [/home/focht/projects/wine/wine-git/dlls/user32/message.c:4405]
in user32 (0x0032ed7c)
2 0x00498872 in setup_nwn2_complete_2.1.0.6.tmp (+0x98871) (0x0032ed98)
3 0x0049a75e in setup_nwn2_complete_2.1.0.6.tmp (+0x9a75d) (0x0032ef1c)
4 0x004a0442 in setup_nwn2_complete_2.1.0.6.tmp (+0xa0441) (0x0032ef6c)
5 0x00493a96 in setup_nwn2_complete_2.1.0.6.tmp (+0x93a95) (0x0032f01c)
6 0x004928d7 in setup_nwn2_complete_2.1.0.6.tmp (+0x928d6) (0x0032f068)
7 0x0049db95 in setup_nwn2_complete_2.1.0.6.tmp (+0x9db94) (0x0032f0d4)
8 0x0049d63f in setup_nwn2_complete_2.1.0.6.tmp (+0x9d63e) (0x0032f108)
9 0x7e9b6a53 call_window_proc+0xcc(hwnd=0x40022, msg=0x113, wp=0x1,
lp=0x134feeb, result=0x32f178, arg=0xdd6ab4c)
[/home/focht/projects/wine/wine-git/dlls/user32/winproc.c:244] in user32
(0x0032f148)
10 0x7e9b8deb CallWindowProcA+0xe8(func=0xffff0c1d, hwnd=0x40022, msg=0x113,
wParam=0x1, lParam=0x134feeb)
[/home/focht/projects/wine/wine-git/dlls/user32/winproc.c:959] in user32
(0x0032f188)
...
Backtrace:
=>0 0x7e9b66a8 alloc_winproc(func=0xdd70b88, unicode=0)
[/home/focht/projects/wine/wine-git/dlls/user32/winproc.c:146] in user32
(0x0032ecb8)
1 0x7e97b5c3 SetTimer+0x3b(hwnd=0x40022, id=0x1, timeout=0x64,
proc=0xdd70b88) [/home/focht/projects/wine/wine-git/dlls/user32/message.c:4405]
in user32 (0x0032ed7c)
2 0x00498872 in setup_nwn2_complete_2.1.0.6.tmp (+0x98871) (0x0032ed98)
3 0x0049a75e in setup_nwn2_complete_2.1.0.6.tmp (+0x9a75d) (0x0032ef1c)
4 0x004a0442 in setup_nwn2_complete_2.1.0.6.tmp (+0xa0441) (0x0032ef6c)
5 0x00493a96 in setup_nwn2_complete_2.1.0.6.tmp (+0x93a95) (0x0032f01c)
6 0x004928d7 in setup_nwn2_complete_2.1.0.6.tmp (+0x928d6) (0x0032f068)
7 0x0049db95 in setup_nwn2_complete_2.1.0.6.tmp (+0x9db94) (0x0032f0d4)
8 0x0049d63f in setup_nwn2_complete_2.1.0.6.tmp (+0x9d63e) (0x0032f108)
9 0x7e9b6a53 call_window_proc+0xcc(hwnd=0x40022, msg=0x113, wp=0x1,
lp=0x1354b61, result=0x32f178, arg=0xdd6db68)
[/home/focht/projects/wine/wine-git/dlls/user32/winproc.c:244] in user32
(0x0032f148)
10 0x7e9b8deb CallWindowProcA+0xe8(func=0xffff0c1e, hwnd=0x40022, msg=0x113,
wParam=0x1, lParam=0x1354b61)
[/home/focht/projects/wine/wine-git/dlls/user32/winproc.c:959] in user32
(0x0032f188)
...
--- snip ---
The app continuously registers a 100ms timer with id=1 and _different_ timer
callback each time.
This appears to be part of an installer progress update handler:
--- snip ---
...
0027:Call oleaut32.SysAllocStringLen(0032de24
L"INSTALLER_GOGPACKNWN2COMPLETE_PROGRESS_%3.0f",0000002c) ret=00405f48
0027:Ret oleaut32.SysAllocStringLen() retval=00165134 ret=00405f48
...
0027:Call KERNEL32.GlobalAlloc(00000002,00002000) ret=007b5733
0027:Ret KERNEL32.GlobalAlloc() retval=05fcf01a ret=007b5733
0027:Call KERNEL32.GlobalLock(05fcf01a) ret=007b5739
0027:Ret KERNEL32.GlobalLock() retval=06045640 ret=007b5739
0027:Call KERNEL32.VirtualAlloc(04df0000,00004000,00001000,00000004)
ret=007b161a
0027:Ret KERNEL32.VirtualAlloc() retval=04df0000 ret=007b161a
0027:Call KERNEL32.VirtualProtect(04df0574,0000001f,00000040,0032ed04)
ret=007bcb4f
0027:Ret KERNEL32.VirtualProtect() retval=00000001 ret=007bcb4f
0027:Call KERNEL32.GlobalHandle(06045640) ret=007b575e
0027:Ret KERNEL32.GlobalHandle() retval=05fcf01a ret=007b575e
0027:Call KERNEL32.GlobalUnlock(05fcf01a) ret=007b5765
0027:Ret KERNEL32.GlobalUnlock() retval=00000000 ret=007b5765
0027:Call KERNEL32.GlobalFree(05fcf01a) ret=007b576a
0027:Ret KERNEL32.GlobalFree() retval=00000000 ret=007b576a
0027:Call KERNEL32.GetLastError() ret=004a0447
0027:Ret KERNEL32.GetLastError() retval=00000000 ret=004a0447
0027:Call user32.SetTimer(000200ce,00000001,00000064,04df0574) ret=00498872
0027:trace:win:alloc_winproc allocated 0xffff0181 for A 0x4df0574 (386/4096
used)
0027:Ret user32.SetTimer() retval=00000001 ret=00498872
...
0027:Ret window proc 0x4deffcc
(hwnd=0x200ce,msg=WM_TIMER,wp=00000001,lp=0147791e) retval=00000000
...
0027:Call window proc 0x4df0574
(hwnd=0x200ce,msg=WM_TIMER,wp=00000001,lp=0147798d)
...
0027:Call user32.KillTimer(000200ce,00000001) ret=00498872
0027:Ret user32.KillTimer() retval=00000001 ret=00498872
...
--- snip ---
The code that allocates the timer callback is located in 0x007b0000 range which
maps to "innocallback.dll".
A bit of research reveals this is the "InnoCallback" library from
http://www.sherlocksoftware.org/page.php?id=55
The library exports a function "wrapcallback" to allow creating stdcall-style
callbacks (dynamically allocated thunks) for use with win32 API.
Wine SetTimer() allocates a new slot each time it sees a different wndproc.
With a rate of 10 wndproc/s and 4096 slots it takes ~7 mins until the process
runs out of wndproc slots.
For large installers this will almost be the case.
This is why the dialog window looks so strange and doesn't respond to mouse
clicks.
Windows probably doesn't have this artificial 4096 winproc slots limitation.
Source:
http://source.winehq.org/git/wine.git/blob/7c7fa1051c31b93729c5d299a96b9ee8d83be312:/dlls/user32/winproc.c#l48
--- snip ---
48 #define MAX_WINPROCS 4096
...
67 static WINDOWPROC winproc_array[MAX_WINPROCS] =
68 {
...
82 };
--- snip ---
For testing I raised the limit to 16K slots and it lets the Neverwinter Nights
II installer succeed.
16K slots gives GOG.com installer bundles ~27 mins which should be sufficient.
$ wine --version
wine-1.7.3-205-g5451a1e
Regards
--
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