Pirate443 Опубликовано 10 часов назад Жалоба Поделиться Опубликовано 10 часов назад 1 минуту назад, ksteel сказал: Да, я согласен с вами полностью прогресс не должен вредить совместимости н ив коем случае, но что делать, допустим, с 4гб патчем? MCP находит в заголовке Morrowind.exe (PE header) специальное поле «Характеристики» и вписывает в него флаг 0x0020 (IMAGE_FILE_LARGE_ADDRESS_AWARE), говоря Windows: «Этому приложению можно доверять, позволь ему видеть больше памяти». Таким образом даются 4 ГБ памяти. И всё, это потолок. Но если сделать 8 ГБ памяти тем же путём что и MGE XE, только на уровне движка, а не со стороны внешнего органа MGE XE? 4 гб патч не влияет напрямую на работу именно игровой логики, скрипты диалоги квесты работают в не зависимости от объема памяти. Если сможете заставить использовать больше и при этом не вылетать, то да проще дать рекомендацию ру пользователям не отмечать в MCP фикс 4гб. Ссылка на комментарий Поделиться на другие сайты Поделиться
ksteel Опубликовано 10 часов назад Автор Жалоба Поделиться Опубликовано 10 часов назад (изменено) 7 минут назад, Pirate443 сказал: 4 гб патч не влияет напрямую на работу именно игровой логики, скрипты диалоги квесты работают в не зависимости от объема памяти. Если сможете заставить использовать больше и при этом не вылетать, то да проще дать рекомендацию ру пользователям не отмечать в MCP фикс 4гб. Вот я о том же. Я не буду переносить из MCP такие мелкие фиксы как "широкое меню, фикс карты для TR и т.д."- это мелкие правки, в сравнении будто я переношу мелкую правочку из esp в esm, хотя правочка и так работает идеально. Для сохранения совместимости и универсальности надо перенести более глобальные и общие масштабные фиксы. Начнём с малого с MCP, через MGE (вообще прикрутить рендер DX9-11 нафиг 😄 ) к большему - MWSE. Изменено 10 часов назад пользователем ksteel Ссылка на комментарий Поделиться на другие сайты Поделиться
Pirate443 Опубликовано 10 часов назад Жалоба Поделиться Опубликовано 10 часов назад 7 минут назад, ksteel сказал: Начнём с малого с MCP, через MGE (вообще прикрутить рендер DX9-11 нафиг 😄 ) к большему - MWSE. Ну тогда лучше всего начинать с фиксов которые mcp вносит в text.dll, что бы модифицированный файл в полной мере заменял предыдущее решение, а не ставил пользователя перед выбором или или. Ссылка на комментарий Поделиться на другие сайты Поделиться
ksteel Опубликовано 10 часов назад Автор Жалоба Поделиться Опубликовано 10 часов назад 10 минут назад, Pirate443 сказал: Ну тогда лучше всего начинать с фиксов которые mcp вносит в text.dll, что бы модифицированный файл в полной мере заменял предыдущее решение, а не ставил пользователя перед выбором или или. Этим я сейчас и занимаюсь =) Ссылка на комментарий Поделиться на другие сайты Поделиться
ksteel Опубликовано 6 часов назад Автор Жалоба Поделиться Опубликовано 6 часов назад (изменено) Уважаемые форумчане! Что удалось выяснить на данный момент. MCP устанавливает патч в 2 этапа: 1. MCP сверяет ХЭШ Morrowind.exe, таким образом выбирается версия игры (хэш оригинальной русской версии от 1с ecb347304134f63cabf1ab38f0728dcff5fbfb11e7ac2b87a03c8639936ab094), в этой папке и лежит файл patch для .exe, а также 3 папки, в каждой их которых лежат патчи для 3‑х версий text.dll: оригинальная 48 кб, от Angel Death v.3.01 170 кб и ещё непонятная какая-то версия text.dll, которую, скорее всего, в жизни никто не видел или не использовал). 2. MCP сверяет ХЭШ text.dll, таким образом он внутри папки ecb347304134f63cabf1ab38f0728dcff5fbfb11e7ac2b87a03c8639936ab094 находит вторую папку e8503809bad3d088b367cffe85b13965565c4655f457919db18cdefe76edbad8, в названии которой установлен ХЭШ text.dll, откуда он берёт свои патчи для этой text.dll). 3. Я сравнил все 3 версии патча для разных версий text.dll (смотрел через HEX редактор Visual Studio Code): нашу общеиспользуемую: e8503809bad3d088b367cffe85b13965565c4655f457919db18cdefe76edbad8 первую отличную от нашей общеиспользуемой: 23c36ef153f5b183fc13d06ef339d9356c0da6b30a90aa7359baedce2135f036 вторую отличную от нашей общеиспользуемой: f027a20356e788cf1a48d6f89f8b11eb61b34dda2fecb6fab59a74e3dae3f83a Как вы сами можете увидеть, две другие версии вносят: а) немного другие правки в сам text.dll б) вносят больше правок в text.dll, что намекает о старых версиях text.dll (скорее всего версии 3.00 и ниже). Вывод: т.к. версия text.dll 3.01 не менялась внутренне структурно (что мы также выяснили в этой теме), то патч из вышеуказанной папки e8503809bad3d088b367cffe85b13965565c4655f457919db18cdefe76edbad8 как раз и влияет на text.dll. Собственно к анализу этого патча от MCP я и приступаю, буду смотреть что он вносит или что модифицирует. Изменено 6 часов назад пользователем ksteel Ссылка на комментарий Поделиться на другие сайты Поделиться
EJ-12 Опубликовано 6 часов назад Жалоба Поделиться Опубликовано 6 часов назад Цитата Многие моды сделаны из рассчета MCP, если фикс будет вносится иным способом не факт что мод корректно заработает. В мсп есть 2 типа правок. - БагФИксы (все флаги выбраны по умолчанию). - хотелки и улучшайзеры. Первые это фикс очевидных косяков, вторые, навроде камеры за плечом, хотелки. Т.е. переносить очевидные багфиксы в "хардкод" дело Справедливое по определению. И как вариант, в дальнейшем, связаться с Двемером согласовав с ним этот момент. Дабы МСП учитывало правленный техтДлл и не правило уже поправленное. А еще, сделать свой билд МСП (пока Двемера нету на месте). Нечто подобное, было проделано с МГЕ 19ой версии. А "улучшайзеры" они сами по себе, конечно переносить камеру за плечо прямо в код, не всем будет симпатично. Ссылка на комментарий Поделиться на другие сайты Поделиться
ksteel Опубликовано 2 часа назад Автор Жалоба Поделиться Опубликовано 2 часа назад (изменено) 4 часа назад, ksteel сказал: Уважаемые форумчане! Что удалось выяснить на данный момент. MCP устанавливает патч в 2 этапа: 1. MCP сверяет ХЭШ Morrowind.exe, таким образом выбирается версия игры (хэш оригинальной русской версии от 1с ecb347304134f63cabf1ab38f0728dcff5fbfb11e7ac2b87a03c8639936ab094), в этой папке и лежит файл patch для .exe, а также 3 папки, в каждой их которых лежат патчи для 3‑х версий text.dll: оригинальная 48 кб, от Angel Death v.3.01 170 кб и ещё непонятная какая-то версия text.dll, которую, скорее всего, в жизни никто не видел или не использовал). 2. MCP сверяет ХЭШ text.dll, таким образом он внутри папки ecb347304134f63cabf1ab38f0728dcff5fbfb11e7ac2b87a03c8639936ab094 находит вторую папку e8503809bad3d088b367cffe85b13965565c4655f457919db18cdefe76edbad8, в названии которой установлен ХЭШ text.dll, откуда он берёт свои патчи для этой text.dll). 3. Я сравнил все 3 версии патча для разных версий text.dll (смотрел через HEX редактор Visual Studio Code): нашу общеиспользуемую: e8503809bad3d088b367cffe85b13965565c4655f457919db18cdefe76edbad8 первую отличную от нашей общеиспользуемой: 23c36ef153f5b183fc13d06ef339d9356c0da6b30a90aa7359baedce2135f036 вторую отличную от нашей общеиспользуемой: f027a20356e788cf1a48d6f89f8b11eb61b34dda2fecb6fab59a74e3dae3f83a Как вы сами можете увидеть, две другие версии вносят: а) немного другие правки в сам text.dll б) вносят больше правок в text.dll, что намекает о старых версиях text.dll (скорее всего версии 3.00 и ниже). Вывод: т.к. версия text.dll 3.01 не менялась внутренне структурно (что мы также выяснили в этой теме), то патч из вышеуказанной папки e8503809bad3d088b367cffe85b13965565c4655f457919db18cdefe76edbad8 как раз и влияет на text.dll. Собственно к анализу этого патча от MCP я и приступаю, буду смотреть что он вносит или что модифицирует. Что я выяснил про MCP: MCP меняет системные переменные CRT: __commode - режим ввода/вывода __fmode - режим работы с файлами __umaskval - маска прав доступа Пока мой Text.dll разрабатывается, его хэш постоянно меняется. Если разрешить MCP патчить мой text.dll (у которого уже съехали все байты в сторону от преобразования), то MCP попросту сломает text.dll. Что это может вызвать? а) проблемы с кодировками б) сшибки ввода/вывода в) в целом разные странности с файловыми операциями Я хочу узнать : для чего MCP патчит text.dll? Далее либо я сам внесу правки в text.dll, либо добавлю совместимость с МСР, посмотрю какой вариант будет универсальнее (учитывая темпы разработки, лучше конечно самому сделать то что хочет сделать МСР, тем не менее MCP патчит нормально Morrowind.exe). У dll до патчинга и после патчинга (как показал Hex Workshop Hex Editor) Идеальные не тронутые внутренности. Они светятся оба зелёным и различий нет (проверено на обеих версиях отсюда https://www.fullrest.ru/files/russian_text_input/files😞 НО хэш меняется: Что это за магия ВНЕ Хогвартса, я пока НЕ понимаю. Но судя по байтам из патча MCP он ставит на text.dll какую-то заглушку. Изменено 2 часа назад пользователем ksteel Ссылка на комментарий Поделиться на другие сайты Поделиться
Марк К. Марцелл Опубликовано 1 час назад Жалоба Поделиться Опубликовано 1 час назад Хм. Ёж, а Хрнчамд совсем пропал с радаров? Или его можно выцепить в личке где-нибудь в Дискорде? Ссылка на комментарий Поделиться на другие сайты Поделиться
ksteel Опубликовано 58 минут назад Автор Жалоба Поделиться Опубликовано 58 минут назад Итак. Мои предположения (если изменить подход) патч меняет какую-то конкретную функцию по адресу 0x0C90 - заменяет её на заглушку B8 AF 88 56 38 C3: 1. Предположение № 1: При рассмотрении text.map 0x0C90 я не нашёл. Значит 0х0С90 находится между функциями: "0x0c60 - ??0bad_array_new_length@std@@QAE@ABV01@@Z" и "0x0ca0 - ??0bad_array_new_length@std@@QAE@XZ" Я прихожу к выводу, что это внутренняя, скрытая функция C++ рантайма и MCP меняет внутреннюю логику C++ рантайма, а не игровые функции, это системный патч для совместимости со старым движком Morrowind (возможно) с моим text.dll морровинд запускается, MCP патчит экзешник. Проще говоря в рантайме Morrowind вызывает эту внутреннюю функцию C++ после чего MCP заглушает её, чтобы изменить поведение при ошибках памяти. А учитывая проделанный мною рефакторинг - все изначальные возможные переполнения я уже убрал, когда фиксил overload консоли. О чём расскажу в п.2 ниже. 2. Предположение № 2 (более сложное): Если посмотреть с третьей стороны 0x0C90 в text.map я не нашёл, значит она может попасть МЕЖДУ соседними функциями, смотрим text.map: Что это такое? Это тот же самый DialogEngine.cpp который просто из глиняного сырого кирпичика превратился в обожженный кирпич для стройки всего text.dll. Цель: ??0bad_array_new_length@std@@QAE@XZ Расшифровка (Demangled Name): public: __thiscall std::bad_array_new_length::bad_array_new_length(void) Конструктор по умолчанию для исключения std::bad_array_new_length А теперь по русски: в этом случае патч так-же не бьёт по игровой логике. Он вмешивается в запросы Morrowind.exe к рантайму C++. Так что это за функция? std::bad_array_new_length — это исключение, которое выбрасывается, когда программа пытается выделить массив недопустимого (например, отрицательного или слишком большого) размера. Что делает MCP патч? Как я установил ранее, патч заменяет начало этой функции на команду "немедленно вернуться". Он предотвращает создание и выброс исключения. Вывод: это очень грубый, но по-своему эффективный способ борьбы с определённым типом критических ошибок. Вместо того чтобы исправлять причину, по которой программа пытается создать массив неверного размера, этот патч просто затыкает ей рот в тот момент, когда она пытается сообщить об ошибке и хочет вылететь. А теперь конкретика ядро той самой нестабильности, тот самый пациент DialogEngine.cpp. В нём была одна такая весёленькая функция под названием void InitFileLists( )И выглядела она вот так: Спойлер Вот как эта, казалось бы, простая конструкция превращается в бомбу замедленного действия, способную вызвать то самое исключение std::bad_array_new_length: Бесконечный цикл: Цикл for ( int i = 0;; i++ ) — это вечный двигатель. Он будет работать до тех пор, пока его принудительно не остановят. Слепое доверие: Остановка происходит, когда функция GetPrivateProfileString не находит в Morrowind.ini очередной ключ (GameFile0, GameFile1, GameFile5,... GameFileN) и возвращает 0. Код полностью доверяет тому, что файл Morrowind.ini корректен и что эта последовательность когда-нибудь прервётся и будет чёткой НЕ НАРУШЕННОЙ. Сценарий катастрофы: А теперь представьте, что Morrowind.ini повреждён: другой мод, или сам пользователь по ошибке добавил туда запись вида GameFile214742=some_file.esp, следом сразу(а лучше ещё через 15 пустых строк) GameFile2147483647=some_file.esp. (знаю, что число модов ограничено, это я утрирую). Цикл будет послушно перебирать миллионы и миллиарды несуществующих ключей, прежде чем дойдёт до этого аномально высокого номера. Счётчик i (целое 32-битное число) в какой-то момент достигнет своего предела (2,147,483,647) и переполнится, обернувшись в отрицательное число (-2,147,483,648). Цикл не остановится! Он продолжит работать, теперь уже в отрицательном диапазоне. 4. Взрыв вектора: В это время gamefilelist.push_back( fname ) продолжает добавлять элементы. Вектор gamefilelist будет постоянно расти, требуя всё больше и больше памяти. При каждом удвоении своего размера он вычисляет новую ёмкость. В условиях, когда счётчик i ведёт себя непредсказуемо, внутренние механизмы вектора могут попытаться вычислить новый размер, который окажется недопустимо огромным или отрицательным. Именно в этот момент и происходит фатальный сбой: система пытается создать массив невозможного размера и выбрасывает исключение std::bad_array_new_length, приводя к немедленному вылету игры. Но хватит страшных сказок, хочу вас успокоить, в версии 3.01.1 я уже исправил этот недочёт, ещё на момент когда фиксил консоль от переполнения буфера. Вот как выглядит DialogEngine.cpp: Спойлер Всё ясно, понятно и главное безопасно. НО это всего лишь моё предположение № 2 про то что патчит MCP в text.dll. В любом случае MCP пропустит мой dll и не навредит ему, т.к. данный ХЭШ ему НЕ ИЗВЕСТЕН. Модификации text.dll будут работать, игра будет работать. П.с. если я пойму логику фикса и он НЕ БУДЕТ избыточным - я её добавлю в text.dll, он там будет по умолчанию. На этом спасибо за внимание. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти