https://bugs.winehq.org/show_bug.cgi?id=48976
Bug ID: 48976 Summary: PowerChute Personal Edition v3.1 (.NET 4.0 app) 'apcrun.exe' utility locks up Xorg/Window Manager with repeated user32.BringWindowToTop calls Product: Wine Version: 5.6 Hardware: x86-64 OS: Linux Status: NEW Severity: normal Priority: P2 Component: user32 Assignee: wine-bugs@winehq.org Reporter: focht@gmx.net Distribution: ---
Hello folks,
this is not aboute device detection (usb/pnpmgr/setupapi), but some nasty user32 issue.
https://www.apc.com/shop/de/de/categories/power/uninterruptible-power-supply...
Snapshot via Internet Archive:
https://web.archive.org/web/20200103074730/https://download.schneider-electr...
--- snip --- $ WINEDEBUG=+seh,+relay,+msi,+setupapi wine ./PCPE_3.1.0.exe >>log.txt 2>&1 ... 002d:Call KERNEL32.CreateProcessA(00000000,0040a418 ""C:\Program Files (x86)\APC\PowerChute Personal Edition\vc_redist.x86.exe" /S",00000000,00000000,00000000,04000000,00000000,00000000,0042c078,01cefd3c) ret=0040566e ... 002d:Ret KERNEL32.CreateProcessA() retval=00000001 ret=0040566e ... 002f:Call KERNEL32.CreateProcessW(01bf76a8 L"C:\Program Files (x86)\APC\PowerChute Personal Edition\vc_redist.x86.exe",01bf6970 L""C:\Program Files (x86)\APC\PowerChute Personal Edition\vc_redist.x86.exe" -burn.unelevated BurnPipe.{AE46C7E5-539F-4055-877F-EA7361775A38} {E1F0B3E4-FE47-4ADC-8749-297B27453BB8} 46 /S",00000000,00000000,00000000,00000000,00000000,00000000,0032f7c8,0032f80c) ret=0043e383 ... 002f:Ret KERNEL32.CreateProcessW() retval=00000001 ret=0043e383 ... --- snip ---
Didn't detect APC and launches 'ApcRun.exe' with option to display (error) dialog.
--- snip --- ... 002d:Call KERNEL32.CreateProcessW(00000000,019fc1f8 L""C:\Program Files (x86)\APC\PowerChute Personal Edition\\ApcRun.exe" Local\IDD_NOCOMMS_ON_INSTALL",00000000,00000000,00000000,00000410,00000000,019fc4a0 L"C:\Program Files (x86)\APC\PowerChute Personal Edition\",01ced418,01ced408) ret=7dbac867 ... 002d:Ret KERNEL32.CreateProcessW() retval=00000001 ret=7dbac867 ... 003b:Starting process L"C:\Program Files (x86)\APC\PowerChute Personal Edition\apcrun.exe" (entryproc=0x401434) ... 003b:Call winex11.drv.SetWindowText(000200be,019b8788 L"The installer is unable to locate the battery backup connected to your computer. In order to disable native power management, an American Power Conversion battery backup needs to be attached.") ret=7e84ead4 003b:Ret winex11.drv.SetWindowText() retval=00000000 ret=7e84ead4 ... 003b:Call winex11.drv.SetWindowText(000200c4,019b8a88 L"If native power management is not disabled you may receive messages from Windows\00ae relating to a 'battery'.") ret=7e84ead4 003b:Ret winex11.drv.SetWindowText() retval=00000000 ret=7e84ead4 ... --- snip ---
The installer dialog template/text is chosen by the command line arg 'IDD_NOCOMMS_ON_INSTALL'. There is an endless stream of user32.BringWindowToTop() calls from the app dialog window proc. You have to quickly kill the process otherwise it's going to lock up Xorg and window manager process with 100% cpu usage.
Manual run:
--- snip --- $ pwd /home/focht/.wine/drive_c/Program Files (x86)/APC/PowerChute Personal Edition
$ WINEDEBUG=+seh,+relay,+win,+msg wine ./apcrun.exe Local\IDD_NOCOMMS_ON_INSTALL >>log.txt 2>&1 ... 002c:Call user32.CreateWindowExA(00000000,00449940 "APC_RUN_CLASS",004498d8 "APC_RUN",00cf0000,80000000,00000000,80000000,00000000,00000000,00000000,00400000,00000000) ret=00401143 ... 002c:trace:win:WIN_CreateWindowEx "APC_RUN" L"APC_RUN_CLASS" ex=00000000 style=00cf0000 -2147483648,0 -2147483648x0 parent=(nil) menu=(nil) inst=0x400000 params=(nil) 002c:trace:win:dump_window_styles style: WS_CAPTION WS_SYSMENU WS_THICKFRAME WS_MINIMIZEBOX WS_MAXIMIZEBOX 002c:trace:win:dump_window_styles exstyle: ... 002c:trace:win:WIN_CreateWindowEx hwnd 0x10072 cs 0,0 1440x810 (0,0)-(1440,810) 002c:Call window proc 0x401090 (hwnd=0x10072,msg=WM_NCCREATE,wp=00000000,lp=0032fbf0) 002c:Call user32.DefWindowProcA(00010072,00000081,00000000,0032fbf0) ret=7e8c211c ... 002c:Call KERNEL32.LoadLibraryA(0032fd94 "C:\Program Files (x86)\APC\PowerChute Personal Edition\\res.dll") ret=10013b66 ... 002c:Ret PE DLL (proc=0x1aa2a8b,module=0x1aa0000 L"res.dll",reason=PROCESS_ATTACH,res=(nil)) retval=1 ... 002c:Ret KERNEL32.LoadLibraryA() retval=01aa0000 ret=10013b66 ... 002c:Call KERNEL32.CreateMutexA(00000000,00000001,10073824 "Local\IDD_NOCOMMS_ON_INSTALL") ret=10016909 ... 002c:Call user32.DialogBoxParamA(01aa0000,000000c8,00010072,10004377,00000000) ret=100142ef ... 002c:trace:win:WIN_CreateWindowEx "PowerChute Personal Edition Setup" #8002 ex=00010001 style=80c00ac4 732,408 455x264 parent=0x10072 menu=(nil) inst=0x1aa0000 params=(nil) 002c:trace:win:dump_window_styles style: WS_POPUP WS_CAPTION 00000ac4 002c:trace:win:dump_window_styles exstyle: WS_EX_DLGMODALFRAME WS_EX_CONTROLPARENT ... 002c:Call window proc 0x7e84e3e0 (hwnd=0x10080,msg=WM_CREATE,wp=00000000,lp=0032f4b0) 002c:trace:win:WIN_SetWindowLong 0x10080 0 0 W 002c:Ret window proc 0x7e84e3e0 (hwnd=0x10080,msg=WM_CREATE,wp=00000000,lp=0032f4b0) retval=00000000 002c:Call winex11.drv.CreateWindow(00010080) ret=7e8b927c 002c:Ret winex11.drv.CreateWindow() retval=00000001 ret=7e8b927c 002c:trace:msg:WINPROC_CallProcWtoA (hwnd=0x10080,msg=WM_SIZE,wp=00000000,lp=00ef01c1) 002c:Call window proc 0x7e84e3e0 (hwnd=0x10080,msg=WM_SIZE,wp=00000000,lp=00ef01c1) 002c:trace:win:WIN_SetWindowLong 0x10080 0 0 W 002c:Ret window proc 0x7e84e3e0 (hwnd=0x10080,msg=WM_SIZE,wp=00000000,lp=00ef01c1) retval=00000000 002c:trace:msg:WINPROC_CallProcWtoA (hwnd=0x10080,msg=WM_MOVE,wp=00000000,lp=01ae02df) 002c:Call window proc 0x7e84e3e0 (hwnd=0x10080,msg=WM_MOVE,wp=00000000,lp=01ae02df) 002c:trace:win:WIN_SetWindowLong 0x10080 0 0 W 002c:Ret window proc 0x7e84e3e0 (hwnd=0x10080,msg=WM_MOVE,wp=00000000,lp=01ae02df) retval=00000000 002c:trace:msg:PostMessageW hwnd 0x10020 msg 210 (WM_PARENTNOTIFY) wp 1 lp 10080 002c:trace:win:WIN_CreateWindowEx created window 0x10080 002c:trace:win:WIN_SetWindowLong 0x10080 4 10004377 A 002c:trace:win:alloc_winproc allocated 0xffff0024 for A 0x10004377 (37/4096 used) 002c:trace:msg:WINPROC_CallProcWtoA (hwnd=0x10080,msg=WM_SETFONT,wp=00020052,lp=00000000) 002c:Call window proc 0x7e84e3e0 (hwnd=0x10080,msg=WM_SETFONT,wp=00020052,lp=00000000) 002c:trace:win:WIN_SetWindowLong 0x10080 0 0 W 002c:Call dialog proc 0x10004377 (hwnd=0x10080,msg=WM_SETFONT,wp=00020052,lp=00000000) 002c:Call user32.BringWindowToTop(00010080) ret=10018cf6 002c:trace:win:SetWindowPos hwnd 0x10080, after (nil), 0,0 (0x0), flags 00000003 002c:trace:win:dump_winpos_flags flags: SWP_NOSIZE SWP_NOMOVE 002c:trace:msg:WINPROC_CallProcWtoA (hwnd=0x10080,msg=WM_WINDOWPOSCHANGING,wp=00000000,lp=0032ed44) 002c:Call window proc 0x7e84e3e0 (hwnd=0x10080,msg=WM_WINDOWPOSCHANGING,wp=00000000,lp=0032ed44) 002c:trace:win:WIN_SetWindowLong 0x10080 0 0 W 002c:Call dialog proc 0x10004377 (hwnd=0x10080,msg=WM_WINDOWPOSCHANGING,wp=00000000,lp=0032ed44) 002c:Call user32.BringWindowToTop(00010080) ret=10018cf6 002c:trace:win:SetWindowPos hwnd 0x10080, after (nil), 0,0 (0x0), flags 00000003 002c:trace:win:dump_winpos_flags flags: SWP_NOSIZE SWP_NOMOVE 002c:trace:msg:WINPROC_CallProcWtoA (hwnd=0x10080,msg=WM_WINDOWPOSCHANGING,wp=00000000,lp=0032e224) 002c:Call window proc 0x7e84e3e0 (hwnd=0x10080,msg=WM_WINDOWPOSCHANGING,wp=00000000,lp=0032e224) 002c:trace:win:WIN_SetWindowLong 0x10080 0 0 W 002c:Call dialog proc 0x10004377 (hwnd=0x10080,msg=WM_WINDOWPOSCHANGING,wp=00000000,lp=0032e224) 002c:Call user32.BringWindowToTop(00010080) ret=10018cf6 ... <dozen of user32.BringWindowToTop() calls)> ... 002c:Ret winex11.drv.WindowPosChanging() retval=00000000 ret=7e8bdb66 002c:trace:win:set_window_pos win 0x10080 surface (nil) -> (nil) 002c:Call winex11.drv.WindowPosChanged(00010080,00000000,0000180f,00302470,00302480,00302300,00000000,00000000) ret=7e8be223 ... 002c:trace:win:SetForegroundWindow 0x10080 002c:trace:msg:send_inter_thread_message hwnd 0x10020 msg 80000006 (WM_WINE_SETACTIVEWINDOW) wp 0 lp 0 002c:trace:msg:PostMessageW hwnd 0x10020 msg 210 (WM_PARENTNOTIFY) wp 86 lp 10080 002c:Call winex11.drv.SetFocus(00010080) ret=7e8640f4 002c:Ret winex11.drv.SetFocus() retval=00000000 ret=7e8640f4 002c:trace:win:USER_SetWindowPos status flags = 1807 002c:Ret user32.BringWindowToTop() retval=00000001 ret=10018cf6 ... <repeats again, eating up cpu> --- snip ---
Unchecking the following settings in 'winecfg' mitigates the issue at bit, avoiding a complete lockup:
* 'Allow the window manager to decorate the windows' * 'Allow the window manager to control the windows'
The sequence is still there though (shown for window destruction):
--- snip --- ... 003c:Call window proc 0x7e84e3e0 (hwnd=0x2008a,msg=WM_NCDESTROY,wp=00000000,lp=00000000) 003c:Call dialog proc 0x10004377 (hwnd=0x2008a,msg=WM_NCDESTROY,wp=00000000,lp=00000000) 003c:Call user32.BringWindowToTop(0002008a) ret=10018cf6 003c:Call window proc 0x7e84e3e0 (hwnd=0x2008a,msg=WM_WINDOWPOSCHANGING,wp=00000000,lp=0032ee74) 003c:Call dialog proc 0x10004377 (hwnd=0x2008a,msg=WM_WINDOWPOSCHANGING,wp=00000000,lp=0032ee74) 003c:Call user32.BringWindowToTop(0002008a) ret=10018cf6 003c:Call window proc 0x7e84e3e0 (hwnd=0x2008a,msg=WM_WINDOWPOSCHANGING,wp=00000000,lp=0032e354) 003c:Call dialog proc 0x10004377 (hwnd=0x2008a,msg=WM_WINDOWPOSCHANGING,wp=00000000,lp=0032e354) 003c:Call user32.BringWindowToTop(0002008a) ret=10018cf6 003c:Call window proc 0x7e84e3e0 (hwnd=0x2008a,msg=WM_WINDOWPOSCHANGING,wp=00000000,lp=0032d834) 003c:Call dialog proc 0x10004377 (hwnd=0x2008a,msg=WM_WINDOWPOSCHANGING,wp=00000000,lp=0032d834) 003c:Call user32.BringWindowToTop(0002008a) ret=10018cf6 003c:Call window proc 0x7e84e3e0 (hwnd=0x2008a,msg=WM_WINDOWPOSCHANGING,wp=00000000,lp=0032cd14) 003c:Call dialog proc 0x10004377 (hwnd=0x2008a,msg=WM_WINDOWPOSCHANGING,wp=00000000,lp=0032cd14) 003c:Call user32.BringWindowToTop(0002008a) ret=10018cf6 003c:Call window proc 0x7e84e3e0 (hwnd=0x2008a,msg=WM_WINDOWPOSCHANGING,wp=00000000,lp=0032c1f4) 003c:Call dialog proc 0x10004377 (hwnd=0x2008a,msg=WM_WINDOWPOSCHANGING,wp=00000000,lp=0032c1f4) 003c:Call user32.BringWindowToTop(0002008a) ret=10018cf6 ... <many more> --- snip ---
I didn't look at it in detail yet, to check if it's a hooking and/or incorrect message sequence issue.
$ sha1sum PCPE_3.1.0.exe e9a10abb4af842a7c98db1aff2e1e00d3f74b749 PCPE_3.1.0.exe
$ du -sh PCPE_3.1.0.exe 36M PCPE_3.1.0.exe
$ wine --version wine-5.6-193-g59987bc9ec
Regards