Wine Announcement

The Wine development release 8.21 is now available.

What's new in this release:
  - High-DPI scaling and initial Vulkan support in the Wayland driver.
  - Beginnings of support for ARM64EC target.
  - Updates to the locale database.
  - Various bug fixes.

The source is available at:

Binary packages for various distributions will be available from:

You will find documentation on

You can also get the current source directly from the git
repository. Check for details.

Wine is available thanks to the work of many people. See the file
AUTHORS in the distribution for the complete list.


Bugs fixed in 8.21 (total 29):

 - #9127   Multiple applications require system stream support in the MPEG-I splitter (Drome Racers, Ninki Seiyuu no Tsukukurikata)
 - #22596  PhotoScape unable to change/save files
 - #34197  RootMagic 6 error on launch (Invalid operation GDI+ (Code 1))
 - #36739  PreSonus Studio One 2.6 user interface/controls text is invisible
 - #47609  Multiple apps crash on unimplemented function msvcp140.dll.??0?$codecvt@_UDU_Mbstatet@@@std@@QEAA@_K@Z (Godhood, WechatOCR)
 - #52963  d3d10core:d3d10core & d3d11:d3d11 - test_resinfo_instruction() fails on Debian 11 + Intel GPU
 - #53287  MxManagementCenter crashes on unimplemented function msvcp140.dll.??0?$codecvt@_SDU_Mbstatet@@@std@@QEAA@_K@Z when adding a camera
 - #54554  kernel32:file & ntdll:file get unexpected count values on Windows 11
 - #54839  3DMark 2000: missing benchmark information
 - #54962  GDI+ text rendering does not handle carriage returns
 - #55058  dbghelp:dbghelp - SymRefreshModuleList() sometimes returns 0 in 64-bit Wine
 - #55165  Age of Empires II Definitive Edition quits on startup, due to WinVerifyTrust() failing on game binaries.
 - #55215  user32:text - test_DrawTextCalcRect() crashes on Windows
 - #55403  Office 2021 needs Windows.Management.Deployment.PackageManager
 - #55437  Death Stranding: "Start" and "Back" buttons are reversed
 - #55504  .NET 7 not working
 - #55640  ModOrganizer 2.5.0 beta 5+ (Qt 6.5) requires a better uisettings3::GetColorValue implementation
 - #55660  HID with more than 8 axis overwrites inputs after it
 - #55709  Flutter apps that use the local_auth package need Windows.Security.Credentials.UI.UserConsentVerifier
 - #55770  Port Royale 2: flickering in the menus and during gameplay
 - #55788  Wayland driver: GNOME: no cursor over Wine windows when 2 monitors connected
 - #55795  .NET 8 SDK Installer does not finish setup
 - #55847  SetThreadDpiHostingBehavior not implemented
 - #55886  No more audio (FreeBSD and OSS) since Wine 8.15
 - #55888  Quicken stopped working after upgrading to wine 8.20
 - #55898  WinSCP crashes with wine-8.20
 - #55909  wine does not start with free(): invalid pointer when compiling without xrandr
 - #55918  printf() can overrun the "p10s" buffer with certain values when using 24-bit precision
 - #55929  wined3d: wined3d_state_get_ffp_texture() breaks DragonAge Origins


Changes since 8.20:

Alex Henrie (9):
      user32/tests: Allocate clipboard data with HeapAlloc.
      gdi32/tests: Free what GdiConvertToDevmodeW returns with HeapFree.
      winmm/tests: Use calloc instead of HeapAlloc.
      sapi: Use CRT allocation functions.
      ntoskrnl/tests: Put test_input on the stack in the main_test function.
      d3dcompiler_43/tests: Use CRT allocation functions.
      d3dcompiler_43: Use CRT allocation functions.
      comctl32/tests: Use CRT allocation functions.
      d3d8: Allocate what Validate(Vertex|Pixel)Shader return with HeapAlloc.

Alexandre Julliard (72):
      winebuild: Add a helper to build an ARM64EC function name.
      winebuild: Include x86-64 entry points in ARM64EC builds.
      makefiles: Avoid generating the .tab.c file twice with bison.
      makefiles: Remove support for obsolete source variables.
      winecrt0: Implement setjmp/longjmp for ARM64EC.
      ntdll: Add a stub ARM64EC CPU backend.
      ntdll: Don't use x86-64 assembly on ARM64EC.
      ntdll: Export __chkstk_arm64ec().
      makefiles: Use --defines instead of --header for compatibility with older bison.
      ntdll: Set function pointers in the ARM64EC metadata on dll load.
      ntdll: Implement __os_arm64x_check_call().
      ntdll: Implement __os_arm64x_get/set_x64_information().
      ntdll: Redirect PE function pointers through the ARM64EC redirection map.
      ntdll: Remove DECLSPEC_HIDDEN usage.
      make_specfiles: Generate a list of syscalls from the corresponding spec files.
      ntdll: Use the generated syscall list.
      win32u: Use the generated syscall list.
      wow64: Use the generated syscall list.
      wow64win: Use the generated syscall list.
      wow64: Remove DECLSPEC_HIDDEN usage.
      wow64cpu: Remove DECLSPEC_HIDDEN usage.
      ntdll: Build the syscall argument array from the generated syscall list.
      win32u: Set the syscall dispatcher on the PE side.
      win32u: Build the syscall argument array from the generated syscall list.
      win32u: Store the service table entry directly into the ntdll variable.
      wow64: Build the syscall argument array from the generated list.
      winebuild: Stop generating the syscall argument array and related data.
      win32u: Remove DECLSPEC_HIDDEN usage.
      tools: Upgrade the config.guess/config.sub scripts.
      explorer: Remove DECLSPEC_HIDDEN usage.
      wusa: Remove DECLSPEC_HIDDEN usage.
      ntdll: Generate syscall entry points from the C code with asm macros.
      win32u: Generate syscall entry points from the C code with asm macros.
      winebuild: Stop generating syscall entry points.
      ntdll: Add syscall entries for ARM64EC.
      win32u: Add syscall entries for ARM64EC.
      tiff: Fix size_t type size detection on 64-bit.
      fluidsynth: Use a signed atomic type to avoid warnings.
      faudio: Fix a few printf formats.
      ntdll: Store the syscall table in the TEB on i386.
      ntdll: Store the syscall table in the TEB on ARM.
      ntdll: Directly access the syscall table variable on x86-64.
      ntdll: Directly access the syscall table variable on ARM64.
      ntdll: Add a syscall_cfa member to the ARM64 syscall frame.
      ntdll: Add a syscall_cfa member to the ARM syscall frame.
      ntdll: Connect syscall frames across user callbacks on ARM64.
      ntdll: Connect syscall frames across user callbacks on ARM.
      ntdll: Switch to the kernel stack to abort a thread on i386.
      ntdll: Switch to the kernel stack to abort a thread on x86-64.
      ntdll: Switch to the kernel stack to abort a thread on ARM64.
      ntdll: Switch to the kernel stack to abort a thread on ARM.
      ntdll: Get rid of the thread exit frame on i386.
      ntdll: Get rid of the thread exit frame on x86-64.
      ntdll: Get rid of the thread exit frame on ARM64.
      ntdll: Get rid of the thread exit frame on ARM.
      ntdll: Remove the signal_exit_thread wrapper.
      nls: Update locale data to CLDR version 44.
      fluidsynth: Make glib replacement functions inline to avoid unused function warnings.
      jxr: Fix some clang compiler warnings.
      vkd3d: Disable printf format checks.
      bcrypt: Remove DECLSPEC_HIDDEN usage.
      crypt32: Remove DECLSPEC_HIDDEN usage.
      mmdevapi: Remove DECLSPEC_HIDDEN usage.
      netapi32: Remove DECLSPEC_HIDDEN usage.
      secur32: Remove DECLSPEC_HIDDEN usage.
      mountmgr: Remove DECLSPEC_HIDDEN usage.
      nsiproxy.sys: Remove DECLSPEC_HIDDEN usage.
      winebus.sys: Remove DECLSPEC_HIDDEN usage.
      ws2_32: Remove DECLSPEC_HIDDEN usage.
      ntdll: Use RtlFindExportedRoutineByName to simplify loader initialization.
      ntdll: Convert the ARM64EC context to ARM64 for syscalls.
      winedump: Display PE section offsets using their virtual address.

Alexandros Frantzis (26):
      win32u: Assume thread dpi for rect in NtUserIsWindowRectFullScreen.
      win32u: Respect per-monitor thread dpi awareness when getting window from point.
      winewayland.drv: Prepare to handle different coordinate spaces.
      winewayland.drv: Present surfaces with the correct scale.
      winewayland.drv: Refactor cursor code to prepare for scaling support.
      winewayland.drv: Present cursors with the correct scale.
      winewayland.drv: Ignore spurious size hints.
      winewayland.drv: Add skeleton Vulkan driver.
      winewayland.drv: Implement vkEnumerateInstanceExtensionProperties.
      winewayland.drv: Implement vkCreateInstance.
      winewayland.drv: Implement vkDestroyInstance.
      winewayland.drv: Implement vkGetDeviceProcAddr and vkGetInstanceProcAddr.
      winewayland.drv: Implement vkCreateWin32SurfaceKHR.
      winewayland.drv: Implement vkDestroySurfaceKHR.
      winewayland.drv: Use a client area subsurface as the Vulkan target.
      winewayland.drv: Set client area subsurface position.
      winewayland.drv: Set client area subsurface size.
      winewayland.drv: Forward all client surface pointer events to parent.
      winewayland.drv: Implement vkGetPhysicalDeviceSurfaceSupportKHR.
      winewayland.drv: Implement vkGetPhysicalDeviceSurfaceFormats(2)KHR.
      winewayland.drv: Implement vkGetPhysicalDeviceSurfaceCapabilities(2)KHR.
      winewayland.drv: Implement vkCreateSwapchainKHR.
      winewayland.drv: Implement vkDestroySwapchainKHR.
      winewayland.drv: Implement vkGetPhysicalDeviceSurfacePresentModesKHR.
      winewayland.drv: Implement vkGetPhysicalDeviceWin32PresentationSupportKHR.
      winewayland.drv: Implement vkGetSwapchainImagesKHR.

Alfred Agrell (6):
      winegstreamer: Store duration in the duration field.
      winegstreamer: Add wg_format_from_caps_audio_wma function.
      winegstreamer: Implement WMA <-> AMT conversion.
      winegstreamer: Switch WMA decoder to use wg_format internally.
      winegstreamer: Implement DMO interface for WMA decoder.
      mf/tests: Test IMediaObject_GetOutputSizeInfo.

Alistair Leslie-Hughes (7):
      dbghelp: Remove DECLSPEC_HIDDEN usage.
      include: Add DBPROPVAL_MR_* defines.
      msdasql: GetAvailableColumns correct assignment of DBCOLUMN data.
      rpcrt4: Remove DECLSPEC_HIDDEN usage.
      msado15: Updating recordset EditMode when field value changes.
      msado15: Correct logic when setting field value.
      msdasql: Check rowset pointer before assignment in ICommandText::Execute.

Anton Baskanov (14):
      dmsynth: Move instrument search to synth_preset_noteon().
      dmsynth: Get rid of instrument reference counting.
      dmsynth: Factor out instrument and region search.
      dmsynth: Fall back to the Standard drum set when there is no matching instrument or region.
      dmsynth: Use FLUID_MOD_KEY for CONN_SRC_KEYNUMBER.
      dmime: Factor out timeout computation.
      dmime: Don't queue messages with immediate delivery type.
      dmime: Always queue messages with non-immediate delivery type.
      dmime: Correctly requeue messages with changed time.
      dmime/tests: Move scale_music_time() and check_dmus_note_pmsg() up.
      dmime/tests: Test output tool note requeueing.
      dmime: Requeue the note message instead of directly queueing MIDI note-off.
      dmsynth: Preserve event order when positions are equal.
      dmsynth: Use time instead of position to order events.

Bartosz Kosiorek (2):
      msvcrt: Fix _mbsspn_l implementation.
      msvcrt: Add _mbsspnp_l implementation.

Bernhard Übelacker (2):
      uxtheme: Add stub for RefreshImmersiveColorPolicyState.
      notepad: Use GetDesktopWindow() when main window is not yet created.

Brendan Shanks (1):
      ntdll: Don't use sysconf(_SC_PHYS_PAGES) on macOS.

Daniel Lehman (8):
      msxml3/tests: Remove unused test field.
      msxml3/tests: Add tests for get_xml.
      msxml3/tests: Test for specific HRESULT in some tests.
      msxml6/tests: Add tests for default namespace.
      msxml4/tests: Add tests for default namespace.
      msxml3/tests: Add tests for default namespace.
      msxml4/tests: Copy create namespace tests.
      msxml6/tests: Copy create namespace tests.

Davide Beatrici (1):
      wineoss: Fix sound not working.

Dmitry Timoshkov (5):
      user32/tests: Add some tests for font charset returned by SPI_GETICONTITLELOGFONT and SPI_GETNONCLIENTMETRICS.
      shell32: Improve FolderView2::GetViewModeAndIconSize() stub.
      shell32: Return S_OK from IFolderView2::SetViewModeAndIconSize() stub.
      shell32: Implement IFolderView2::Items(&IID_IShellItemArray).

Eric Pouech (13):
      dbghelp: Remove DMT_ entries for .DBG and .PDB files.
      dbghelp: Expose some internal information about modules to winedbg.
      dbghelp: No longer decorate ELF/Mach-O module names.
      dbghelp: Expose PE native vs builtin information to winedbg.
      dbghelp: Pretend mach-o is present in case of failure.
      msvcrt/tests: Test passing environment in child process.
      ucrtbase/tests: Introduce environment tests.
      msvcrt: Lazily initialize ___winitenv.
      msvcrt: Allocate environment variables in separate allocation chunks.
      msvcrt: Fix ucrtbase environment initialization.
      regsvr32: Use message boxes by default for output.
      regedit: Use message boxes by default for output.
      winedbg: Use dbghelp extended module info.

Esme Povirk (1):
      user32/tests: Accept another variation in send_message_5.

Fabian Maurer (1):
      winex11: Free correct pointer when using xf86vm.

François Gouget (2):
      advapi32/tests: Fix a service stop race condition.
      user32/tests: Add a trailing linefeed to ok() and skip() calls.

Hans Leidekker (5):
      wldp: Improve the WldpGetLockdownPolicy() stub.
      fusion: Bump version to 4.6.1590.0.
      wineusb.sys: Add support for URB_FUNCTION_VENDOR_DEVICE.
      ntoskrnl: Stub EtwRegisterClassicProvider() and EtwUnregister().
      winhttp: Use an unsigned integer for number values in query_headers().

Jacek Caban (13):
      configure: Add arm64ec PE target support.
      tools: Initial ARM64EC target support.
      winebuild: Use COMDAT sections for ARM64EC functions.
      winecrt0: Initial ARM64EC support.
      include: Don't use dllexport attribute for Wine PE modules.
      msi: Store Context as MSIINSTALLCONTEXT in MSIPACKAGE.
      msi/tests: Initialize pathkey in test_installprops.
      gdiplus: Remove unused variable.
      ole32/tests: Remove unused variable.
      mshtml: Store Gecko inner window in HTMLInnerWindow and use it in HTMLTxtRange_select.
      mshtml: Use Gecko inner window in HTMLXMLHttpRequestFactory_create.
      mshtml: Use Gecko inner window in get_ns_selection.
      mshtml: Use Gecko inner window in get_clipboard_commands.

Jactry Zeng (1):
      msvcp140: Add codecvt<char32> class stub.

Louis Lenders (2):
      wbemprox: Add StandardCimv2 namespace.
      shcore: Add stub for RegisterScaleChangeEvent.

Marc-Aurel Zent (2):
      ntdll: Implement thread-ID alerts using kqueue/kevent.
      ntdll: Use IOPowerSources API to fill battery info on macOS.

Matteo Bruni (1):
      opengl32: Skip filter_extensions_index() on GL contexts < 3.0.

Michael Stefaniuc (9):
      dmime: Remove redundant NULL check before free().
      dmime/tests: Remove superfluous casts to self.
      dmime: Remove superfluous casts to self.
      dmsynth: Remove superfluous casts to self.
      dmusic: Remove superfluous casts to self.
      gdiplus: Remove redundant NULL check before free().
      sane.ds: Use ARRAY_SIZE instead of open coding it.
      winegstreamer: Remove redundant NULL check before free().
      quartz: Remove redudant NULL checks before CoTaskMemFree().

Myah Caron (1):
      windows.ui: Support accent colors in uisettings3_GetColorValue.

Nell Hardcastle (3):
      winebus.sys: Identify DualSense Edge as a DualSense controller.
      mmdevapi: Override product strings for DualSense Edge.
      hidclass.sys: Add DualSense Edge to device_strings.

Nikolay Sivov (6):
      d3dx9/effect: Rename effect initialization helper.
      evr/presenter: Handle failure to initialize D3D9.
      evr/tests: Skip tests if D3D9 is unusable.
      dxva2/tests: Skip tests if D3D9 is unusable.
      d3dcompiler/tests: Do not crash on device creation.
      oleaut32: Remove some deadcode from VarMod().

Paul Gofman (14):
      combase/tests: Add tests for implicit MTA with RoGetActivationFactory().
      combase: Ensure MTA existence in RoGetActivationFactory().
      winepulse.drv: Change device description.
      dnsapi: Handle IP address as DNS name in DnsQuery_UTF8().
      gdiplus: Round width and height in gdip_format_string().
      windowscodecs: Enable WICPixelFormat32bppBGRA in BMP encoder.
      msvcp110: Implement std::_Xbad_function_call().
      include: Add Windows.Security.ExchangeActiveSyncProvisioning.EasClientDeviceInformation runtimeclass.
      include: Fix ID3DXLoadUserData definition.
      d3dx9/tests: Add test for user data in D3DXLoadMeshHierarchyFromXInMemory().
      d3dx9: Implement loading top and frame user data in D3DXLoadMeshHierarchyFromXInMemory().
      d3dx9: Unify calling parse_mesh helper functions.
      d3dx9: Factor out mesh_get_parse_func().
      d3dx9: Support loading mesh user data in D3DXLoadMeshHierarchyFromXInMemory().

Paweł Ulita (1):
      user32: Add stubs for GetWindowDpiHostingBehavior and SetThreadDpiHostingBehavior.

Piotr Caban (6):
      msvcrt: Avoid temporary buffer allocation in _mbsrev_l.
      msvcrt: Add _mbsrev tests.
      msvcrt: Factor out env_get_index helper.
      msvcrt: Factor out wenv_get_index helper.
      msvcrt: Hold _ENV_LOCK when accessing environment variables.
      msvcp140: Add codecvt<char16> class stub.

Rémi Bernon (47):
      dmime/tests: Avoid discarding old notifications in test.
      dmime/tests: Test that IDirectMusicPerformance_Stop clears messages.
      dmime: Clear all pending messages in IDirectMusicPerformance_Stop.
      dmime: Send MIDI_SYSTEM_RESET message on performance reset.
      dmsynth: Reset synthesizer defaults on MIDI_SYSTEM_RESET.
      dmime: Split segment_state_play_chunk helper.
      dmime: Implement segment state repeat and looping.
      gitlab: Install libxkbcommon and libxkbregistry dependencies.
      winewayland.drv: Basic handling of Wayland keyboard events.
      winebus.sys: Ignore events on unsupported axes.
      windows.gaming.input: Fix inverted start / select gamepad buttons.
      winebus.sys: Fix incorrect hid_device_set index check.
      evr: Set last presented sample atomically.
      ntdll: Add comments to stack switches in dispatchers.
      ntdll: Remove unnecessary stack pointer CFI rules.
      ntdll: Add a syscall_cfa member to the i386 syscall frame.
      ntdll: Add a syscall_cfa member to the x86_64 syscall frame.
      ntdll: Connect syscall frames across user callbacks on i386.
      ntdll: Connect syscall frames across user callbacks on x86-64.
      winewayland.drv: Configure win32u keyboard repeat delay and speed.
      win32u: Implement opt-in auto-repeat for WM_(SYS)KEYDOWN messages.
      mfplat: Add support for internal MFVideoFormat_A2B10G10R10.
      mfplat: Add MFCreateAMMediaTypeFromMFMediaType stub.
      mfplat: Add MFInitAMMediaTypeFromMFMediaType stub.
      mfplat/tests: Add tests for MFInitAMMediaTypeFromMFMediaType.
      mfplat/tests: Add tests for MFCreateAMMediaTypeFromMFMediaType.
      mfplat/tests: Add IMFMediaType_GetRepresentation tests.
      mfplat: Only convert MEDIASUBTYPE for the formats which need it.
      mfplat: Use bits per pixel in uncompressed formats metadata.
      mfplat: Implement MFInitAMMediaTypeFromMFMediaType.
      mfplat: Implement MFCreateAMMediaTypeFromMFMediaType.
      mfplat: Implement IMFMediaType_(Get|Free)Representation.
      twinapi.appcore: Stub implement EasClientDeviceInformation runtimeclass.
      twinapi.appcore: Succeed some EasClientDeviceInformation stub calls.
      include: Use nested namespaces in windows.system.userprofile.idl.
      include: Add Windows.Globalization.GeographicRegion runtimeclass.
      windows.globalization: Stub Windows.Globalization.GeographicRegion factory.
      windows.globalization: Stub Windows.Globalization.GeographicRegion runtimeclass.
      windows.globalization: Implement GeographicRegion_get_CodeTwoLetter.
      include: Add Windows.System.Profile.AnalyticsInfo runtimeclass.
      twinapi.appcore: Stub Windows.System.Profile.AnalyticsInfo factory.
      twinapi.appcore: Stub Windows.System.Profile.AnalyticsInfo runtimeclass.
      twinapi.appcore: Implement Windows.System.Profile.AnalyticsInfo_get_DeviceFamily.
      twinapi.appcore: Implement Windows.System.Profile.AnalyticsInfo_get_DeviceFamilyVersion.
      include: Add Windows.System.UserProfile.AdvertisingManager runtimeclass.
      twinapi.appcore: Stub Windows.System.UserProfile.AdvertisingManager factory.
      twinapi.appcore: Return success from AdvertisingManager_get_AdvertisingId stub.

Santino Mazza (4):
      mlang/tests: Test GetStrCodePages with different codepages character.
      mlang: Fix GetStrCodePages for characters with different codepages.
      mlang/tests: Test for codepages priority.
      mlang: Implement codepages priority.

Tim Clem (3):
      msvcrt: Pass INT_MAX as the length in implementations of the _mbscoll family.
      winemac.drv: Move surface-related logs to the bitblt channel.
      winemac.drv: Return success from query_ime_char_rect.

Zebediah Figura (18):
      d3d8: Pass NOOVERWRITE to redundantly discarded maps.
      wined3d: Create the XFB counter BO in wined3d_context_vk_bind_stream_output_buffers().
      wined3d: Provide a null counter BO for slots with no corresponding XFB buffer bound.
      wined3d: Introduce a wined3d_state_get_ffp_texture() helper.
      wined3d: Trigger constant update when an SRV requiring NPOT fixup is bound.
      wined3d: Set the active texture in sampler_texdim().
      wined3d: Set the active texture in nvts_texdim().
      ws2_32/tests: Test sending data to a peer which is closed.
      http.sys: Keep connection sockets open after sending a 400 response.
      ws2_32/tests: Test send() after TCP reset.
      ws2_32/tests: Work around a Linux bug.
      server: Return ERROR_CONNECTION_RESET when trying to recv() on a reset socket.
      server: Translate AFD_POLL_RESET to FD_CLOSE plus WSAECONNABORTED in window messages.
      ws2_32: Translate AFD_POLL_RESET to FD_CLOSE plus WSAECONNABORTED in WSAEnumNetworkEvents().
      msvcrt: Perform a base-10 logarithm using integer math.
      wined3d: Revert uses of wined3d_state_get_ffp_texture() for non-FFP textures.
      ddraw/tests: Add a test for drawing to a flippable surface.
      ddraw: Read the current RTV before flipping any surfaces.

Zhiyi Zhang (13):
      uiribbon: Fix IUIFramework::SetUICommandProperty() prototype.
      msdasql/tests: Fix memory leaks.
      msdasql/tests: Add more IDBProperties::GetProperties() tests.
      msdasql: Return all initialization properties if no property ID is specified in dbprops_GetProperties().
      oledb32: Add missing const modifiers.
      oledb32/tests: Use wide-char string literals.
      oledb32/tests: Remove test_odbc_provider().
      oledb32/tests: Fix memory leaks.
      oledb32/tests: Add more IDataInitialize::GetInitializationString() tests.
      oledb32: Remove the trailing semicolon.
      oledb32: Fix property count in datainit_GetInitializationString().
      oledb32: Quote values containing semicolons.
      oledb32: Remove unnecessary properties in datainit_GetInitializationString().

Ziqing Hui (2):
      winestreamer: Introduce media_sink_write_stream.
      winegstreamer: Implement wg_muxer_read_data.