Po roku prac rozwojowych i 26 wersjach eksperymentalnych, zaprezentowano stabilną wersję otwartej implementacji Win32 API — Wine 9.0, która zawiera ponad 7000 zmian. Kluczowymi osiągnięciami w nowej wersji jest wdrożenie architektury WoW64 do uruchamiania 32-bitowych programów w 64-bitowym środowisku, integracja sterownika do wsparcia Wayland, wsparcie architektury ARM64, implementacja API DirectMusic oraz wsparcie dla kart inteligentnych.
W Wine potwierdzono pełną funkcjonalność 5336 programów Windows (rok temu 5266, dwa lata temu 5156, trzy lata temu 5049), a dodatkowe 4397 (rok temu 4370, dwa lata temu 4312, trzy lata temu 4227) działa doskonale przy dodatkowych ustawieniach i zewnętrznych DLL. U 3943 programów (rok temu 3888, dwa lata temu 3813, trzy lata temu 3703) występują drobne problemy, które nie przeszkadzają w korzystaniu z podstawowych funkcji aplikacji.
Kluczowe nowości Wine 9.0:
- Dodano sterownik winewayland.drv, który umożliwia korzystanie z Wine w środowiskach opartych na protokole Wayland bez użycia XWayland i komponentów X11. Rozwój ma na celu zapewnienie działania czystego środowiska Wayland z możliwością uruchamiania aplikacji Windows, które nie wymaga instalacji pakietów związanych z X11, co pozwala osiągnąć wyższą wydajność i responsywność gier przez wyeliminowanie zbędnych warstw. Użycie czystego środowiska Wayland dla Wine również pozwala pozbyć się problemów z bezpieczeństwem, typowych dla X11 (np. niegodne zaufania gry dla X11 mogą szpiegować inne aplikacje, ponieważ protokół X11 zapewnia dostęp do wszystkich zdarzeń wejściowych i pozwala na podstawienie fałszywych naciśnięć klawiszy).
Sterownik jest oznaczony jako eksperymentalny i wciąż w opracowaniu, ale mimo to wspiera już wiele funkcji, takich jak zarządzanie oknami, współpraca z wieloma monitorami, wsparcie dla skalowania wyświetlania na ekranach o wysokiej gęstości pikseli (high-DPI), praca z względnymi współrzędnymi podczas śledzenia ruchów myszy oraz wsparcie dla graficznego API Vulkan. Domyślnie sterownik nie jest aktywny, a aby go włączyć, należy dodać „wayland” do parametru rejestru „HKCU\Software\Wine\Drivers” i upewnić się, że zmienna środowiskowa DISPLAY nie jest ustawiona: wine reg.exe add HKCU\\Software\\Wine\\Drivers /v Graphics /d x11,wayland
- Przeprowadzono tłumaczenie wszystkich modułów na interfejs wywołań systemowych NT, zamiast bezpośrednich wywołań między poziomami PE i Unix, co oznacza zakończenie wieloletniej pracy nad tłumaczeniem wszystkich bibliotek DLL na korzystanie z formatu plików wykonywalnych PE (Portable Executable).
- Kontynuowano rozwój warstwy WoW64 (64-bit Windows-on-Windows), umożliwiającej uruchamianie 32-bitowych aplikacji Windows w 64-bitowych systemach Unix. We wszystkich modułach, które odwołują się do bibliotek Unix, zastosowano konwertery wywołań systemowych WoW64 (thunk), umożliwiające 32-bitowym modułom w formacie PE dostęp do 64-bitowych bibliotek Unix.
Udoskonalono nowy tryb uruchamiania WoW64, w którym 32-bitowy kod jest wykonywany wewnątrz 64-bitowego procesu (w starym trybie WoW64 aplikacje 32-bitowe uruchamiane były w 32-bitowych procesach Unix). Dodano wsparcie dla nowego trybu WoW64 na platformie macOS. Ponieważ w nowym trybie WoW64 występują pewne niedociągnięcia, takie jak brak wsparcia dla trybu 16-bitowego oraz zmniejszona wydajność OpenGL z powodu braku wsparcia dla rozszerzenia ARB_buffer_storage, nie jest on obecnie domyślnie włączony i wymaga kompilacji z opcją "--enable-archs=i386,x86_64" w skrypcie configure.
- Dodano możliwość uruchamiania istniejących plików wykonywalnych Windows na systemach z architekturą ARM64. Wprowadzono możliwość kompilacji Wine dla ABI ARM64EC (ARM64 Emulation Compatible) oraz wsparcie dla ładowania modułów ARM64EC, które są używane do ułatwienia portowania aplikacji na systemy ARM64, które pierwotnie napisane zostały dla architektury x86_64, poprzez umożliwienie wykonywania w środowisku ARM64 oddzielnych modułów z kodem x86_64 za pomocą emulatora. Dodano wsparcie dla formatu plików PE ARM64X, który pozwala na ładowanie jednego pliku wykonywalnego w procesach x64/Arm64EC i ARM64. Wprowadzono interfejs do emulacji 32-bitowych systemów x86, ale biblioteka z emulatorem wciąż nie została włączona do głównej wersji Wine (do uruchomienia kodu x86 w środowisku ARM64 można użyć zewnętrznego emulatora FEX).
- Podsystem graficzny
- Sterownik PostScript został przearanżowany w celu wsparcia plików spool w formacie Windows, w których przechowywane są dane o zadaniach do wydruku. Wyeliminowano bezpośrednie odwołania do sterownika z środowiska Unix.
- W motywach WinRT dodano wsparcie dla trybu ciemnego. W WineCfg dodano ustawienie do włączenia ciemnego motywu interfejsu.
- W sterowniku dla API graficznego Vulkan dodano wsparcie dla specyfikacji Vulkan 1.3.272 (w Wine 8.0 wspierano 1.3.237).
- Przeprowadzono optymalizację funkcji biblioteki GdiPlus, co pozwoliło zwiększyć wydajność pracy z grafiką.
- Direct3D
- Zatrzymano analizę wielowątkowego strumienia komend w przypadku braku przetwarzanych komend renderowania, co pozwala na obniżenie zużycia energii do poziomu jednordzeniowego przetwarzania podczas wykonywania programów, które nie zajmują całej przepustowości strumienia komend.
- W Direct3D 10 wprowadzono wsparcie dla dodatkowych efektów.
- Wprowadzono optymalizacje wydajności w kodzie WineD3D oraz w backendzie korzystającym z API graficznego Vulkan.
- W kodzie renderowania opartym na API Vulkan dodano sprawdzenie możliwości wspieranych przez urządzenie oraz zwracanie aplikacji informacji o dostępnych poziomach funkcjonalności Direct3D.
- Wprowadzono funkcje D3DXFillTextureTX i D3DXFillCubeTextureTX.
- W klasycznym backendzie shaderów OpenGL ARB dodano wsparcie dla definiowania cieni za pomocą rozszerzenia ARB_fragment_program_shadow.
- W funkcji D3DXLoadMeshHierarchyFromX i pokrewnych dodano wsparcie dla ładowania danych użytkownika za pomocą interfejsu ID3DXLoadUserData.
- Dźwięk i wideo
- Zaoferowano wstępną implementację API DirectMusic. Dodano wsparcie dla kolekcji, instrumentów i próbek dźwiękowych w formacie SoundFont. Dodano wsparcie dla efektu Dopplera. Zrealizowano testy weryfikujące poprawność implementacji podczas działania sekwensera dmime i syntezatora MIDI dmsynth.
- W celu użycia w API DirectMusic wbudowano bibliotekę FluidSynth.
- Wprowadzono wsparcie dla ładowania dźwiękowych czcionek (SoundFont - formaty do syntezowania na podstawie próbek, używane do odtwarzania plików MIDI) w formatach DLS1 i DLS2, a także w formacie SF2, stosowanym w systemie Linux.
- Dodano możliwość odtwarzania treści MIDI za pomocą biblioteki dmsynth, korzystając z programowego syntezatora FluidSynth i API DirectSound do wyjścia dźwięku.
- Dodano dekoder dla wideo w formacie kodeka wideo Indeo IV50.
- DirectShow
- Wprowadzono komponent DMO (DirectX Media Object) z dekoderem formatu WMV (Windows Media Video).
- Dodano filtr przechwytywania dźwięku (DirectShow Audio Capture Filter).
- W filtrze dzielenia strumieni MPEG‑1 (DirectShow MPEG‑1 Stream Splitter) dodano wsparcie dla strumieni wideo oraz strumieni pomocniczych oprócz strumieni dźwiękowych.
- Wprowadzono filtr do dekodowania wideo w formacie MPEG-1 (DirectShow MPEG-1 Video Decoder).
- Urządzenia wejściowe
- W DirectInput dodano wsparcie dla mapowania działań (action maps), które pozwala przypisać przyciski na kontrolerze do konkretnych działań w grach.
- Integracja z pulpitem
- Zezwolono na eksportowanie do głównego środowiska użytkownika powiązań, które umożliwiają uruchamianie aplikacji działających pod Wine jako handlerów protokołów przy otwieraniu adresów URL (np. uruchomienie spotify.exe przy otwieraniu linków typu „spotify:user:spotify:playlist:848218482355482821”).
- Wprowadzono ekstrakcję danych EDID (Extended Display Identification Data) z informacjami o parametrach podłączonego monitora, takich jak nazwa i model urządzenia.
- Dodano możliwość zamykania okna pulpitu w trybie pełnoekranowym za pomocą przycisku „Wyjdź z pulpitu” w menu „Start”.
- Międzynarodowa lokalizacja
- Rozszerzono wsparcie IME (Input Method Editors). Przeprowadzono prace w celu zapewnienia kompatybilności z natywnymi dla Windows implementacjami IME oraz poprawy integracji z Linux IME.
- Zrealizowano generację bazy danych lokalnych w formacie locale.nls z bazy Unicode CLDR (Unicode Common Locale Data Repository) wersja 44. Dodano wsparcie dla dodatkowych lokalizacji bew-ID, blo-BJ, csw-CA, ie-EE, mic-CA, prg-PL, skr-PK, tyv-RU, vmw-MZ, xnr-IN i za-CN.
- Wykonano tłumaczenie interfejsu na język gruziński. Zapewniono pełne tłumaczenia dla 16 języków oraz częściowe dla 31 języków.
- Tabele znaków Unicode zostały zaktualizowane do wersji standardu 15.1.0. Zaktualizowano bazę stref czasowych.
- Jądro (interfejsy jądra Windows)
- Jako domyślną określono wersję Windows 10.
- Dla plików wykonywalnych w formacie PE wdrożono wsparcie dla randomizacji przestrzeni adresowej (ASLR), ale adresy załadowania kodu w pamięci na razie nie są w pełni zrandomizowane.
- Wprowadzono wsparcie dla słabo fragmentowanej sterty (LFH, Low Fragmentation Heap), co pozwoliło zwiększyć wydajność operacji przydzielania pamięci.
- W mechanizmie przydzielania pamięci wirtualnej dodano wsparcie dla rezerwacji pamięci (placeholder), umożliwiające aplikacji zarezerwowanie określonego obszaru pamięci wirtualnej do przyszłego użytku.
- 64-bitowe programy ładujące (loader i preloader) plików wykonywalnych i bibliotek zostały zbudowane w formacie PIE (Position-Independent Executables), aby zwolnić część 32-bitowej przestrzeni adresowej.
- Zabezpieczono poprawną unwinding stosu (stack unwinding) dla wywołań systemowych NT i wywołań zwrotnych użytkowników.
- Możliwości sieciowe
- W silniku MSHTML wprowadzono wsparcie dla mechanizmu zbierania śmieci „Cycle Collection”.
- W MSHTML dodano wsparcie dla synchronicznego trybu przetwarzania zapytań XMLHttpRequest.
- W jscript.dll dodano wsparcie dla obiektu WeakMap do pracy z kolekcją par klucz/wartość, w której klucz jest obiektem, do którego można przypisać dowolną wartość. Zaimplementowano metody WeakMap.get(), WeakMap.delete(), WeakMap.clear() i WeakMap.has().
- Silnik przeglądarki Gecko zaktualizowano do wersji 2.47.4.
- Wprowadzono wsparcie dla powiadomień o zmianie stanu interfejsu sieciowego.
- Kryptografia i bezpieczeństwo
- W bibliotece Winscard.dll dodano wsparcie dla kart inteligentnych, realizowane przez systemową bibliotekę PCSClite.
- W BCrypt dodano wsparcie dla protokołu wymiany kluczy Diffiego-Hellmana.
- Wprowadzono pakiet Negotiate, który zapewnia warstwę do korzystania z interfejsu SSPI (Security Support Provider Interface) do komunikacji z dostawcami SSP (Security Support Provider).
- Wbudowane aplikacje
- W debuggerze Wine Debugger (winedbg) do deasmblowania instrukcji maszynowych X86 wykorzystano bibliotekę Zydis.
- W interfejsie WineCfg dodano możliwość wybrania starych wersji Windows (do XP) na platformach 64-bitowych, co pozwala uruchamiać przestarzałe aplikacje w trybie WoW64.
- We wszystkich wbudowanych aplikacjach graficznych wprowadzono wyświetlanie informacji o błędach w osobnym dialogu zamiast ich wyświetlania w konsoli.
- W programie systeminfo zapewniono wyświetlanie informacji z bazy danych WMI (Windows Management Instrumentation).
- Dodano aplikację klist do wyświetlania biletów Kerberos.
- W aplikacji taskkill wprowadzono możliwość wymuszenia zakończenia procesów potomnych.
- Do narzędzia start dodano parametr „/machine”, umożliwiający wybór architektury używanej podczas uruchamiania hybrydowych plików wykonywalnych obsługujących x86 i ARM.
- Wprowadzono większość funkcjonalności programu tasklist.
- Dodano podstawową implementację aplikacji findstr.
- Narzędzia do разработки
- W narzędziu WineDump wprowadzono możliwość wyświetlania zawartości plików rejestru Windows (format REGF) oraz pokazywania danych dla wszystkich architektur (x86/ARM64) wspieranych w hybrydowych plikach PE.
- W kompilatorze IDL dodano wsparcie dla atrybutów „composable”, „default_overload”, „deprecated” i „protected”.
- Usunięto bibliotekę libwine.so, która została ogłoszona jako przestarzała w wersji Wine 6.0 i od dawna nie jest używana w Wine. Programy w formacie ELF, zbudowane w starych wersjach Wine (5.0 i starszych) z libwine.so, wymagają rekompilacji, aby działały w Wine 9.0.
- Wbudowane biblioteki i zewnętrzne zależności
- W skład zintegrowanych bibliotek wchodzą FluidSynth 2.3.3, Musl 1.2.3 (tylko funkcje matematyczne) oraz Zydis 4.0.0.
- Zaktualizowano komponenty do nowych wersji: Vkd3d 1.10, Faudio 23.12, OpenLDAP 2.5.16, LCMS2 2.15, LibMPG123 1.32.2, LibPng 1.6.40, LibTiff 4.6.0, LibXml2 2.11.5, LibXslt 1.1.38 oraz Zlib 1.3. Silnik Wine Mono z implementacją platformy .NET zaktualizowano do wersji 8.1.0.
- W sterowniku winewayland.drv jako zewnętrzne zależności wykorzystano bibliotekę kliencką Wayland oraz biblioteki xkbcommon i xkbregistry.
- Do obsługi kart inteligentnych wykorzystano zewnętrzną bibliotekę PCSClite (w macOS — PCSC).
- Do kompilacji plików PE na platformach innych niż i386 teraz απαιτείται obecność kompilatora krzyżowego obsługującego dyrektywy «.seh» do obsługi wyjątków.
Źródło: opennet.ru
