https://bugs.winehq.org/show_bug.cgi?id=37915
Anastasius Focht focht@gmx.net changed:
What |Removed |Added ---------------------------------------------------------------------------- Component|-unknown |wineserver Summary|32-bit UPlay games fail in |Multiple games and |64-bit WINEPREFIX with |applications need proper |WinVer set to 'Windows |handling of Vista+ |Vista/7' ('IsWow64Process' |'PROCESS_QUERY_LIMITED_INFO |fails if process was opened |RMATION' right (UPlay |with |games, MS Visual Studio |'PROCESS_QUERY_LIMITED_INFO |2015 installer) |RMATION' rights) | Severity|minor |normal
--- Comment #4 from Anastasius Focht focht@gmx.net --- Hello folks,
it seems the MS Visual Studio 2015 Community Edition installer is also suffering from this. Refining the summary and raising priority.
Download: https://go.microsoft.com/fwlink/?LinkId=532606
Prerequisite:
* .NET Framework 4.0, 4.5 -> 'winetricks -q dotnet40' and run the .NET Framework 4.5 installer manually (to avoid having all previous .NET Frameworks installed, not needed here) * Windows version set to 'Windows 7'
Terminal output, includes managed backtrace:
--- snip --- $ wine ./vs_community.exe ... fixme:advapi:RegisterEventSourceW ((null),L".NET Runtime"): stub fixme:advapi:ReportEventW (0xcafe4242,0x0001,0x0000,0x00000402,(nil),0x0001,0x00000000,0x50ccd84,(nil)): stub err:eventlog:ReportEventW L"Application: vs_community.exe\nFramework Version: v4.0.30319\nDescription: The process was terminated due to an unhandled exception.\nException Info: System.ComponentModel.Win32Exception\nStack:\n at System.Diagnostics.Process.GetProcessTimes()\n at System.Diagnostics.Process.get_StartTime()\n "... fixme:advapi:DeregisterEventSource (0xcafe4242) stub
Unhandled Exception: fixme:nls:LocaleNameToLCID unsupported flags 8000000 fixme:nls:LocaleNameToLCID unsupported flags 8000000 fixme:nls:LocaleNameToLCID unsupported flags 8000000 fixme:advapi:EventRegister {8e9f5090-2d75-4d03-8a81-e5afbf85daf1}, 0xdc3902, (nil), 0x192e9b8 System.ComponentModel.Win32Exception: Success at System.Diagnostics.Process.GetProcessTimes() at System.Diagnostics.Process.get_StartTime() at Microsoft.Devdiv.Bootstrapper.ManagedUx.Run() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() wine: Unhandled exception 0xe0434352 in thread 38 at address 0x7b845d3d (thread 0038), starting debugger... --- snip ---
Relevant part of trace log:
--- snip --- ... 003a:Call KERNEL32.OpenProcess(00001000,00000000,00000030) ret=04c9f874 003a: open_process( pid=0030, access=00001000, attributes=00000000 ) 003a: open_process() = 0 { handle=023c } 003a:Ret KERNEL32.OpenProcess() retval=0000023c ret=04c9f874 003a:Call KERNEL32.GetLastError() ret=00ee19c8 003a:Ret KERNEL32.GetLastError() retval=00000000 ret=00ee19c8 ... 003a:Call KERNEL32.GetProcessTimes(0000023c,0192a178,0192a180,0192a188,0192a190) ret=04c9f970 003a:trace:ntdll:NtQueryInformationProcess (0x23c,0x00000004,0x50ce020,0x00000020,(nil)) 003a: get_process_info( handle=023c ) 003a: get_process_info() = ACCESS_DENIED { pid=0000, ppid=0000, affinity=00000000, peb=00000000, start_time=0, end_time=0, exit_code=0, priority=0, cpu=x86, debugger_present=0 } 003a:Ret KERNEL32.GetProcessTimes() retval=00000000 ret=04c9f970 003a:Call KERNEL32.GetLastError() ret=00ee19c8 003a:Ret KERNEL32.GetLastError() retval=00000000 ret=00ee19c8 ... --- snip ---
Managed code for reference:
--- snip --- // Microsoft.Win32.NativeMethods [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern bool GetProcessTimes(SafeProcessHandle handle, out long creation, out long exit, out long kernel, out long user);
...
// System.Diagnostics.Process private ProcessThreadTimes GetProcessTimes() { ProcessThreadTimes processThreadTimes = new ProcessThreadTimes(); SafeProcessHandle safeProcessHandle = null; try { safeProcessHandle = this.GetProcessHandle(1024, false); if (safeProcessHandle.IsInvalid) { throw new InvalidOperationException(SR.GetString("ProcessHasExited", new object[] { this.processId.ToString(CultureInfo.CurrentCulture) })); } if (!NativeMethods.GetProcessTimes(safeProcessHandle, out processThreadTimes.create, out processThreadTimes.exit, out processThreadTimes.kernel, out processThreadTimes.user)) { throw new Win32Exception(); } } finally { this.ReleaseProcessHandle(safeProcessHandle); } return processThreadTimes; } --- snip ---
The process is opened with 'PROCESS_QUERY_LIMITED_INFORMATION' (0x1000) access rights. Wineserver has pre-Vista behaviour hard-coded in several places:
'PROCESS_QUERY_INFORMATION' (0x400) access rights
Source: https://source.winehq.org/git/wine.git/blob/905bf79337e04ed31d2823508e901692...
--- snip --- 1337 /* fetch information about a process */ 1338 DECL_HANDLER(get_process_info) 1339 { 1340 struct process *process; 1341 1342 if ((process = get_process_from_handle( req->handle, PROCESS_QUERY_INFORMATION ))) 1343 { 1344 reply->pid = get_process_id( process ); 1345 reply->ppid = process->parent ? get_process_id( process->parent ) : 0; 1346 reply->exit_code = process->exit_code; 1347 reply->priority = process->priority; 1348 reply->affinity = process->affinity; 1349 reply->peb = process->peb; 1350 reply->start_time = process->start_time; 1351 reply->end_time = process->end_time; 1352 reply->cpu = process->cpu; 1353 reply->debugger_present = !!process->debugger; 1354 release_object( process ); 1355 } 1356 } --- snip ---
https://source.winehq.org/git/wine.git/blob/5d85f57814f023c105948636094e5e07...
--- snip --- 415 /* retrieve the object corresponding to a handle, incrementing its refcount */ 416 struct object *get_handle_obj( struct process *process, obj_handle_t handle, 417 unsigned int access, const struct object_ops *ops ) 418 { 419 struct handle_entry *entry; 420 struct object *obj; 421 422 if (!(obj = get_magic_handle( handle ))) 423 { 424 if (!(entry = get_handle( process, handle ))) 425 { 426 set_error( STATUS_INVALID_HANDLE ); 427 return NULL; 428 } 429 obj = entry->ptr; 430 if (ops && (obj->ops != ops)) 431 { 432 set_error( STATUS_OBJECT_TYPE_MISMATCH ); /* not the right type */ 433 return NULL; 434 } 435 if ((entry->access & access) != access) 436 { 437 set_error( STATUS_ACCESS_DENIED ); 438 return NULL; 439 } 440 } ... 447 } --- snip ---
MSDN: https://msdn.microsoft.com/de-de/library/windows/desktop/ms684880%28v=vs.85%...
--- quote --- ... A handle that has the PROCESS_QUERY_INFORMATION access right is automatically granted PROCESS_QUERY_LIMITED_INFORMATION.
Windows Server 2003 and Windows XP: This access right is not supported. ... --- quote ---
$ sha1sum vs_community.exe 396d8565f81969783bb4eb57aeff995cdabb8077 vs_community.exe
$ du -sh vs_community.exe 3.0M vs_community.exe
$ wine --version wine-1.7.49-41-g36a39ce
Regards