[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