https://bugs.winehq.org/show_bug.cgi?id=50308
Bug ID: 50308 Summary: Starting certain Wine builtin apps with explicit SysWOW64 path in 64-bit WINEPREFIX causes infinite process restart loop (wineboot, winecfg, ...) Product: Wine Version: 6.0-rc1 Hardware: x86-64 OS: Linux Status: NEW Severity: minor Priority: P2 Component: programs Assignee: wine-bugs@winehq.org Reporter: focht@gmx.net Distribution: ---
Hello folks,
found while playing around with Wow64 file system redirection.
Certain Wine builtin apps restart themselves as 64-bit process when running under Wow64 environment by design to avoid synchronization issues of registry data (shared/redirected/reflected).
Although most users will never try this, explicitly specifying SysWOW64 directory will result in an infinite process restart loop. SysWOW64 is used to bypass the filesystem redirector. In this case it's questionable but still it shouldn't result in the observed behaviour.
--- snip --- $ wine cmd.exe /c "%WINDIR%\syswow64\winecfg.exe"
<will infinitely restart> --- snip ---
Affected apps:
* regedit * uninstaller * wineboot * winecfg * winedbg * wusa
The process restart code is mostly identical across these.
Wine source:
https://source.winehq.org/git/wine.git/blob/76c9dbd4fb99f1257734908906c846a3...
--- snip --- 139 int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) 140 { 141 MSG msg; 142 HACCEL hAccel; 143 BOOL is_wow64; 144 145 if (ProcessCmdLine(GetCommandLineW())) { 146 return 0; 147 } 148 149 if (IsWow64Process( GetCurrentProcess(), &is_wow64 ) && is_wow64) 150 { 151 STARTUPINFOW si; 152 PROCESS_INFORMATION pi; 153 WCHAR filename[MAX_PATH]; 154 void *redir; 155 DWORD exit_code; 156 157 memset( &si, 0, sizeof(si) ); 158 si.cb = sizeof(si); 159 GetModuleFileNameW( 0, filename, MAX_PATH ); 160 161 Wow64DisableWow64FsRedirection( &redir ); 162 if (CreateProcessW( filename, GetCommandLineW(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi )) 163 { 164 WINE_TRACE( "restarting %s\n", wine_dbgstr_w(filename) ); 165 WaitForSingleObject( pi.hProcess, INFINITE ); 166 GetExitCodeProcess( pi.hProcess, &exit_code ); 167 ExitProcess( exit_code ); 168 } 169 else WINE_ERR( "failed to restart 64-bit %s, err %d\n", wine_dbgstr_w(filename), GetLastError() ); 170 Wow64RevertWow64FsRedirection( redir ); 171 } --- snip ---
'regsvr32' has some code that might be useful:
https://source.winehq.org/git/wine.git/blob/76c9dbd4fb99f1257734908906c846a3...
Although that case is a bit different as it supports restart in both directions.
$ wine --version wine-6.0-rc1-39-g76c9dbd4fb9
Regards
https://bugs.winehq.org/show_bug.cgi?id=50308
Ken Sharp imwellcushtymelike@gmail.com changed:
What |Removed |Added ---------------------------------------------------------------------------- Keywords| |download, source