Telegram Group & Telegram Channel
Прочитал про раскопки одного из самых странных багов в истории видеоигр – исчезновение гидроплана из GTA San Andreas после… обновления Windows 11 24H2? Как обновление винды смогло что-то поломать в игре двадцатилетней давности? Почему именно исчезающий гидроплан? На самом деле, это история про категории, самоисправление систем и строгость с любопытными перспективами.

Автор популярного семейства патчей для серии GTA – SilentPatch – примерно с октября 2024 года начал получать на гитхабе жалобы на “исчезнувший гидроплан” Skimmer. Исчез он только в San Andreas, вне зависимости от того, модфицировали игру или нет. Из исходных данных в анамнезе был только один общий факт – гидроплан всегда пропадал после установки обновления 24H2. Причем транспорт нельзя было заспавнить даже с помощью скриптов – скрипт срабатывает, но гидроплана не видно.

Тогда Silent использовал скрипт, чтобы заспавнить гидроплан и сразу посадить в него аватар игрока. Оказывается, самолет все же появлялся, просто на первом же кадре он взлетал на высоту в 1087 квадриллионов световых лет даже без включения двигателя (выходит, что в каком-то смысле гидроплан даже прокачался).

Silent детально описывает проблему (очень советую прочитать), я постараюсь упростить. Дело в том, что во время создания самолетов игра обращается к данным о размерах передних и задних колес...

Которых у гидроплана нет. И значений переменных под размер колес у гидроплана тоже нет.

В GTA эти параметры не задаются для лодок, и поэтому в Vice City с гидропланами нет проблем – они принадлежат классу лодок, а не самолетов. Но в San Andreas их перенесли именно в класс самолетов, у которых колеса уже должны быть. И если внести новые параметры колес в описание гидроплана ручками, ничего подозрительного в San Andreas не возникает. Но при чем тут Windows 11 и обновление, что именно ломается?

Если кратко, то раньше в игре пустые строки заполнялись автоматически самой игрой, и размер “колес” гидроплана менялся на 0.7. На Win11 24H2 – на невозможные числа: 7.84421263e+33 и 4.54809690e-38.

Проблема частично оказалась в самой Windows – в 24H2 изменилось стэковое пространство, занимаемое функционалом Critical Section Objects. Что это значит? В программном коде есть участки, называемые “критическими секциями” – они не могут быть использованы более чем одним потоком выполнения одновременно; другим потокам нужно подождать разблокировки. Код разблокировки критической секции — функция LeaveCriticalSection — в 24H2 занимает немного больше стэкового пространства.

В случае с San Andreas переменные, которые отвечали за размер колес, не попадали в критическую секцию кода, который спавнил гидроплан. Сам исполнительный файл видел пустоту в параметрах и выставлял значения для колес "по умолчанию", повторяя параметр от транспорта выше по файлу (грузовика Topfun с колесами на 0.7) – поэтому гидроплан спавнился нормально. "Нет данных по колесам гидроплана? Спишем с позиции выше".

Теперь же адреса, где должны быть данные по колесам, дают кучу мусора. Откуда берется мусор? На месте пустых данных "колес" теперь оказывается вызов "разросшейся" функции LeaveCriticalSection — вот и наш "новый размер". Сначала игра грузит объект — наш гидроплан — через функцию LoadVehicleObject, а после исполнения этой функции освобождает пространство для LeaveCriticalSection. Размеры у них схожие, вызов последней не переписывал значения "колес" по соседству. А теперь LeaveCriticalSection занимает больше места и куском влазит в пустоту неопределенных переменных. Этот кусок и превращается в размеры колес — в числа 7.84421263e+33 и 4.54809690e-38. На Xbox этот баг, кстати, тоже был, и Rockstar правили его патчем, "прописыв колеса"; но все компьютерные версии игры полагались на авось.

Полезных выводов из этой истории два. Во-первых, как советует автор, нужно валидировать данные и не надеяться, что ошибки сами исправятся стандартными значениями. Ну а во-вторых, чудо, что игры вообще запускаются.

UPD. На хабре есть перевод на русский.



group-telegram.com/hyperduh/1042
Create:
Last Update:

Прочитал про раскопки одного из самых странных багов в истории видеоигр – исчезновение гидроплана из GTA San Andreas после… обновления Windows 11 24H2? Как обновление винды смогло что-то поломать в игре двадцатилетней давности? Почему именно исчезающий гидроплан? На самом деле, это история про категории, самоисправление систем и строгость с любопытными перспективами.

Автор популярного семейства патчей для серии GTA – SilentPatch – примерно с октября 2024 года начал получать на гитхабе жалобы на “исчезнувший гидроплан” Skimmer. Исчез он только в San Andreas, вне зависимости от того, модфицировали игру или нет. Из исходных данных в анамнезе был только один общий факт – гидроплан всегда пропадал после установки обновления 24H2. Причем транспорт нельзя было заспавнить даже с помощью скриптов – скрипт срабатывает, но гидроплана не видно.

Тогда Silent использовал скрипт, чтобы заспавнить гидроплан и сразу посадить в него аватар игрока. Оказывается, самолет все же появлялся, просто на первом же кадре он взлетал на высоту в 1087 квадриллионов световых лет даже без включения двигателя (выходит, что в каком-то смысле гидроплан даже прокачался).

Silent детально описывает проблему (очень советую прочитать), я постараюсь упростить. Дело в том, что во время создания самолетов игра обращается к данным о размерах передних и задних колес...

Которых у гидроплана нет. И значений переменных под размер колес у гидроплана тоже нет.

В GTA эти параметры не задаются для лодок, и поэтому в Vice City с гидропланами нет проблем – они принадлежат классу лодок, а не самолетов. Но в San Andreas их перенесли именно в класс самолетов, у которых колеса уже должны быть. И если внести новые параметры колес в описание гидроплана ручками, ничего подозрительного в San Andreas не возникает. Но при чем тут Windows 11 и обновление, что именно ломается?

Если кратко, то раньше в игре пустые строки заполнялись автоматически самой игрой, и размер “колес” гидроплана менялся на 0.7. На Win11 24H2 – на невозможные числа: 7.84421263e+33 и 4.54809690e-38.

Проблема частично оказалась в самой Windows – в 24H2 изменилось стэковое пространство, занимаемое функционалом Critical Section Objects. Что это значит? В программном коде есть участки, называемые “критическими секциями” – они не могут быть использованы более чем одним потоком выполнения одновременно; другим потокам нужно подождать разблокировки. Код разблокировки критической секции — функция LeaveCriticalSection — в 24H2 занимает немного больше стэкового пространства.

В случае с San Andreas переменные, которые отвечали за размер колес, не попадали в критическую секцию кода, который спавнил гидроплан. Сам исполнительный файл видел пустоту в параметрах и выставлял значения для колес "по умолчанию", повторяя параметр от транспорта выше по файлу (грузовика Topfun с колесами на 0.7) – поэтому гидроплан спавнился нормально. "Нет данных по колесам гидроплана? Спишем с позиции выше".

Теперь же адреса, где должны быть данные по колесам, дают кучу мусора. Откуда берется мусор? На месте пустых данных "колес" теперь оказывается вызов "разросшейся" функции LeaveCriticalSection — вот и наш "новый размер". Сначала игра грузит объект — наш гидроплан — через функцию LoadVehicleObject, а после исполнения этой функции освобождает пространство для LeaveCriticalSection. Размеры у них схожие, вызов последней не переписывал значения "колес" по соседству. А теперь LeaveCriticalSection занимает больше места и куском влазит в пустоту неопределенных переменных. Этот кусок и превращается в размеры колес — в числа 7.84421263e+33 и 4.54809690e-38. На Xbox этот баг, кстати, тоже был, и Rockstar правили его патчем, "прописыв колеса"; но все компьютерные версии игры полагались на авось.

Полезных выводов из этой истории два. Во-первых, как советует автор, нужно валидировать данные и не надеяться, что ошибки сами исправятся стандартными значениями. Ну а во-вторых, чудо, что игры вообще запускаются.

UPD. На хабре есть перевод на русский.

BY Гипермда




Share with your friend now:
group-telegram.com/hyperduh/1042

View MORE
Open in Telegram


Telegram | DID YOU KNOW?

Date: |

The message was not authentic, with the real Zelenskiy soon denying the claim on his official Telegram channel, but the incident highlighted a major problem: disinformation quickly spreads unchecked on the encrypted app. Founder Pavel Durov says tech is meant to set you free Groups are also not fully encrypted, end-to-end. This includes private groups. Private groups cannot be seen by other Telegram users, but Telegram itself can see the groups and all of the communications that you have in them. All of the same risks and warnings about channels can be applied to groups. In the United States, Telegram's lower public profile has helped it mostly avoid high level scrutiny from Congress, but it has not gone unnoticed. What distinguishes the app from competitors is its use of what's known as channels: Public or private feeds of photos and videos that can be set up by one person or an organization. The channels have become popular with on-the-ground journalists, aid workers and Ukrainian President Volodymyr Zelenskyy, who broadcasts on a Telegram channel. The channels can be followed by an unlimited number of people. Unlike Facebook, Twitter and other popular social networks, there is no advertising on Telegram and the flow of information is not driven by an algorithm.
from ye


Telegram Гипермда
FROM American