Po roku prac i 30 wersjach eksperymentalnych, z dumą przedstawiamy stabilne wydanie otwartej implementacji Win32 API — Wine 7.0, które zawiera ponad 9100 zmian. Wśród kluczowych osiągnięć nowej wersji wymienia się przetłumaczenie większości modułów Wine na format PE, wsparcie dla motywów graficznych, rozszerzenie stosu dla joysticków i urządzeń wejściowych z interfejsem HID, oraz wdrożenie architektury WoW64, umożliwiającej uruchamianie programów 32-bitowych w 64-bitowym środowisku.
W Wine potwierdzono pełne działanie 5156 (rok temu 5049) programów dla systemu Windows, dodatkowe 4312 (rok temu 4227) programów działa świetnie po dodatkowych ustawieniach i użyciu zewnętrznych DLL. U 3813 programów (rok temu 3703) występują drobne problemy z działaniem, które nie przeszkadzają w korzystaniu z podstawowych funkcji aplikacji.
Kluczowe nowości Wine 7.0:
- Moduły w formacie PE
- Prawie wszystkie biblioteki DLL zostały przetłumaczone na użycie formatu plików wykonywalnych PE (Portable Executable, stosowanego w systemie Windows) zamiast ELF. Zastosowanie PE rozwiązuje problemy z obsługą różnych schematów ochrony przed kopiowaniem, które weryfikują tożsamość modułów systemowych na dysku i w pamięci.
- Wprowadzono możliwość współpracy modułów PE z bibliotekami Unix z wykorzystaniem standardowego wywołania systemowego jądra NT, co pozwala na ukrycie dostępu do kodu Unix przed debuggerami Windows oraz śledzenie rejestracji wątków.
- Wbudowane DLL są teraz ładowane tylko wtedy, gdy na dysku znajduje się odpowiadający im plik w formacie PE, niezależnie od tego, czy jest to rzeczywista biblioteka, czy atrapka. Zmiana ta pozwala aplikacji zawsze widzieć poprawne powiązanie do plików PE. Aby wyłączyć to zachowanie, można użyć zmiennej środowiskowej WINEBOOTSTRAPMODE.
- WoW64
- Wdrożono architekturę WoW64 (64-bit Windows-on-Windows), która umożliwia uruchamianie 32-bitowych aplikacji Windows w 64-bitowych procesach Unix. Wsparcie zostało zrealizowane przez dodanie warstwy, która translatuje 32-bitowe wywołania systemowe NT na 64-bitowe odwołania do NTDLL.
- Warstwy WoW64 są przygotowane dla większości bibliotek Unix i pozwalają 32-bitowym modułom w formacie PE na dostęp do 64-bitowych bibliotek Unix. Po zakończeniu konwersji wszystkich modułów na format PE, pojawi się możliwość uruchamiania 32-bitowych aplikacji Windows bez instalacji 32-bitowych bibliotek Unix.
- Motywy graficzne
- Wprowadzono obsługę motywów. W skład wchodzą motywy „Jasny”, „Niebieski” oraz „Klasyczny Niebieski”, które można wybrać za pomocą konfiguratora WineCfg.
- Dodano możliwość dostosowania wyglądu wszystkich elementów interfejsu przez motywy. Zapewniono automatyczne aktualizowanie wyglądu elementów po zmianie motywu.
- Wszystkie wbudowane aplikacje Wine zyskały wsparcie dla motywów. Przeprowadzono adaptację aplikacji do wyświetlaczy o wysokiej gęstości pikseli (High DPI).
- Podsystem graficzny
- Dodano nową bibliotekę Win32u, w której wydzielono części bibliotek GDI32 i USER32 związane z przetwarzaniem grafiki i zarządzaniem oknami na poziomie jądra. W przyszłości rozpoczną się prace nad przeniesieniem do Win32u komponentów sterowników, takich jak winex11.drv i winemac.drv.
- W sterowniku Vulkan wprowadzono obsługę specyfikacji API graficznego Vulkan 1.2.201.
- Dodano wsparcie dla outputu przez API Direct2D z użyciem obiektów geometrycznych cieniowanych, z możliwością sprawdzenia, czy kliknięcie miało miejsce (hit-test).
- W API Direct2D wprowadzono wstępne wsparcie dla efektów wizualnych stosowanych za pomocą interfejsu ID2D1Effect.
- W API Direct2D dodano wsparcie dla interfejsu ID2D1MultiThread, stosowanego do organizacji ekskluzywnego dostępu do zasobów w aplikacjach wielowątkowych.
- W zbiorze bibliotek WindowsCodecs zaimplementowano wsparcie dla dekodowania obrazów w formacie WMP (Windows Media Photo) oraz kodowania obrazów w formacie DDS (DirectDraw Surface). Zaprzestano wsparcia dla kodowania obrazów w formacie ICNS (dla macOS), który nie jest obsługiwany w Windows.
- Direct3D
- Zdecydowanie ulepszono nowy silnik renderowania, który tłumaczy wywołania Direct3D na API graficzne Vulkan. W większości przypadków poziom wsparcia Direct3D 10 i 11 w silniku opartym na Vulkan jest równy wsparciu w starym silniku opartym na OpenGL. Aby włączyć silnik renderowania przez Vulkan, należy ustawić odpowiednią zmienną rejestru Direct3D „renderer” na „vulkan”.
- Wdrożono wiele funkcji Direct3D 10 i 11, w tym opóźnione konteksty (Deferred Contexts), działające w kontekście urządzeń obiekty stanu, stałe przesunięcia w buforach, czyszczenie nieuporządkowanych widoków tekstur, kopiowanie danych między zasobami w nienazwanych formatach (DXGI_FORMAT_BC3_TYPELESS, DXGI_FORMAT_R32G32B32A32_TYPELESS) itd.
- Dodano wsparcie dla konfiguracji wielomonitorowych, co pozwala na wybór monitora do wyświetlania aplikacji Direct3D w trybie pełnoekranowym.
- W API DXGI zrealizowano możliwość korekcji gamma ekranu, co może być stosowane przez aplikacje bazujące na Direct3D 10 i 11 do zmiany jasności ekranu. Zapewniono wydobycie liczników wirtualnych buforów ramek (SwapChain).
- W Direct3D 12 dodano wsparcie dla głównych sygnatur wersji 1.1.
- W kodzie renderowania przez API Vulkan zwiększono wydajność przetwarzania zapytań w przypadku wsparcia rozszerzenia VK_EXT_host_query_reset w systemie.
- Dodano możliwość wyprowadzania wirtualnych buforów ramek (SwapChain) przez GDI, jeśli do wyświetlania nie mogą być używane OpenGL lub Vulkan, na przykład przy wyjściu w oknie z różnych procesów, jak w programach bazujących na frameworku CEF (Chromium Embedded Framework).
- Przy użyciu backendu dla shaderów GLSL dla instrukcji shaderowych zapewniono zastosowanie modyfikatora „precise”.
- W API DirectDraw dodano wsparcie dla renderowania 3D w pamięci systemowej przy użyciu urządzeń programowych, takich jak „RGB”, „MMX” i „Ramp”.
- Do bazy kart graficznych Direct3D dodano karty AMD Radeon RX 5500M, AMD Radeon RX 6800/6800 XT/6900 XT, AMD Van Gogh, Intel UHD Graphics 630 oraz NVIDIA GT 1030.
- Z rejestru HKEY_CURRENT_USER\Software\Wine\Direct3D usunięto klucz „UseGLSL”, zamiast niego od wersji Wine 5.0 należy używać „shader_backend”.
- Aby wspierać Direct3D 12, teraz potrzebna jest biblioteka vkd3d co najmniej w wersji 1.2.
- D3DX
- W implementacji D3DX 10 poprawiono wsparcie dla frameworku wizualnych efektów i dodano wsparcie dla formatu obrazów Windows Media Photo (JPEG XR).
- Dodano funkcje tworzenia tekstur, takie jak D3DX10CreateTextureFromMemory() dostępne w D3DX10.
- Częściowo zrealizowano interfejsy programowe ID3DX10Sprite i ID3DX10Font.
- Dźwięk i wideo
- W jeden wspólny backend WineGStreamer połączono nakładki GStreamer dla DirectShow i frameworku Media Foundation, co powinno uprościć tworzenie nowych API do dekodowania treści.
- Na bazie backendu WineGStreamer zrealizowano obiekty Windows Media do synchronizacji i asynchronicznego odczytu.
- Kontynuowano rozwój implementacji frameworku Media Foundation, dodano wsparcie dla funkcjonalności IMFPMediaPlayer, alokatora próbek (sample allocator), poprawiono wsparcie dla EVR i buforów rysunkowych SAR.
- Usunięto bibliotekę wineqtdecoder, która zapewniała dekoder dla formatu QuickTime (dla wszystkich kodeków teraz używany jest GStreamer).
- Urządzenia wejściowe
- Zdecydowanie ulepszono stos dla urządzeń wejściowych obsługujących protokół HID (Human Interface Devices), w którym zaimplementowano takie możliwości jak analiza opisów HID, przetwarzanie komunikatów HID oraz dostarczanie mini-driverów HID.
- W backendzie sterownika winebus.sys poprawiono translację opisów urządzeń na komunikaty HID.
- Dodano nowy backend DirectInput dla joysticków obsługujących protokół HID. Zrealizowano możliwość korzystania z efektów sprzężenia zwrotnego w joystickach. Udoskonalono panelu administracyjnego joysticki. Optymalizowano interakcję z urządzeniami zgodnymi z XInput. W WinMM wsparcie dla joysticków przeniesiono na DInput, zamiast korzystać z backendu evdev w Linux i IOHID w macOS. Usunięto stary sterownik joysticków winejoystick.drv.
- W module DInput dodano nowe testy, oparte na zastosowaniu wirtualnych urządzeń HID, które nie wymagają obecności fizycznego urządzenia.
- Tekst i czcionki
- W DirectWrite dodano obiekt Font Set.
- W RichEdit poprawnie zaimplementowano interfejs TextHost.
- Jądro (interfejsy jądra Windows)
- Przy uruchamianiu w Wine nieznanego pliku wykonywalnego (np. ‘wine foo.msi’) teraz wywoływane jest start.exe, które uruchamia procedury związane z typem pliku.
- Dodano wsparcie dla mechanizmów synchronizacji NtAlertThreadByThreadId oraz NtWaitForAlertByThreadId, bliskich futexom w Linux.
- Dodano wsparcie dla obiektów diagnostycznych NT, używanych do debuggowania funkcji jądra.
- Dodano wsparcie dla dynamicznych kluczy rejestru do przechowywania danych o wydajności.
- C Runtime
- W C runtime zrealizowano pełny zestaw funkcji matematycznych, głównie przeniesionych z biblioteki Musl.
- Dla wszystkich platform CPU zapewniono poprawne wsparcie dla funkcji do obliczeń zmiennoprzecinkowych.
- Możliwości sieciowe
- Ulepszono tryb zgodności z Internet Explorer 11 (IE11), który teraz jest używany domyślnie do przetwarzania dokumentów HTML.
- W bibliotece mshtml zaimplementowano tryb JavaScript ES6 (ECMAScript 2015), w którym zapewniono wsparcie dla takich możliwości, jak wyrażenie let oraz obiekt Map.
- Instalacja w roboczym katalogu Wine pakietów MSI z dodatkami do silnika Gecko odbywa się teraz w razie potrzeby, a nie w trakcie aktualizacji Wine.
- Dodano wsparcie dla protokołu DTLS.
- Zrealizowano serwis NSI (Network Store Interface), który przechowuje i przekazuje innym usługom informacje o trasowaniu i interfejsach sieciowych na komputerze.
- Obsługiwacze API WinSock, takie jak setsockopt i getsockopt, przeniesiono do biblioteki NTDLL i sterownika afd.sys, aby dostosować się do architektury Windows.
- W katalogu roboczym Wine teraz instalowane są własne pliki z bazami danych sieciowych, takie jak /etc/protocols i /etc/networks, zamiast odnosić się do analogicznych baz danych Unix.
- Alternatywne platformy
- Dodano wsparcie dla sprzętu Apple opartego na procesorach ARM M1 (Apple Silicon).
- Aby wspierać funkcje BCrypt i Secur32 na platformie macOS, teraz wymagana jest instalacja biblioteki GnuTLS.
- 32-bitowe pliki wykonywalne dla platform ARM są teraz kompilowane w trybie Thumb-2, podobnie jak w Windows. Do ładowania takich plików używany jest preloader.
- Dla 32-bitowych platform ARM wprowadzono wsparcie dla rozwijania wyjątków (unwinding).
- Dla FreeBSD rozszerzono liczbę obsługiwanych zapytań o niskopoziomowe informacje o systemie, takich jak dane o stanie pamięci i poziomie naładowania akumulatora.
- Wbudowane aplikacje i narzędzia do programowania
- Do narzędzia reg.exe dodano wsparcie dla 32- i 64-bitowych reprezentacji rejestru. Dodano także wsparcie dla kopiowania kluczy rejestru.
- Do narzędzia WineDump dodano wsparcie dla wyjścia zrzutu metadanych Windows oraz pokazania szczegółowych informacji o wpisach CodeView.
- W debugerze Wine Debugger (winedbg) wprowadzono możliwość debugowania 32-bitowych procesów z 64-bitowego debugera.
- W kompilatorze IDL (widl) dodano możliwość ładowania bibliotek wbudowanych w pliki PE, zapewniając wsparcie dla specyficznych dla WinRT atrybutów i konstrukcji oraz wdrożono wyszukiwanie bibliotek związanych z platformą.
- System kompilacji
- W katalogach specyficznych dla architektury bibliotek teraz przechowywane są pliki z nazwami odzwierciedlającymi architekturę i typ plików wykonywalnych, na przykład 'i386-windows' dla formatu PE i 'x86_64-unix' dla bibliotek unixowych, co umożliwia wsparcie dla różnych architektur w jednej instalacji Wine i zapewnia cross-kompilację Winelib.
- Aby ustawić w nagłówkach plików PE opcję zarządzającą przejściem na użycie rodzimych bibliotek DLL, w winebuild dodano flagę ‘—prefer-native option’ (przetwarzanie DLL_WINE_PREATTACH w DllMain zostało zakończone).
- Dodano wsparcie dla czwartej wersji formatu danych debugowania Dwarf, która teraz jest domyślnie używana podczas kompilacji bibliotek Wine.
- Dodano opcję kompilacji ‘—enable-build-id’ do zapisania unikalnych identyfikatorów kompilacji w plikach wykonywalnych.
- Dodano wsparcie dla korzystania z kompilatora Clang w trybie zgodności z MSVC.
- Różne
- Nazwa typowych katalogów w powłoce użytkownika (Windows Shell) została dostosowana do schematu stosowanego od Windows Vista, tzn. zamiast 'Moje dokumenty' teraz tworzony jest katalog 'Dokumenty', a większość danych przechowywana jest w katalogu 'AppData'.
- W warstwie dla biblioteki OpenCL dodano wsparcie dla specyfikacji OpenCL 1.2.
- W sterowniku WinSpool dodano wsparcie dla różnych rozmiarów stron podczas drukowania.
- Dodane początkowe wsparcie dla MSDASQL, dostawcy Microsoft OLE DB dla sterowników ODBC.
- Silnik Wine Mono z implementacją platformy .NET zaktualizowano do wersji 7.0.0.
- Dane Unicode zaktualizowano do specyfikacji Unicode 14.
- Do drzewa źródłowego wbudowano biblioteki Faudio, GSM, LCMS2, LibJPEG, LibJXR, LibMPG123, LibPng, LibTiff, LibXml2, LibXslt i Zlib, które są kompilowane w formacie PE i nie wymagają wersji w formacie Unix. Biblioteki te mogą również być importowane z systemu w celu użycia zewnętrznych kompilacji zamiast wbudowanych wersji PE.
Źródło: opennet.ru
