Menu Zamknij

Need for Speed Porsche Unleashed na Windows 11. Cztery awarie i jak je obszedłem

Trzy razy nic

Dwuklik w setup.exe. Kursor mrugnął klepsydrą i wrócił do normy. Żadnego okna, żadnego błędu, żadnego wpisu w dzienniku zdarzeń. Kliknąłem drugi raz, potem trzeci. Nic.

W Menedżerze zadań siedziało pięć procesów o nazwie Setup. Każdy z jednym wątkiem, każdy zjadł 0,05 sekundy procesora i od tamtej pory nie robił absolutnie nic. Najstarszy wisiał od poprzedniego dnia.

Tak zaczęła się instalacja Need for Speed Porsche Unleashed na Windows 11. Gra z marca 2000 roku. Wydawało mi się, że to kwestia dziesięciu minut.

Instalator, który czeka na przeglądarkę

Pierwsza hipoteza była oczywista i błędna. Stare gry mają zwykle szesnastobitowy instalator, a 64-bitowy Windows takich nie uruchamia od zawsze. Sprawdziłem nagłówki plików. Wszystkie okazały się czystym PE32 x86, czyli trzydziestodwubitowe, które Windows 11 obsługuje bez mrugnięcia okiem.

Poszedłem dalej w złą stronę. Sprawdzałem brakujące biblioteki z epoki Win9x, bo InstallShield 5 ich potrzebuje. Były na miejscu, w SysWOW64. Sprawdzałem Defendera, uprawnienia, tryb zgodności, wolne miejsce na dyskach. Nic z tego.

Odpowiedź przyszła z forum PCGamingWiki, gdzie ktoś w 2021 roku opisał dokładnie ten sam objaw i dostał radę, która wygląda absurdalnie, dopóki nie zadziała. Menedżer zadań, zakładka Szczegóły, prawy przycisk na wiszącym procesie, Analizuj łańcuch oczekiwania. To wbudowane narzędzie Windows, o którym prawie nikt nie wie.

Okienko wypisało: „Proces Setup.exe czeka na inny proces (msedge.exe)”.

Edge. Przeglądarka, której nawet nie miałem otwartej, bo trzyma procesy w tle po zamknięciu wszystkich kart.

Mechanizm jest taki. InstallShield 5 pochodzi z czasów, gdy sprawdzało się środowisko systemowe, wysyłając komunikat do wszystkich okien najwyższego poziomu naraz. Funkcja, której użyto, jest synchroniczna: czeka, aż każde okno odpowie. Wystarczy jeden proces, który nie przetwarza pętli komunikatów, żeby zawiesić nadawcę na zawsze. Bez błędu, bez limitu czasu, bez śladu w logach.

Zaznaczyłem Edge w tym okienku, kliknąłem „Zakończ proces” i instalator pojawił się natychmiast. Po godzinie szukania.

Warto zapamiętać, że winowajcą nie musi być akurat Edge. Na forum ludzie łapali na tym explorer.exe i nvcontainer.exe od NVIDII. Kiedy powtarzałem instalację na drugim komputerze, blokował ją AnyDesk, przez który się łączyłem. To loteria. Blokuje ten, kto akurat ma okno nieodpowiadające na rozgłoszenie.

Zabezpieczenie, którego Microsoft już nie obsługuje

Instalacja przeszła, ale gra nie ruszyła. I tu czekała druga niespodzianka, tym razem taka, której nie da się obejść ustawieniami.

Płyta ma zabezpieczenie SafeDisc. Działa to tak, że plik wykonywalny gry na dysku to tylko mały program ładujący, u mnie 249 119 bajtów. Prawdziwa gra siedzi obok, zaszyfrowana, w pliku z rozszerzeniem ICD. Do rozszyfrowania potrzebny jest sterownik systemowy o nazwie secdrv.sys.

Microsoft usunął ten sterownik z Windows. Nie wyłączył, nie oznaczył jako przestarzały. Usunął, bo okazał się luką pozwalającą podnieść uprawnienia w systemie. Od Windows 10 po prostu go nie ma, a bez niego żadna gra z SafeDisc nie wystartuje.

Rozwiązaniem okazała się oficjalna łatka 3.5 wydana przez EA. Nie dość, że podnosi grę z wersji 3.2, to zawiera opcję uruchamiania bez płyty i podmienia plik wykonywalny na pełny, o rozmiarze 2 129 965 bajtów. Łatka instaluje się bez problemów, bo jest zwykłym archiwum samorozpakowującym, a nie InstallShieldem, więc feralnego rozgłoszenia nie robi.

Czarny ekran przy działającym dźwięku

Gra wystartowała. Poszły dwa filmy wstępne, pojawił się ekran powitalny i obraz zamarł. Ale słychać było muzykę. Co gorsza, słychać było dźwięki podświetlania przycisków, kiedy ruszałem myszą po niewidocznym menu.

Gra działała. Nie rysowała.

Winowajcę znalazłem w rejestrze, w gałęzi z ustawieniami zgodności. Windows sam, bez pytania, przypisał grze łatkę o nazwie DWM8And16BitMitigation. Robi to automatycznie, gdy wykryje program używający szesnastobitowego trybu koloru, a ta gra właśnie taki wybiera. Łatka przepuszcza wyświetlanie klatek przez menedżer okien pulpitu i w trybie pełnoekranowym potrafi to skończyć się zamrożonym obrazem. Gra dalej renderuje, tylko wynik nigdy nie trafia na ekran.

Usunąłem wpis. Windows dopisał go z powrotem, zanim zdążyłem przetestować.

Do tego doszła moja własna konfiguracja: trzy monitory, przez pewien czas na dwóch kartach graficznych naraz. Direct3D w wersji 7, z którego korzysta ta gra, nie przewiduje takiej sytuacji. Potrafi zaalokować powierzchnię do rysowania na jednym układzie, a próbować wyświetlić na drugim.

Kod 141, czyli sterownik podnosi ręce

Na drugim komputerze objawy były inne i dopiero one doprowadziły do sedna. Tam gra po trzech sekundach czarnego ekranu wylatywała na pulpit.

W dzienniku zdarzeń, sekundę przed wpisem o awarii aplikacji, siedziało coś istotniejszego:

11:33:34  LiveKernelEvent   P1: 141
11:33:35  APPCRASH          P1: Porsche.exe

Kod 141 to VIDEO_ENGINE_TIMEOUT_DETECTED. Sterownik graficzny przestał odpowiadać, Windows go ubił i uruchomił od nowa. Gra zginęła sekundę później, bo zniknął jej spod nóg cały kontekst rysowania.

To zmienia całą diagnozę. Awarii nie ulega gra, tylko sterownik. Żaden tryb zgodności ani łatka systemowa tego nie tknie, bo problem jest piętro niżej.

Co pomogło

Lekarstwem okazał się dgVoodoo 2. To nakładka, która podszywa się pod stare biblioteki graficzne Windows i tłumaczy wywołania Direct3D 7 na współczesne Direct3D 11. Sterownik nigdy nie dostaje poleceń, na których się wykłada, bo w ogóle do niego nie docierają.

Pobiera się go ze strony autora albo z repozytorium na GitHubie. Z archiwum potrzebne są dwa pliki z katalogu MS\x86, czyli DDraw.dll i D3DImm.dll, plus dgVoodoo.conf i konfigurator. Wszystko cztery trafia prosto do katalogu z grą.

Samo skopiowanie nie wystarczyło. W pliku konfiguracyjnym trzeba zmienić kilka rzeczy: FullScreenMode na false, żeby gra chodziła w oknie i nie walczyła o wyłączny dostęp do ekranu, oraz AppControlledScreenMode na false, żeby o trybie decydowała nakładka, a nie gra.

Ale zwycięskie ustawienie było jedno i wcale nie oczywiste. Domyślnie dgVoodoo wybiera najlepszą dostępną ścieżkę renderowania. Na starym układzie Intela właśnie ta „najlepsza” wywalała sterownik. Wymuszenie niższego poziomu funkcji rozwiązało sprawę:

OutputAPI = d3d11_fl10_0

Po tej zmianie gra ruszyła. Menu, profil, wybór kierowcy, wszystko.

Gdyby i to zawiodło, zostawała opcja d3d11warp, czyli rysowanie na procesorze z całkowitym pominięciem karty. Wolne, ale przy grze z 2000 roku współczesny procesor sobie radzi, a sterownik nie ma wtedy jak się zawiesić, bo nie bierze udziału.

Dwie pułapki na koniec

Na jednym z komputerów nie dało się uruchomić instalatora, bo blokował go AnyDesk, przez który miałem jedyny dostęp do maszyny. Ubicie go odcięłoby mi połączenie. Okazało się, że instalator jest zbędny: archiwum data1.cab ma 469 bajtów, a wszystkie dane gry leżą na płycie luzem. Instalator tylko kopiuje pliki i dopisuje kilkanaście wartości do rejestru. Zrobiłem to sam poleceniem robocopy i ręcznymi wpisami.

Wtedy gra przywitała mnie komunikatem „You have DirectX 0. Please install DirectX 7″. Brakowało jej pliku dx7z.dll, czyli własnego modułu rysującego. Nie ma go tam, gdzie sugeruje nazwa katalogu. Leży w setup\thrash, wewnątrz folderu instalatora, który wykluczyłem przy kopiowaniu. Instalator normalnie przenosi go do podkatalogu Drivers.

I rzecz, która kosztowała mnie osobną rundę zgadywania. Ta gra odwołuje się do swoich plików ścieżkami względnymi. Uruchomiona z innego katalogu niż własny szuka ich w złym miejscu i zgłasza dokładnie ten sam błąd o DirectX, mimo że wszystko jest na dysku. Trzeba ją odpalać z jej folderu albo skrótem, który ma ustawione pole „Rozpocznij w”.

Skrót dla niecierpliwych

Jeśli trafiłeś tu z konkretnym objawem, oto mapa. Instalator startuje i nie pokazuje okna: sprawdź łańcuch oczekiwania w Menedżerze zadań i zamknij proces, który blokuje. Gra nie startuje albo pyta o płytę: zainstaluj łatkę 3.5 z opcją uruchamiania bez CD. Obraz zamarza lub jest czarny przy działającym dźwięku: dgVoodoo 2 w trybie okienkowym. W dzienniku zdarzeń widnieje LiveKernelEvent 141: to sterownik, ustaw OutputAPI = d3d11_fl10_0, a jak nie pomoże, d3d11warp.

Cała zabawa zajęła mi kilka godzin zamiast dziesięciu minut. Ale gra chodzi na obu komputerach i miło było wrócić do gry z dzieciństwa.


Chcesz wesprzeć?

Jeśli ten wpis Ci się przydał, możesz postawić mi kawę albo wesprzeć przez PayPal. To pomaga mi tworzyć kolejne materiały:

https://suppi.pl/gpietrzak
💳 https://paypal.me/gpietrzak
📺 Subskrybuj: https://www.youtube.com/@NieCodziennyMajsterkuje

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *