Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
2542 commits
Select commit Hold shift + click to select a range
d71b25d
ntdll: Check arm64ec TEB frames are valid before popping them.
bylaws Mar 27, 2025
0ba72b3
ntdll/tests: Add THREAD_CREATE_FLAGS_BYPASS_PROCESS_FREEZE test.
bylaws Aug 11, 2025
eb257d2
ntdll: Support THREAD_CREATE_FLAGS_BYPASS_PROCESS_FREEZE flag.
bylaws Aug 11, 2025
d3ecdc1
winternl: Add additional thread create flags.
bylaws Aug 12, 2025
1484476
HACK: Use x86 mono on aarch64.
bylaws Apr 19, 2024
843681d
include: Add arm64 SVE xstate headers.
bylaws Aug 19, 2024
6f30f79
FEX specific AVX support for arm64ec
bylaws Aug 21, 2024
fb77321
ntdll: Setup the FEX SVE predicate reg after handling signals.
bylaws Aug 21, 2024
f538c3c
makedep: Install ARM64EC-only DLLs to the aarch64 PE dir.
bylaws Aug 20, 2024
88bd3ef
wine.inf: Add proton registry overrides for arm64 installs.
bylaws Sep 2, 2024
7c6ddda
Use FEX wow64/ARM64EC dll names
bylaws Apr 17, 2024
ab2f642
services: Pass through FEX config environment variables.
bylaws Jul 28, 2025
06d06a5
ntdll: Add an interface to map the FEX stats shm.
bylaws Jan 23, 2025
e8aee86
winevulkan: Make the unix creation callback pointers always 64-bit.
bylaws Sep 2, 2024
c54a2c5
ntdll: Support THREAD_CREATE_FLAGS_SKIP_THREAD_ATTACH flag.
bylaws Aug 11, 2025
bc75560
ntdll: Support THREAD_CREATE_FLAGS_SKIP_LOADER_INIT flag.
bylaws Aug 11, 2025
5726e5f
configure: Enable vcruntime140_1 and dpnsvcr for arm64x builds.
bylaws Apr 23, 2024
9c9746b
ntdll: Add a default pBaseThreadInitThunk implementation.
bylaws Aug 11, 2025
eceefff
ntdll: Implement WOW64 thread suspension helpers.
bylaws Jul 27, 2023
0d76af7
wow64: Support running a BT module provided suspend routine.
bylaws Jul 27, 2023
4c70c04
HACK: ntdll: Manually define exit thunks for mem{cpy/move/set}
cjacek Jul 10, 2025
49d2b4a
ntdll: Load x86_64 builtin DLLs from the aarch64 PE dir.
bylaws Aug 20, 2024
853e7ef
HACK: Avoid delay importing rpcrt4
bylaws Jul 15, 2025
d30d78e
HACK: wineboot: Always apply FEX's scaling to the reported ARM64 TSC
bylaws Jul 18, 2025
ffd3152
wow64: Write NtProtectVirtualMemory old_prot from within the thunk.
bylaws Jul 22, 2025
82c01fe
ntdll: Add FEX specific Asahi TSO support
bylaws Jul 10, 2025
8354f0f
ntdll: Implement FEX-specific kernel-side unaligned atomic handling.
bylaws Aug 6, 2025
07723ff
WIP: ntdll: ARM64EC suspend support
bylaws Aug 7, 2025
d9cd17e
ntdll: Support cross-process wow64 suspend on ARM64.
bylaws Aug 11, 2025
35c8092
server: Ensure allocated space for mappings is in accessible memory.
bylaws Apr 12, 2024
9e28ae4
Revert "kernelbase: HACK Force Angle Vulkan instead of GL for EpicOnl…
Nov 12, 2025
ee080c5
Revert "kernelbase: HACK: Force CEF swiftshader for EpicOnlineService…
Nov 12, 2025
b183f91
fixup! winex11.drv: Ignore fullscreen window config changes.
zzhiyi Oct 29, 2025
5d67e25
fixup! fixup! winex11.drv: Ignore fullscreen window config changes.
zzhiyi Nov 14, 2025
b10aaab
ntoskrnl.exe: Open thread with MAXIMUM_ALLOWED access in KeGetCurrent…
Nov 17, 2025
041d314
server: esync, fsync: Create server events as esync / fsync.
Nov 17, 2025
37b71dd
ntdll: HACK: Avoid unitialized Dr0-Dr3 in RtlRaiseException on x64.
Nov 17, 2025
2592799
ntdll: Map Windows syscall numbers for Skull & Bones.
Nov 18, 2025
eb8b85a
qasf: Implement seeking for asf reader.
ziqingh Sep 24, 2025
cba7056
qasf: Add asf_reader_stop_stream helper.
ziqingh Oct 10, 2025
20a1839
qasf: Add asf_reader_start_stream helper.
ziqingh Oct 10, 2025
5b17bcb
dwrite/fallback: Add the Bamum Supplement range to the fallback data.
nsivov Nov 14, 2025
c023eef
dwrite/fallback: Add the Cyrillic range to the fallback data.
besentv Nov 14, 2025
0a1d0d2
drwite/fallback: Add the Supplemental Arrows-C range to the fallback …
besentv Nov 14, 2025
ee8a289
win32u: Explicitly check for font family bits.
besentv Nov 20, 2025
68a334c
ntdll: Map Windows syscall numbers for Far Cry 4.
Nov 20, 2025
b314de0
ntdll: Add some specifics for NtQueryInformationProcess( ProcessDebug…
Apr 15, 2025
f5595d0
kernelbase: Add stub for GetIntegratedDisplaySize().
Nov 21, 2025
1925fb6
quartz/dsoundrender: Get rid of DSoundRenderer_Max_Fill buffer data q…
Nov 12, 2025
821d6ce
quartz/test: Check for EC_COMPLETE more often in test_eos().
Nov 12, 2025
152c8c5
quartz/dsoundrender: Send all queued samples to dsound before issuing…
Nov 12, 2025
b2d8cca
quartz/dsoundrender: Do not send EC_COMPLETE while flushing.
Nov 12, 2025
8e90faa
Revert "ntdll: Use NtAlertMultipleThreadByThreadId() in RtlWakeAddres…
Nov 22, 2025
4eece26
Revert "ntdll: Implement NtAlertMultipleThreadByThreadId()."
Nov 22, 2025
d826f3a
wow64win: Change parameter types from LONG to ULONG in wow64_NtUserMe…
jin-king1 Mar 4, 2025
eda95ff
ntdll: Allow mem{cpy,move} optimisation now -fno-builtins is used.
bylaws Feb 7, 2025
692c1b2
ntdll: Rename waiting_thread_count to structure_lock_count in barrier…
Nov 22, 2025
dd06445
ntdll/tests: Add tests for iterative barrier usage.
Nov 22, 2025
4595526
ntdll: Support iterative barrier usage without re-initialization.
Nov 22, 2025
b3d835f
msvfw32: HACK: Don't pass down errors when setting MCI hwnd.
besentv Nov 25, 2025
0510871
win32u: Initialize surface with white colour on creation.
Nov 19, 2025
77f4381
kernelbase: Use ProcessImageFileNameWin32 in GetModuleFileNameExW.
cjacek Mar 15, 2025
fed6b4f
kernelbase: Set last error in GetModuleFileNameExW().
Nov 26, 2025
48610be
iphlpapi: Implement GetOwnerModuleFromTcpEntry().
Nov 26, 2025
8c7e6d0
iphlpapi: Implement GetOwnerModuleFromTcp6Entry().
Nov 26, 2025
d6ae55a
kernelbase: Factor out get_process_image_file_name.
cjacek Mar 15, 2025
defa428
win32u: Disable undecorated windows hack for Mystery Manor: Hidden Ob…
Nov 26, 2025
f20ca49
win32u: HACK: Workaround window ordering on Gamescope for Crystal of …
Nov 27, 2025
caadfe1
msvfw32/tests: Add tests for MCI window styles.
Nov 27, 2025
dffa982
msvfw32: Add WS_CHILD attribute for window if parent is specified.
Nov 27, 2025
d9fdef1
msvfw32: Set correct styles for popup and child windows.
Nov 27, 2025
2ebe604
msvfw32: Set child window id for MCI child window.
Nov 27, 2025
5df9b74
widl: Keep track of statements source locations.
rbernon Aug 25, 2025
6a7f27e
widl: Allow explicit registration by referencing runtimeclasses.
rbernon Aug 25, 2025
50e19fc
windows.perception.stub: Register runtimeclasses explicitly.
rbernon Aug 25, 2025
b2aa7ba
include: Define IHolographicCamera and related types.
Sep 2, 2025
9d833e8
windows.perception.stub/tests: Add IHolographicSpaceInterop::CreateFo…
mohamadaljaf Feb 16, 2025
a2b5f54
Revert "windows.perception.stub: HACK: Set WS_EX_NOACTIVATE for windo…
Nov 27, 2025
215f736
windows.perception.stub: Implement IHolographicSpaceInterop::CreateFo…
mohamadaljaf Nov 1, 2025
69a69c9
windows.perception.stub: HACK: Set WS_EX_NOACTIVATE for window in hol…
Mar 25, 2024
b70f531
windows.perception.stub/tests: Add IHolographicSpace::get_PrimaryAdap…
mohamadaljaf Nov 3, 2025
0d24a1c
windows.perception.stub: Implement IHolographicSpace_get_PrimaryAdapt…
mohamadaljaf Nov 3, 2025
81703e5
windows.perception.stub: Stub some functions.
mohamadaljaf Nov 3, 2025
d4fdaea
include: Add defintions related to Windows.Perception.Spatial.Spatial…
Nov 28, 2025
44103ad
windows.perception.stub: Stub SpatialAnchorExporter class.
Nov 28, 2025
226a51c
windows.perception.stub: Return semi-stub async from exporter_statics…
Nov 28, 2025
e5458b6
windows.perception.stub: Support IAsyncInfo in async access status.
Nov 28, 2025
8c621ba
wine.inf: Mark .NET and some XNA redists as already installed.
bylaws May 6, 2024
b372d5f
win32u: Don't alter memory beyond structure effective size in NtUserE…
Dec 4, 2025
b3c7b62
Revert "dwrite/fallback: Add the Cyrillic range to the fallback data."
besentv Dec 5, 2025
8042d43
Revert "drwite/fallback: Add the Supplemental Arrows-C range to the f…
besentv Dec 5, 2025
ab6d0cb
dwrite: Add the Cyrillic range to the fallback data.
besentv Nov 14, 2025
b9cbaf7
dwrite: Add the Supplemental Arrows-C range to the fallback data.
besentv Nov 14, 2025
fb395e6
dwrite: Add an alternative name for the Noto Sans Symbols font.
nsivov Nov 21, 2025
a0ffa89
Revert "msvfw32: HACK: Don't pass down errors when setting MCI hwnd."
besentv Dec 5, 2025
254cc08
msvfw32: Check if driver has a window before setting destination DGV …
besentv Dec 5, 2025
1743b73
mscoree: HACK: Search for Wine Mono without version first.
madewokherd Dec 6, 2025
dcbef01
mscoree: Update Wine Mono to 10.4.0.
madewokherd Dec 1, 2025
a582823
mscoree: HACK: Accept outdated support msi outside prefix.
madewokherd Dec 6, 2025
3c600a0
mfplat/tests: Add test for MF_XVP_PLAYBACK_MODE.
LizzyFleckenstein03 Apr 11, 2025
a554f14
winegstreamer: Allow caller to allocate samples in MF_XVP_PLAYBACK_MODE.
LizzyFleckenstein03 Apr 11, 2025
2fe145a
mfplat/tests: Don't assume video processor MFT can provide samples.
LizzyFleckenstein03 Apr 16, 2025
4260cd7
mf/tests: Rename test_source to test_stub_source.
LizzyFleckenstein03 Jun 20, 2025
1ce1e74
mf/tests: Rename test_seek_source to test_source.
LizzyFleckenstein03 Jun 20, 2025
a236218
mf/tests: Move some functions.
LizzyFleckenstein03 Jun 20, 2025
91518cd
mf/tests: Add tests for thinning.
LizzyFleckenstein03 Jun 20, 2025
21c57e1
mf: Don't forward thinning to clock.
LizzyFleckenstein03 Jun 20, 2025
b8ca2f8
mf: Handle thinning in media session.
LizzyFleckenstein03 Jun 20, 2025
2e03721
Revert "winedmo: Use the stream context to cache stream chunks."
LizzyFleckenstein03 Dec 8, 2025
faeee15
winedmo: Use the stream context to cache stream chunks.
rbernon Oct 25, 2024
ed70448
mfsrcsnk/tests: Add tests for thinning.
LizzyFleckenstein03 Jul 2, 2025
baca17c
winedmo: Fall back to dts for sample time if pts is not present.
LizzyFleckenstein03 Nov 12, 2025
650e97d
mfsrcsnk: Introduce a DEFINE_MF_ASYNC_PARAMS macro.
rbernon Dec 5, 2025
fc5f636
mfsrcsnk: Process SetRate asynchronously.
LizzyFleckenstein03 Nov 30, 2025
af073dc
mfsrcsnk: Factor out a media_source_request_stream_sample helper.
rbernon Dec 5, 2025
433d5d2
mfsrcsnk: Peek for stream token presence without removing it.
rbernon Dec 5, 2025
f8f8cf4
mfsrcsnk: Implement thinning.
LizzyFleckenstein03 May 14, 2025
27d107b
HACK: mf: Allow rate=0 for JR East Train Simulator.
LizzyFleckenstein03 Jun 9, 2025
279c7d0
kernel32: Don't use export forwarding for RtlLookupFunctionEntry.
Dec 5, 2025
ebf6af3
ntdll: Fix LdrLoadDll() parameters.
Dec 5, 2025
967e62c
ntdll: Stop walk in RtlWalkFrameChain() if there is no function entry.
Dec 5, 2025
003df1e
ntdll: Make VEH registration structure compatible.
Dec 5, 2025
6445cfd
ntdll: Generate process cookie and return it from NtQueryInformationP…
Dec 9, 2025
63714d3
ntdll: Reimplement RtlEncodePointer / RtlDecodePointer using process …
Dec 5, 2025
780b38f
gdi32: HACK: Force using Microsoft Sans Serif for Thai.
ziqingh Nov 19, 2025
edcf00c
mf: Prevent the session from starting invalid topologies.
besentv Dec 9, 2025
f15b760
winex11.drv: Update the gl_drawable of the top-level window when the …
zzhiyi Nov 13, 2025
418eb91
kernel32/tests: Disable heap tests which are now crashing on Windows.
Dec 10, 2025
def4b96
kernel32/tests: Add more tests for heap total and commit sizes.
Dec 10, 2025
c5f2587
ntdll: Align commit size in RtlCreateHeap().
Dec 10, 2025
f090ac3
ntdll: Compute total size as aligned commit size in RtlCreateHeap().
Dec 10, 2025
4786ba9
HACK: winedmo: Assume that AV1 decoder is available.
rbernon Dec 11, 2025
1d6691c
winedmo: Always use upper case AV1 fourcc in media types.
rbernon Dec 11, 2025
bae282a
mf: Change SESSION_FLAG_RESTARTING to 0x40.
LizzyFleckenstein03 Dec 10, 2025
2993a15
mf: Fix crash when stream is null during sample request.
Dec 9, 2025
9866d0f
winedmo: Explicily set HEVC mf GUID.
besentv Dec 11, 2025
8aea1a4
fixup! fsync: Add WINE_FSYNC_YIELD_TO_WAITERS option.
Dec 12, 2025
21adfc2
ntdll: HACK: Enable WINE_FSYNC_YIELD_TO_WAITERS for From Dust.
Dec 12, 2025
9a26b8c
wbemprox: Add Win32_SystemEnclosure.SerialNumber.
Dec 12, 2025
c83c4b7
wbemprox: Mark Win32_SystemEnclosure.Tag as key column.
Dec 12, 2025
7c04244
ntdll: HACK: Enable WINE_SIMULATE_WRITECOPY for DCS World.
Dec 12, 2025
2b6975d
HACK: winedmo: Ignore missing PNG decoders.
rbernon Dec 12, 2025
08868a2
mfsrcsnk: Check and set current stream position before reading.
rbernon Dec 12, 2025
87e9a9a
mfplat: HACK: Enable the 2d buffer lock optimisation for Darksiders W…
Dec 12, 2025
f4d8697
winegstreamer: HACK: Implement video right edge replication for Disin…
Dec 18, 2025
3cd5fd2
kernelbase: Workaround a call with misaligned stack in OpenMutexW().
Dec 20, 2025
a21b86f
mscoree: Update Wine Mono to 10.4.1.
madewokherd Dec 23, 2025
dbb32ff
mfsrcsnk: Use stream_map for index value on stream start.
Dec 12, 2025
91edb29
qasf: Set the DedicatedDeliveryThread property earlier.
Jan 9, 2026
949618b
mf: Discard end of presentation on IMFMediaSession_Stop.
rbernon Jan 12, 2026
6414bff
mfsrcsnk: Remain in running state on EOP.
Dec 12, 2025
b73f72e
mmdevapi: HACK: Change audio device name scheme.
besentv Jan 16, 2026
29c2187
atiadlxx: Add ADL_Display_MVPUStatus_Get().
Jan 16, 2026
e5597c5
atiadlxx: Add stub for ADL_Display_ODClockInfo_Get().
Jan 17, 2026
6f89fa8
winex11: Prevent XGenericEvents from leaking memory while Steam overl…
yepokay Jan 17, 2026
83ca0f5
HACK: winex11: Don't rely on _NET_ACTIVE_WINDOW for tracking focus un…
navi-desu Jan 19, 2026
c026f1b
windows.media.speech: Add a trace for capture device's name.
besentv Jan 20, 2026
864fb7e
HACK: dinput: Don't center left/right trigger axes when steam overlay…
Conmanx360 Jan 19, 2026
c623ed6
winex11.drv: Restore windows after minimize on Gamescope.
Jan 8, 2026
a4f5be9
kernelbase: Remove an unused NtQueryInformationFile() from MoveFileWi…
Jul 31, 2025
528d965
Revert "ntdll: Implement opening files through nt device paths."
Jan 26, 2026
3836b5b
ntdll: Handle FileNetworkOpenInformation directly in fill_file_info().
julliard Jun 12, 2025
5660e8f
ntdll: Add a lock around the get_dir_case_sensitivity_attr() fs_cache.
mrpippy Mar 13, 2025
8031fab
ntdll: Use *at() functions in get_dir_case_sensitivity().
mrpippy Mar 13, 2025
673e391
ntdll: Stop using chdir() in nt_to_unix_file_name().
mrpippy Mar 12, 2025
0bbeec0
ntdll: Add a helper function to open the main image as .so file.
julliard Apr 7, 2025
21e45e0
ntdll: Add a helper to return both NT and Unix names to open a file.
julliard Jun 18, 2025
ca9b0ac
ntdll: Use NtOpenFile to open nls files in the system directory.
julliard Jun 16, 2025
b591d55
get_nt_and_unix_names() EAC fix
Jan 26, 2026
ba4b254
ntdll: Remove trailing backslashes from NT names.
julliard Jul 19, 2025
43adc11
ntdll/tests: Add comprehensive reparse point tests.
Jul 4, 2025
ce6025d
kernel32/tests: Test CreateSymbolicLink().
Jul 5, 2025
c2f2168
kernel32/tests: Test opening a directory with ReOpenFile().
Jul 3, 2025
5ffcbe9
kernelbase: Use FILE_NON_DIRECTORY_FILE in ReOpenFile().
Jul 3, 2025
0dd04b6
ntdll/tests: Add more reparse point tests.
Oct 17, 2025
6ff1f06
ntdll/tests: Test NtQueryAttributesFile() with a root directory.
Oct 21, 2025
e99a87e
ntdll/tests: Fix reparse test failures.
Nov 1, 2025
0478fb0
server: Implement FSCTL_SET_REPARSE_POINT.
Oct 17, 2025
c1ee258
server: Implement FSCTL_DELETE_REPARSE_POINT.
Oct 17, 2025
efbdd8d
server: Implement FSCTL_GET_REPARSE_POINT.
Oct 17, 2025
5666a99
ntdll: Pass attr and nt_name down to lookup_unix_name().
Oct 16, 2025
a631a09
include: Add a couple of reparse point definitions.
julliard Oct 30, 2025
635c9f5
ntdll: Resolve IO_REPARSE_TAG_MOUNT_POINT during path lookup.
Oct 17, 2025
5041c01
ntdll: Implement FILE_OPEN_REPARSE_POINT.
Oct 17, 2025
14a18fa
ntdll: Handle reparse points in NtQueryDirectoryFile().
Oct 17, 2025
2ca24df
ntdll: Return FILE_ATTRIBUTE_REPARSE_POINT from get_file_info().
Oct 17, 2025
56671ea
ntdll: Use ObjectNameInformation to retrieve file name for FileNameIn…
julliard Jun 12, 2025
4660d25
ntdll: Fill FILE_ATTRIBUTE_REPARSE_POINT and the reparse tag in fd_ge…
Oct 17, 2025
d76d615
kernelbase: Translate FILE_FLAG_OPEN_REPARSE_POINT.
compholio Jul 7, 2025
e1babff
kernelbase: Open the reparse point in CreateDirectory().
Jul 7, 2025
af8f292
kernelbase: Use the InitializeObjectAttributes macro in more places.
julliard Mar 28, 2025
e7eb8db
kernelbase: Open the reparse point in DeleteFile().
compholio Jul 7, 2025
7e6fe5e
kernelbase: Open the reparse point in RemoveDirectory().
compholio Jul 7, 2025
87e24bd
ntdll: Resolve IO_REPARSE_TAG_SYMLINK during path lookup.
Oct 20, 2025
94dd6b1
server: Retain the ? suffix when renaming or linking reparse points.
Nov 1, 2025
00bd503
kernelbase: Open the reparse point in MoveFileWithProgress().
compholio Jul 7, 2025
e98235b
kernelbase: Open the reparse point in CreateHardLink().
Jul 7, 2025
68e7ee3
kernelbase: Open the reparse point in SetFileAttributes().
Jul 7, 2025
bc5c87a
ntdll: Handle . and .. segments in relative symlinks.
Oct 21, 2025
1d885cf
ntdll: Implement FileIdExtdBothDirectoryInformation.
Jul 7, 2025
a3e6a6b
kernelbase: Report the reparse tag from FindNextFile().
Jul 7, 2025
92a3024
include: Fix RTL_PATH_TYPE names.
marzent Mar 10, 2025
07fcf32
kernelbase: Implement CreateSymbolicLink().
compholio Mar 13, 2019
5df00ac
kernel32: Implement SetVolumeMountPoint().
Nov 18, 2025
701708d
mountmgr.sys: Report FILE_SUPPORTS_REPARSE_POINTS for volumes we repo…
Oct 21, 2025
134657d
cmd: Print reparse points in directory listings.
Nov 25, 2025
701a352
cmd: Implement mklink /j.
Nov 25, 2025
9d94650
ntdll: Implement opening files through nt device paths.
mmueller2012 Nov 30, 2021
de67270
amend! winex11.drv: Restore windows after minimize on Gamescope.
Jan 27, 2026
06d10b7
fixup! HACK: steam: ntdll: Setup steamclient trampolines to lsteamcli…
bylaws Jan 2, 2026
a0ad972
fixup! ntdll: Support cross-process wow64 suspend on ARM64.
bylaws Jan 2, 2026
6375faf
HACK: ntdll: Spin up a thread to handle CreateThread APCs on ARM64 WOW
bylaws Jan 5, 2026
3afd997
wow64: Always suspend GetContextThread target when under emulation.
bylaws Jan 5, 2026
03d40ac
winevulkan: Disable h265 extensions.
DadSchoorse Aug 21, 2025
cf62265
winevulkan: Update to VK spec version 1.4.325.
DadSchoorse Aug 21, 2025
f054b58
winevulkan: Update to VK spec version 1.4.329.
DadSchoorse Oct 10, 2025
4a8ab09
winevulkan: Update to VK spec version 1.4.333.
DadSchoorse Nov 14, 2025
ad38693
winevulkan: Update to VK spec version 1.4.335.
DadSchoorse Dec 2, 2025
5c0b702
winevulkan: Update to VK spec version 1.4.339.
DadSchoorse Jan 23, 2026
419f3aa
winevulkan: Update vk.xml / video.xml to version to version 1.4.339.
ivyl Jan 29, 2026
8b96bff
winevulkan: Update to VK spec version 1.4.340.
DadSchoorse Jan 23, 2026
6983ffa
winevulkan: Update vk.xml to version to version 1.4.340.
ivyl Jan 29, 2026
58fbbf6
winevulkan: Get rid of debug handles unwraps in struct chains.
rbernon Jan 23, 2026
523bc2c
fixup! ntdll: Only load EAC bridge when Linux library is present.
Feb 3, 2026
e7811a5
fixup! HACK: winebus.sys: Fall back to non-hidraw devices.
ivyl Jan 26, 2026
1d3dc82
ntdll: When overriding dlls, update len.
Feb 5, 2026
986bda1
HACK: mfmediaengine: Don't seek if the time delta is too small.
ziqingh Jan 19, 2026
c5a2730
kernelbase: HACK: Start EAC launcher in its executable directory.
Feb 16, 2026
73e14cc
ntdll: Get current timezone bias from user shared data.
Feb 18, 2026
2fa2ad6
server: Avoid relying on tm->tm_isdst in set_user_shared_data_time().
Feb 18, 2026
3c620bd
ntdll: Fix get_timezone_info() for timezones defined with inverse DST…
Feb 18, 2026
8c1b5e4
ntdll: Factor out read_reg_tz_info().
Feb 17, 2026
81ba370
ntdll: Try to determine system time zone to Windows zone by name.
Feb 17, 2026
021352a
ntdll: Drop additional TZ matching with match_tz_name().
Feb 18, 2026
08a7a56
ntdll: Better search for DST change in find_dst_change().
Feb 18, 2026
b49a746
ntdll: Accept 30min shift in match_tz_date().
Feb 18, 2026
6d1d162
fixup! ntdll: Fix get_timezone_info() for timezones defined with inve…
Feb 19, 2026
93292ec
fixup! server: Avoid relying on tm->tm_isdst in set_user_shared_data_…
Feb 19, 2026
81df0db
mf/tests: Stop checking samples at the end of the expected array.
Aug 22, 2025
8a514eb
mf/tests: Change todo to flaky for the H.264 decoder ouput type chang…
Aug 22, 2025
7542e94
mfplat/tests: Test NV12 negative stride in MFCreateMediaBufferFromMed…
Aug 27, 2025
662cc61
mf/tests: Test sample copier 2D buffers.
Aug 27, 2025
f7f3805
mf/tests: Test H.264 decoder 2D buffers.
Aug 27, 2025
2b34fb6
mf/tests: Test WMV decoder 2D buffers.
Aug 27, 2025
a2a90b2
mf/tests: Test color convert 2D buffers.
Aug 27, 2025
6cd6af2
winegstreamer: Support 2D sample buffer.
Aug 22, 2025
a94bff2
mfplat/buffer: HACK: Remove the 2D buffer performance hack.
Feb 20, 2026
574157b
winegstreamer: Free the stream objects during reader destruction.
Feb 10, 2026
5607c3b
winegstreamer: Use a single call to free the streams array (ASan).
bernhardu Feb 13, 2026
63d1363
sharedgpures: fix dispatch_close decrementing ref_count for handles t…
avafloww Feb 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions MAINTAINERS
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,7 @@ F: dlls/jscript/
Joystick input
M: Rémi Bernon <rbernon@codeweavers.com>
F: dlls/dinput*/
F: dlls/gameinput/
F: dlls/joy.cpl/
F: dlls/windows.gaming.input/
F: dlls/winebus.sys/
Expand Down
196 changes: 196 additions & 0 deletions README.esync
Original file line number Diff line number Diff line change
@@ -0,0 +1,196 @@
This is eventfd-based synchronization, or 'esync' for short. Turn it on with
WINEESYNC=1; debug it with +esync.

== BUGS AND LIMITATIONS ==

Please let me know if you find any bugs. If you can, also attach a log with
+seh,+pid,+esync,+server,+timestamp.

If you get something like "eventfd: Too many open files" and then things start
crashing, you've probably run out of file descriptors. esync creates one
eventfd descriptor for each synchronization object, and some games may use a
large number of these. Linux by default limits a process to 4096 file
descriptors, which probably was reasonable back in the nineties but isn't
really anymore. (Fortunately Debian and derivatives [Ubuntu, Mint] already
have a reasonable limit.) To raise the limit you'll want to edit
/etc/security/limits.conf and add a line like

* hard nofile 1048576

then restart your session.

On distributions using systemd, the settings in `/etc/security/limits.conf`
will be overridden by systemd's own settings. If you run `ulimit -Hn` and it
returns a lower number than the one you've previously set, then you can set

DefaultLimitNOFILE=1024:1048576

in both `/etc/systemd/system.conf` and `/etc/systemd/user.conf`. You can then
execute `sudo systemctl daemon-reexec` and restart your session. Check again
with `ulimit -Hn` that the limit is correct.

Also note that if the wineserver has esync active, all clients also must, and
vice versa. Otherwise things will probably crash quite badly.

== EXPLANATION ==

The aim is to execute all synchronization operations in "user-space", that is,
without going through wineserver. We do this using Linux's eventfd
facility. The main impetus to using eventfd is so that we can poll multiple
objects at once; in particular we can't do this with futexes, or pthread
semaphores, or the like. The only way I know of to wait on any of multiple
objects is to use select/poll/epoll to wait on multiple fds, and eventfd gives
us those fds in a quite usable way.

Whenever a semaphore, event, or mutex is created, we have the server, instead
of creating a traditional server-side event/semaphore/mutex, instead create an
'esync' primitive. These live in esync.c and are very slim objects; in fact,
they don't even know what type of primitive they are. The server is involved
at all because we still need a way of creating named objects, passing handles
to another process, etc.

The server creates an eventfd file descriptor with the requested parameters
and passes it back to ntdll. ntdll creates an object of the appropriate type,
then caches it in a table. This table is copied almost wholesale from the fd
cache code in server.c.

Specific operations follow quite straightforwardly from eventfd:

* To release an object, or set an event, we simply write() to it.
* An object is signalled if read() succeeds on it. Notably, we create all
eventfd descriptors with O_NONBLOCK, so that we can atomically check if an
object is signalled and grab it if it is. This also lets us reset events.
* For objects whose state should not be reset upon waiting—e.g. manual-reset
events—we simply check for the POLLIN flag instead of reading.
* Semaphores are handled by the EFD_SEMAPHORE flag. This matches up quite well
(although with some difficulties; see below).
* Mutexes store their owner thread locally. This isn't reliable information if
a different process's thread owns the mutex, but this doesn't matter—a
thread should only care whether it owns the mutex, so it knows whether to
try waiting on it or simply to increase the recursion count.

The interesting part about esync is that (almost) all waits happen in ntdll,
including those on server-bound objects. The idea here is that on the server
side, for any waitable object, we create an eventfd file descriptor (not an
esync primitive), and then pass it to ntdll if the program tries to wait on
it. These are cached too, so only the first wait will require a round trip to
the server. Then the server signals the file descriptor as appropriate, and
thereby wakes up the client. So far this is implemented for processes,
threads, message queues (difficult; see below), and device managers (necessary
for drivers to work). All of these are necessarily server-bound, so we
wouldn't really gain anything by signalling on the client side instead. Of
course, except possibly for message queues, it's not likely that any program
(cutting-edge D3D game or not) is going to be causing a great wineserver load
by waiting on any of these objects; the motivation was rather to provide a way
to wait on ntdll-bound and server-bound objects at the same time.

Some cases are still passed to the server, and there's probably no reason not
to keep them that way. Those that I noticed while testing include: async
objects, which are internal to the file APIs and never exposed to userspace,
startup_info objects, which are internal to the loader and signalled when a
process starts, and keyed events, which are exposed through an ntdll API
(although not through kernel32) but can't be mixed with other objects (you
have to use NtWaitForKeyedEvent()). Other cases include: named pipes, debug
events, sockets, and timers. It's unlikely we'll want to optimize debug events
or sockets (or any of the other, rather rare, objects), but it is possible
we'll want to optimize named pipes or timers.

There were two sort of complications when working out the above. The first one
was events. The trouble is that (1) the server actually creates some events by
itself and (2) the server sometimes manipulates events passed by the
client. Resolving the first case was easy enough, and merely entailed creating
eventfd descriptors for the events the same way as for processes and threads
(note that we don't really lose anything this way; the events include
"LowMemoryCondition" and the event that signals system processes to shut
down). For the second case I basically had to hook the server-side event
functions to redirect to esync versions if the event was actually an esync
primitive.

The second complication was message queues. The difficulty here is that X11
signals events by writing into a pipe (at least I think it's a pipe?), and so
as a result wineserver has to poll on that descriptor. In theory we could just
let wineserver do so and then signal us as appropriate, except that wineserver
only polls on the pipe when the thread is waiting for events (otherwise we'd
get e.g. keyboard input while the thread is doing something else, and spin
forever trying to wake up a thread that doesn't care). The obvious solution is
just to poll on that fd ourselves, and that's what I did—it's just that
getting the fd from wineserver was kind of ugly, and the code for waiting was
also kind of ugly basically because we have to wait on both X11's fd and the
"normal" process/thread-style wineserver fd that we use to signal sent
messages. The upshot about the whole thing was that races are basically
impossible, since a thread can only wait on its own queue.

System APCs already work, since the server will forcibly suspend a thread if
it's not already waiting, and so we just need to check for EINTR from
poll(). User APCs and alertable waits are implemented in a similar style to
message queues (well, sort of): whenever someone executes an alertable wait,
we add an additional eventfd to the list, which the server signals when an APC
arrives. If that eventfd gets signaled, we hand it off to the server to take
care of, and return STATUS_USER_APC.

Originally I kept the volatile state of semaphores and mutexes inside a
variable local to the handle, with the knowledge that this would break if
someone tried to open the handle elsewhere or duplicate it. It did, and so now
this state is stored inside shared memory. This is of the POSIX variety, is
allocated by the server (but never mapped there) and lives under the path
"/wine-esync".

There are a couple things that this infrastructure can't handle, although
surprisingly there aren't that many. In particular:
* Implementing wait-all, i.e. WaitForMultipleObjects(..., TRUE, ...), is not
exactly possible the way we'd like it to be possible. In theory that
function should wait until it knows all objects are available, then grab
them all at once atomically. The server (like the kernel) can do this
because the server is single-threaded and can't race with itself. We can't
do this in ntdll, though. The approach I've taken I've laid out in great
detail in the relevant patch, but for a quick summary we poll on each object
until it's signaled (but don't grab it), check them all again, and if
they're all signaled we try to grab them all at once in a tight loop, and if
we fail on any of them we reset the count on whatever we shouldn't have
consumed. Such a blip would necessarily be very quick.
* The whole patchset only works on Linux, where eventfd is available. However,
it should be possible to make it work on a Mac, since eventfd is just a
quicker, easier way to use pipes (i.e. instead of writing 1 to the fd you'd
write 1 byte; instead of reading a 64-bit value from the fd you'd read as
many bytes as you can carry, which is admittedly less than 2**64 but
can probably be something reasonable.) It's also possible, although I
haven't yet looked, to use some different kind of synchronization
primitives, but pipes would be easiest to tack onto this framework.
* PulseEvent() can't work the way it's supposed to work. Fortunately it's rare
and deprecated. It's also explicitly mentioned on MSDN that a thread can
miss the notification for a kernel APC, so in a sense we're not necessarily
doing anything wrong.

There are some things that are perfectly implementable but that I just haven't
done yet:
* Other synchronizable server primitives. It's unlikely we'll need any of
these, except perhaps named pipes (which would honestly be rather difficult)
and (maybe) timers.
* Access masks. We'd need to store these inside ntdll, and validate them when
someone tries to execute esync operations.

This patchset was inspired by Daniel Santos' "hybrid synchronization"
patchset. My idea was to create a framework whereby even contended waits could
be executed in userspace, eliminating a lot of the complexity that his
synchronization primitives used. I do however owe some significant gratitude
toward him for setting me on the right path.

I've tried to maximize code separation, both to make any potential rebases
easier and to ensure that esync is only active when configured. All code in
existing source files is guarded with "if (do_esync())", and generally that
condition is followed by "return esync_version_of_this_method(...);", where
the latter lives in esync.c and is declared in esync.h. I've also tried to
make the patchset very clear and readable—to write it as if I were going to
submit it upstream. (Some intermediate patches do break things, which Wine is
generally against, but I think it's for the better in this case.) I have cut
some corners, though; there is some error checking missing, or implicit
assumptions that the program is behaving correctly.

I've tried to be careful about races. There are a lot of comments whose
purpose are basically to assure me that races are impossible. In most cases we
don't have to worry about races since all of the low-level synchronization is
done by the kernel.

Anyway, yeah, this is esync. Use it if you like.

--Zebediah Figura
9 changes: 9 additions & 0 deletions autogen.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#!/bin/sh
set -e
tools/make_requests
tools/make_specfiles
dlls/winevulkan/make_vulkan -x vk.xml -X video.xml
autoreconf -ifv
rm -rf autom4te.cache

echo "Now run ./configure"
Loading