On Wed Mar 19 05:07:15 2025 +0000, Rémi Bernon wrote:
> Is it really useful to test such corner case here?
I'm not sure what you mean by corner case, the test fails on i386 because 0xdeadbeef is too big of an allocation. In any case, letting malloc handle it makes the check unnecessary.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7597#note_98369
Microsoft Edge worked if windows version is set to win8.1 (or win7) but
now crashes in current wine due to this unimplemented function.
This patch makes it work again in win8.1 mode;
(It's still broken in win10 mode, see https://bugs.winehq.org/show_bug.cgi?id=56378 for more info)
--
v11: win32u: Add stub for NtUserSetAdditionalForegroundBoostProcesses.
https://gitlab.winehq.org/wine/wine/-/merge_requests/7607
On Tue Mar 18 23:36:40 2025 +0000, Jinoh Kang wrote:
> Yeah, I think so. FWIW, even with two MOVs, should be faster than one
> MOV from GS indirect.
Thanks, I suspect the performance impact is negligible but the patch is certainly cleaner.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/6866#note_98354
x86_64 Windows and macOS both use `%gs` to access thread-specific data (Windows TEB, macOS TSD). To date, Wine has worked around this conflict by filling the most important TEB fields (`0x30`/`Self`, `0x58`/`ThreadLocalStorage`) in the macOS TSD structure (Apple reserved the fields for our use). This was sufficient for most Windows apps.
CrossOver's Wine had an additional hack to handle `0x60`/`ProcessEnvironmentBlock`, and binary patches for certain CEF binaries which directly accessed `0x8`/`StackBase`. Additionally, Apple's libd3dshared could activate a special mode in Rosetta 2 where code executing in certain regions would use the Windows TEB when accessing `%gs`.
Now that the PE separation is complete, GSBASE can be swapped when entering/exiting PE code. This is done in the syscall dispatcher, unix-call dispatcher, and for user-mode callbacks. GSBASE also needs to be set to the macOS TSD when entering signal handlers (in `init_handler()`), and then restored to the Windows TEB when exiting (in `leave_handler()`).
Some changes to the syscall dispatcher were needed to ensure that the TEB is not accessed through `%gs` while on the kernel stack (since a SIGUSR1 while on the kernel stack will result in GSBASE being set to the TSD).
---
I've tested this successfully on macOS 15 (Apple Silicon and Intel) and macOS 10.13 with several apps and games, including the `cefclient.exe` CEF sample.
Encouragingly, in some simple tests I didn't see a noticeable performance regression from this MR.
There are drawbacks though:
- libraries which jump directly from PE code into Unix code (expecting that %gs is always pointing to the macOS TSD) will crash. Notable examples are D3DMetal and DXMT. These will need to be changed to use Unix calls.
- If Windows code uses the `syscall` instruction directly, the stack pointer likely needs to be valid (which is probably not true on Windows). This is due to the syscall dispatcher saving registers onto the user stack and having to call `_thread_set_tsd_base`. I can't say I've ever seen direct syscalls done with an invalid `%rsp`, but it seems like something anticheat code might do.
---
macOS does not have a public API for setting GSBASE, but the private `_thread_set_tsd_base()` works and was added in macOS 10.12.
`_thread_set_tsd_base()` is a small thunk that sets `%esi`, `%eax`, and does the `syscall`: https://github.com/apple-oss-distributions/xnu/blob/8d741a5de7ff4191bf97d57….
The syscall instruction itself clobbers `%rcx` and `%r11`.
I've tried to save as few registers as possible when calling `_thread_set_tsd_base()`, but there may be room for improvement there.
---
I also tested an alternate implementation strategy for this which took advantage of the expanded "full" thread state which is passed to signal handlers when a process has set a user LDT. The full thread state includes GSBASE, so GSBASE is set back to whatever is in the sigcontext on return (like every other field in the context). This would avoid needing to explicitly reset GSBASE in `leave_handler()`.
This strategy was simpler, but I'm not using it for 2 reasons:
- the "full" thread state is only available starting with macOS 10.15, and we still support 10.13.
- more crucially, Rosetta 2 doesn't seem to correctly implement the GS.base field of the full thread state. It's set to 0 on entry, and isn't read on exit.
--
v4: ntdll: Remove x86_64 Mac-specific TEB access workarounds that are no longer needed.
ntdll: On macOS x86_64, swap GSBASE between the TEB and macOS TSD when entering/leaving PE code.
ntdll: Leave kernel stack before accessing %gs in x86_64 syscall dispatcher.
ntdll: Don't access the TEB through %gs when using the kernel stack in x86_64 syscall dispatcher.
ntdll: Ensure init_handler runs in signal handlers before any compiler-generated memset calls.
ntdll: Remove ugly fallback method for getting a thread's GSBASE on macOS.
https://gitlab.winehq.org/wine/wine/-/merge_requests/6866
Some console objects currently do several unique things:
* Delegate waits onto the queue of another object. This is not really a problem
for in-process waits, since we can just return the sync object for the
delegate. However, it's also unnecessary, adds to the complexity of the server
logic, and is one out of one places where this is done.
* Make the wait state dependent on the process. This is difficult to emulate
with ntsync and would require creating separate server objects for each
process, hacking into duplicate_handle.
* Fail a wait entirely in certain circumstances. This is pretty much impossible
to emulate with in-process waits.
Although ntsync has been in development for some time, I have regrettably failed
to notice these problems until now.
Fortunately, none of these behaviours happen on modern Windows. Although I/O on
unbound handles delegates to the console of the current process, the signaled
state does not. As the tests here show, the signaled state of a handle depends
on the active console of the process in which the handle was created. If that
console no longer exists, the signaled state is no longer updated [with one
rather inexplicable exception].
Crucially, in current Windows waits never fail, and the state of an object is
the same across all process which hold handles to it. Therefore this patch
brings our behaviour to closer match current Windows.
In theory these are fds and should use default_fd_signaled(). However, the
points at which the handles are signaled are completely different, and I/O does
not trigger console handles to become signaled when it normally would. Therefore
for the time being I've kept the code using custom signaled ops.
There is one other oddity related to consoles, which is the existence of
console_add_queue(), which seeks to lazily create an input thread when a console
is first waited on. This is one out of two places, after this patch, when the
wait process is hijacked (the other being message queues). Fortunately this is
easy to handle for in-process synchronization objects, by queueing the ioctl
from the callback used to retrieve the in-process synchronization object itself.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7608
--
v11: server: Handle hardlinks and casefolding when renaming the same file.
server: Handle renames to destinations containing trailing slashes.
kernel32/tests: Test renaming a file into a hardlink of itself.
kernel32/tests: Use FindClose instead of CloseHandle when closing
https://gitlab.winehq.org/wine/wine/-/merge_requests/6855
Microsoft Edge worked if windows version is set to win8.1 (or win7) but
now crashes in current wine due to this unimplemented function.
This patch makes it work again in win8.1 mode;
(It's still broken in win10 mode, see https://bugs.winehq.org/show_bug.cgi?id=56378 for more info)
--
v9: win32u: Add stub for NtUserSetAdditionalForegroundBoostProcesses.
https://gitlab.winehq.org/wine/wine/-/merge_requests/7607
Microsoft Edge worked if windows version is set to win8.1 (or win7) but
now crashes in current wine due to this unimplemented function.
This patch makes it work again in win8.1 mode;
(It's still broken in win10 mode, see https://bugs.winehq.org/show_bug.cgi?id=56378 for more info)
--
v7: win32u: Add stub for NtUserSetAdditionalForegroundBoostProcesses.
https://gitlab.winehq.org/wine/wine/-/merge_requests/7607
Microsoft Edge worked if windows version is set to win8.1 (or win7) but
now crashes in current wine due to this unimplemented function.
This patch makes it work again in win8.1 mode;
(It's still broken in win10 mode, see https://bugs.winehq.org/show_bug.cgi?id=56378 for more info)
--
v5: win32u: Add stub for NtUserSetAdditionalForegroundBoostProcesses.
https://gitlab.winehq.org/wine/wine/-/merge_requests/7607
Microsoft Edge worked if windows version is set to win8.1 (or win7) but
now crashes in current wine due to this unimplemented function.
This patch makes it work again in win8.1 mode;
(It's still broken in win10 mode, see https://bugs.winehq.org/show_bug.cgi?id=56378 for more info)
--
v3: win32u: Add stub for NtUserSetAdditionalForegroundBoostProcesses.
https://gitlab.winehq.org/wine/wine/-/merge_requests/7607
This fixes failure to play the prologue video in Planet of the Apes: Last Frontier, which unpauses by calling Start() with a location. The exact state leading to this issue does not occur in the Start() tests, and it's not clear how to reproduce it reliably.
--
v2: mf: Reset transform nodes when seeking.
mf: Initialise the grabber sample count when setting state after a seek.
mf: Reset transform node outputs when seeking.
mf: Drop transform node input events when unpausing at a specific position.
https://gitlab.winehq.org/wine/wine/-/merge_requests/7466
The methods are needed to implement Bluetooth device pairing in `bluetoothapis.dll` without having to create a dummy window for `RegisterDeviceNotification`, as that may break CLI applications.
`CM_Register_Notification` is implemented as a thin wrapper over `I_ScRegisterDeviceNotification`, mapping `DBT_*` flags to their associated `CM_NOTIFY_*` constants.
--
v3: user32: Remove incorrect FIXME warning while registering for DBT_DEVTYP_HANDLE notifications.
cfgmgr32: Implement CM_Register_Notification and CM_Unregister_Notification.
dinput/tests: Add tests for CM_Register_Notification.
cfgmgr32/tests: Add basic tests for CM_(Un)Register_Notification.
https://gitlab.winehq.org/wine/wine/-/merge_requests/7559
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=54194
If the SendMessageTimeout call takes a long time, we can get other
messages which also set the observed wparam value. Apparently,
this is especially likely on Windows 7.
This also removes the (wParam == 0xbaadbeef) check which may have
been intended to serve the same goal but doesn't work because the
observed wParam value is still assigned.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3862
Signed-off-by: Kun Yang <yangkun(a)uniontech.com>
Change-Id: Ia68e11ccb0aa563eeb73a2f5cb93afcd328e1937
[fgetws_test.7z](/uploads/7b706f2c4f639e4260c548d834658b32/fgetws_test.7z)
If the application calls setvbuf(.., _IONBF, ..) before fgetws, wine sets the flag. In fgetws, this flag is not checked. read_i is called with paramenter count 1 which is not allowed in read_i implemantion. Function read_i returns -1 and the file stream is not actually read by program. The file pointer is not moved. If the application writes fgetws in a loop, it never reach EOF and falls in dead loop. By adding check for _IONBF in _filbuf, the application will run into another branch(file->_bufsiz=2). Thats's correct. Please checkout the example in my attachment. This application exits normally in Windows but falls in dead loop in wine.
--
v3: msvcrt: Add MSVCRT__NOBUF flag check in _filbuf to avoid dead loop in application which sets the flag.
https://gitlab.winehq.org/wine/wine/-/merge_requests/7594
On Tue Mar 11 14:30:34 2025 +0000, Paul Gofman wrote:
> I don't see how to avoid that in principle?
> - the logic is triggered by calling DefWindowProc, so we can't avoid
> some action from DefWindowProc;
> - after WM_POINTERUPDATE with changing coordinates the messages should
> be generated (and, separately, updating cursor position) regardless of
> DefWindowProc calls; also generating that in DefWindowProc or
> accept_hardware_message would be clumsy because
> NtUserSendHardwareInput() can't generate the exact message we need, that
> would need some custom interface (and won't avoid a server call to send
> message anyway);
> - we could in principle stop sending those `track_mouse_from_pointer`
> calls once the tracking switched to server side (by returning the
> corresponding flag from this call and tracking this part of state in
> thread data), but we also want to update driver cursor position which
> seems to cope nicely with this call, in that case it would need to be
> done in some other more complicated ways. So reducing the amount of
> those calls (by not sending them once server tracking started) is
> possible but it will require these parts. I thought it doesn't add too
> much of calls, do you think it worth it?
> EDIT: updated.
I don't know, this call feels inherently racy and I would like to give it more thought and time to check how windows behave.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7530#note_98225
This serie (PDB rewrite #3) mostly handles the debug information
needed to support C++ enum underlying integral type.
- it generalizes the use of VARIANT to gather enum values,
- to make things simple, in PDB, the type of variant used has nothing
to do with the size of the C++ integral type, but is the smallest
size to hold the considered enum value,
- adapt the dwarf backend to behave the same way as the PDB one,
- adapt debugger to support up to 8-bytes variant types.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7605
PathRemoveFileSpecW keeps only the drive if the path contains all forward slashes as shown in tests.
But then the temporary file is created in the root folder which fails for drive Z:.
This fixes a corner case when using CMake in Wine. Another usage of PathRemoveFileSpecW is in PathRelativePathToW which should be also checked.
I'm leaving this as a draft until getting some feedback and adding tests.
--
v5: kernelbase: Handle correctly paths with forward slashes in ReplaceFileW.
kernel32: Test ReplaceFileW with forward slashes.
https://gitlab.winehq.org/wine/wine/-/merge_requests/7290
In CopyFileEx, and DeleteFile functions, by default, the file name
and path are limited to MAX_PATH characters. To extend this limit
to 32,767 wide characters, need prepend "\\\\?\\" to the path.
--
v2: kernelbase: Limit the maximum path length for DeleteFile.
kernelbase: Fix DeleteFileA doesn't support long path.
kernelbase: Limit the maximum path length for filesystem.
kernel32/tests: Add tests for maximum path length limitation.
https://gitlab.winehq.org/wine/wine/-/merge_requests/7540
x86_64 Windows and macOS both use `%gs` to access thread-specific data (Windows TEB, macOS TSD). To date, Wine has worked around this conflict by filling the most important TEB fields (`0x30`/`Self`, `0x58`/`ThreadLocalStorage`) in the macOS TSD structure (Apple reserved the fields for our use). This was sufficient for most Windows apps.
CrossOver's Wine had an additional hack to handle `0x60`/`ProcessEnvironmentBlock`, and binary patches for certain CEF binaries which directly accessed `0x8`/`StackBase`. Additionally, Apple's libd3dshared could activate a special mode in Rosetta 2 where code executing in certain regions would use the Windows TEB when accessing `%gs`.
Now that the PE separation is complete, GSBASE can be swapped when entering/exiting PE code. This is done in the syscall dispatcher, unix-call dispatcher, and for user-mode callbacks. GSBASE also needs to be set to the macOS TSD when entering signal handlers (in `init_handler()`), and then restored to the Windows TEB when exiting (in `leave_handler()`). There is a special-case needed in `usr1_handler`: when inside a syscall (on the kernel stack), GSBASE may need to be reset to either the TEB or the TSD. The only way to tell is to determine what GSBASE was set to on entry to the signal handler.
---
macOS does not have a public API for setting GSBASE, but the private `_thread_set_tsd_base()` works and was added in macOS 10.12.
`_thread_set_tsd_base()` is a small thunk that sets `%esi`, `%eax`, and does the `syscall`: https://github.com/apple-oss-distributions/xnu/blob/8d741a5de7ff4191bf97d57….
The syscall instruction itself clobbers `%rcx` and `%r11`.
I've tried to save as few registers as possible when calling `_thread_set_tsd_base()`, but there may be room for improvement there.
---
I've tested this successfully on macOS 15 (Apple Silicon and Intel) with several apps and games, including the `cefclient.exe` CEF sample.
I still need to test this patch on macOS 10.13, and I'd also like to do some performance testing.
---
I also tested an alternate implementation strategy for this which took advantage of the expanded "full" thread state which is passed to signal handlers when a process has set a user LDT. The full thread state includes GSBASE, so GSBASE is set back to whatever is in the sigcontext on return (like every other field in the context). This would avoid needing to explicitly reset GSBASE in `leave_handler()`, and avoid the special-case in `usr1_handler()`.
This strategy was simpler, but I'm not using it for 2 reasons:
- the "full" thread state is only available starting with macOS 10.15, and we still support 10.13.
- more crucially, Rosetta 2 doesn't seem to correctly implement the GS.base field of the full thread state. It's set to 0 on entry, and isn't read on exit.
--
v3: ntdll: Remove x86_64 Mac-specific TEB access workarounds that are no longer needed.
ntdll: On macOS x86_64, swap GSBASE between the TEB and macOS TSD when entering/leaving PE code.
ntdll: Ensure init_handler runs in signal handlers before any compiler-generated memset calls.
ntdll: Remove ugly fallback method for getting a thread's GSBASE on macOS.
ntdll: Leave kernel stack before accessing %gs in x86_64 syscall dispatcher.
ntdll: Do %gs accesses before switching to kernel stack in x86_64 syscall dispatcher.
https://gitlab.winehq.org/wine/wine/-/merge_requests/6866
On Mon Mar 17 04:39:02 2025 +0000, Alex Henrie wrote:
> Now that simulated hardware interrupts for audio processing have been
> implemented in commit ff0fbb1ff5f76d1d206aea452907ad2dd29206ea,
> simulated real mode interrupts are the only thing left that's keeping
> 16-bit Myst from running. When I wrote this patch, I tried to not
> include anything more than what Myst requires. Could you please clarify
> which parts of the patch are not strictly necessary?
You should add a separate handler just for what the app needs, instead of forcing all handlers to support real-mode pointers.
I added an example in 7e3bfd4e5e4f9ca689e1734da05a90b1b14351c9, it seems to work here but it could be extended if necessary.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/5052#note_98176
- fixes support for <mod>! syntax in source file enumeration
- reduces memory usage for types (no longer having both a vector
and a hash table as all types are now named)
- some code refactoring
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7600
--
v10: server: Handle hardlinks and casefolding when renaming the same file.
server: Handle renames to destinations containing trailing slashes.
kernel32/tests: Test renaming a file into a hardlink of itself.
kernel32/tests: Use FindClose instead of CloseHandle when closing
https://gitlab.winehq.org/wine/wine/-/merge_requests/6855
--
v2: comctl32: Implement IOleWindow for SysLink.
comctl32: Implement accChild for SysLink.
comctl32: Implement get_accChildCount for SysLink.
comctl32: Implement accLocation for SysLink.
comctl32: Implement get_accDefaultAction for SysLink.
comctl32: Implement acc_getName for SysLink.
comctl32: Implement get_accState for SysLink controls.
comctl32: Include only link items as IAccessible children.
https://gitlab.winehq.org/wine/wine/-/merge_requests/7402
The methods are needed to implement Bluetooth device pairing in `bluetoothapis.dll` without having to create a dummy window for `RegisterDeviceNotification`, as that may break CLI applications.
`CM_Register_Notification` is implemented as a thin wrapper over `I_ScRegisterDeviceNotification`, mapping `DBT_*` flags to their associated `CM_NOTIFY_*` constants.
--
v2: user32: Remove incorrect FIXME warning while registering for DBT_DEVTYP_HANDLE notifications.
cfgmgr32: Implement CM_Register_Notification and CM_Unregister_Notification.
dinput/tests: Add tests for CM_Register_Notification.
cfgmgr32/tests: Add basic tests for CM_(Un)Register_Notification.
https://gitlab.winehq.org/wine/wine/-/merge_requests/7559
The methods are needed to implement Bluetooth device pairing in `bluetoothapis.dll` without having to create a dummy window for `RegisterDeviceNotification`, as that may break CLI applications.
`CM_Register_Notification` is implemented as a thin wrapper over `I_ScRegisterDeviceNotification`, mapping `DBT_*` flags to their associated `CM_NOTIFY_*` constants.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7559
On Mon Mar 17 04:39:03 2025 +0000, Alexandre Julliard wrote:
> Please let's not reintroduce support for vm86 contexts and pointers.
> If necessary, you can add a separate real-mode handler for that specific
> call. But I'd suggest to first make sure that the app works without any
> actual vm86 support.
Now that simulated hardware interrupts for audio processing have been implemented in commit ff0fbb1ff5f76d1d206aea452907ad2dd29206ea, simulated real mode interrupts are the only thing left that's keeping 16-bit Myst from running. When I wrote this patch, I tried to not include anything more than what Myst requires. Could you please clarify which parts of the patch are not strictly necessary?
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/5052#note_98044
Signed-off-by: Kun Yang <yangkun(a)uniontech.com>
Change-Id: Ia68e11ccb0aa563eeb73a2f5cb93afcd328e1937
[fgetws_test.7z](/uploads/7b706f2c4f639e4260c548d834658b32/fgetws_test.7z)
If the application calls setvbuf(.., _IONBF, ..) before fgetws, wine sets the flag. In fgetws, this flag is not checked. read_i is called with paramenter count 1 which is not allowed in read_i implemantion. Function read_i returns -1 and the file stream is not actually read by program. The file pointer is not moved. If the application writes fgetws in a loop, it never reach EOF and falls in dead loop. By adding check for _IONBF in _filbuf, the application will run into another branch(file->_bufsiz=2). Thats's correct. Please checkout the example in my attachment. This application exits normally in Windows but falls in dead loop in wine.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7594
With this PR, the GdipFlattenPath and GdiAddPath*Curve are drawing the same way as the native gdiplus
--
v3: gdiplus: Fix GdipFlattenPath return path precision
gdiplus/test: Add GdipFlattenPath tests with default flatness 0.25
https://gitlab.winehq.org/wine/wine/-/merge_requests/7584
--
v9: server: Handle hardlinks and casefolding when renaming the same file.
server: Handle renames to destinations containing trailing slashes.
kernel32/tests: Test renaming a file into a hardlink of itself.
kernel32/tests: Use FindClose instead of CloseHandle when closing
https://gitlab.winehq.org/wine/wine/-/merge_requests/6855
As shown by the testbot, doubling is not always sufficient.
--
v2: iphlpapi/tests: Call GetExtendedTcp/UdpTable() in a loop.
iphlpapi/tests: Call GetAdaptersAddresses() in a loop.
https://gitlab.winehq.org/wine/wine/-/merge_requests/3833