https://bugs.winehq.org/show_bug.cgi?id=48886
Bug ID: 48886 Summary: LogiRegistryService (part of Logitech Gaming Software 8.x) hogs CPU, relying on blocking behaviour of 'wtsapi32.WTSWaitSystemEvent' Product: Wine Version: 5.5 Hardware: x86-64 OS: Linux Status: NEW Severity: normal Priority: P2 Component: wtsapi32 Assignee: wine-bugs@winehq.org Reporter: focht@gmx.net Distribution: ---
Hello folks,
as it says.
https://support.logi.com/hc/en-us/articles/360025298053
Download:
https://download01.logi.com/web/ftp/pub/techsupport/gaming/LGS_8.82.151_x64_...
Snapshot:
https://web.archive.org/web/20200404175412/https://download01.logi.com/web/f...
Installer log 'LGS8_setup.log':
--- snip --- ... installing "C:\Program Files\Logitech Gaming Software\Drivers\APOService\LogiRegistryService.exe" -install returned 0 starting "C:\Program Files\Logitech Gaming Software\Drivers\APOService\LogiRegistryService.exe" -start returned 0 ... --- snip ---
Relevant part of trace log:
--- snip --- $ WINEDEBUG=+seh,+relay,+msi,+wtsapi wine ./LGS_8.82.151_x64_Logitech.exe
log.txt 2>&1
... 011b:Call KERNEL32.CreateProcessW(00000000,0011eda0 L""C:\Program Files\Logitech Gaming Software\Drivers\APOService\LogiRegistryService.exe"",00000000,00000000,100000000,00000400,00889760,00000000,0022f5a0,0022f580) ret=140006757 ... 011b:Ret KERNEL32.CreateProcessW() retval=00000001 ret=140006757 ... 0125:Starting thread proc 0x7bccded0 (arg=0x11b760) 0125:Call wtsapi32.WTSWaitSystemEvent(00000000,00000028,00eefb00) ret=140004086 ... 0125:Ret wtsapi32.WTSWaitSystemEvent() retval=00000000 ret=140004086 0125:Call wtsapi32.WTSWaitSystemEvent(00000000,00000028,00eefb00) ret=140004086 0125:fixme:wtsapi:WTSWaitSystemEvent Stub 0000000000000000 0x00000028 0000000000EEFB00 0125:Ret wtsapi32.WTSWaitSystemEvent() retval=00000000 ret=140004086 0125:Call wtsapi32.WTSWaitSystemEvent(00000000,00000028,00eefb00) ret=140004086 0125:fixme:wtsapi:WTSWaitSystemEvent Stub 0000000000000000 0x00000028 0000000000EEFB00 0125:Ret wtsapi32.WTSWaitSystemEvent() retval=00000000 ret=140004086 0125:Call wtsapi32.WTSWaitSystemEvent(00000000,00000028,00eefb00) ret=140004086 0125:fixme:wtsapi:WTSWaitSystemEvent Stub 0000000000000000 0x00000028 0000000000EEFB00 0125:Ret wtsapi32.WTSWaitSystemEvent() retval=00000000 ret=140004086 ... 011b:Call KERNEL32.ExitProcess(00000000) ret=7fc308ecdbdc --- snip ---
--- snip --- $ grep "Call wtsapi32.WTSWaitSystemEvent(" log.txt | wc -l 1934913 --- snip ---
Basically it uses 'WTSWaitSystemEvent' to monitor session changes.
0x28 = WTS_EVENT_CONNECT | WTS_EVENT_LOGON
* WTS_EVENT_CONNECT - A client connected to a WinStation. * WTS_EVENT_LOGON - A user logged on to the system from either the Remote Desktop Services console or from a client WinStation.
It only stops at one point because the installer schedules "reboot" which stops the service. On WINEPREFIX restart, the autostart service hogs one core because it endlessly calls this API in quick succession, spamming console as well.
Silencing the stub using FIXME-once is obviously not a proper solution. Faking event data won't help either because the code runs in a thread that expects "long time" blocking behaviour:
App code:
--- snip --- ... 0000000140004070 | lea r8,qword ptr ss:[rsp+60] ; pEventFlags 0000000140004075 | mov edx,28 ; EventMask 000000014000407A | xor ecx,ecx ; hServer 000000014000407C | mov dword ptr ss:[rsp+60],ebp 0000000140004080 | call qword ptr ds:[<&WTSWaitSystemEvent>]; should block 0000000140004086 | mov ecx,dword ptr ss:[rsp+60] ; pEventFlags 000000014000408A | mov dword ptr ss:[rsp+40],ecx 000000014000408E | mov ebx,eax ; retval 0000000140004090 | lea rax,qword ptr ss:[rsp+60] 0000000140004095 | mov qword ptr ss:[rsp+38],rax 000000014000409A | mov dword ptr ss:[rsp+30],28 00000001400040A2 | lea r9,qword ptr ds:[140024CA8] 00000001400040A9 | mov r8d,C0 00000001400040AF | mov rdx,rsi 00000001400040B2 | mov ecx,5 00000001400040B7 | mov qword ptr ss:[rsp+28],rbp 00000001400040BC | mov dword ptr ss:[rsp+20],ebx 00000001400040C0 | call logiregistryservice.140004450 ; debug_message 00000001400040C5 | test ebx,ebx ; retval 00000001400040C7 | je logiregistryservice.1400040DA 00000001400040C9 | mov rcx,qword ptr ds:[rdi+38] 00000001400040CD | mov rcx,qword ptr ds:[rcx+218] 00000001400040D4 | call qword ptr ds:[<&JMP.&SetEvent>] ; signal oth thread 00000001400040DA | cmp byte ptr ds:[rdi+60],bpl ; pEventFlags 00000001400040DE | jne logiregistryservice.140004070 ; loop again 00000001400040E0 | mov rcx,qword ptr ds:[rdi+58] 00000001400040E4 | call qword ptr ds:[<&JMP.&SetEvent>] 00000001400040EA | lea r9,qword ptr ds:[140024C70] ... --- snip --
Wine source:
https://source.winehq.org/git/wine.git/blob/7096ab45444d7b7cbb926b5a51af0cbc...
--- snip --- 567 /************************************************************ 568 * WTSWaitSystemEvent (WTSAPI32.@) 569 */ 570 BOOL WINAPI WTSWaitSystemEvent(HANDLE hServer, DWORD Mask, DWORD* Flags) 571 { 572 /* FIXME: Forward request to winsta.dll::WinStationWaitSystemEvent */ 573 FIXME("Stub %p 0x%08x %p\n", hServer, Mask, Flags); 574 return FALSE; 575 } --- snip ---
Microsoft docs:
https://docs.microsoft.com/en-us/windows/win32/api/wtsapi32/nf-wtsapi32-wtsw...
$ sha1sum LGS_8.82.151_x64_Logitech.exe f21ae9214f8608ac192cd474c5f15734a75ca115 LGS_8.82.151_x64_Logitech.exe
$ du -sh LGS_8.82.151_x64_Logitech.exe 117M LGS_8.82.151_x64_Logitech.exe
$ wine --version wine-5.5-242-g7096ab4544
Regards