Активность
- Последний час
-
Итак. Мои предположения (если изменить подход) патч меняет какую-то конкретную функцию по адресу 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, он там будет по умолчанию. На этом спасибо за внимание.
- Сегодня
-
Что я выяснил про 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 типа правок. - БагФИксы (все флаги выбраны по умолчанию). - хотелки и улучшайзеры. Первые это фикс очевидных косяков, вторые, навроде камеры за плечом, хотелки. Т.е. переносить очевидные багфиксы в "хардкод" дело Справедливое по определению. И как вариант, в дальнейшем, связаться с Двемером согласовав с ним этот момент. Дабы МСП учитывало правленный техтДлл и не правило уже поправленное. А еще, сделать свой билд МСП (пока Двемера нету на месте). Нечто подобное, было проделано с МГЕ 19ой версии. А "улучшайзеры" они сами по себе, конечно переносить камеру за плечо прямо в код, не всем будет симпатично.
-
Уважаемые форумчане! Что удалось выяснить на данный момент. 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 я и приступаю, буду смотреть что он вносит или что модифицирует.
-
GChaldon присоединился к сообществу
-
Вот я о том же. Я не буду переносить из MCP такие мелкие фиксы как "широкое меню, фикс карты для TR и т.д."- это мелкие правки, в сравнении будто я переношу мелкую правочку из esp в esm, хотя правочка и так работает идеально. Для сохранения совместимости и универсальности надо перенести более глобальные и общие масштабные фиксы. Начнём с малого с MCP, через MGE (вообще прикрутить рендер DX9-11 нафиг 😄 ) к большему - MWSE.
-
Да, я согласен с вами полностью прогресс не должен вредить совместимости н ив коем случае, но что делать, допустим, с 4гб патчем? MCP находит в заголовке Morrowind.exe (PE header) специальное поле «Характеристики» и вписывает в него флаг 0x0020 (IMAGE_FILE_LARGE_ADDRESS_AWARE), говоря Windows: «Этому приложению можно доверять, позволь ему видеть больше памяти». Таким образом даются 4 ГБ памяти. И всё, это потолок. Но если мы хотим сделать 8 ГБ памяти тем же путём что и MGE XE, только на уровне движка, а не со стороны внешнего органа MGE XE?
-
ИМХО: стоит перенести только те правки то что MCP вносит в text.dll, что бы компенсировать невозможность обычным MCP пропатчить модифицированный text.dll. Остальной функционал MCP лучше оставить застывшим во времени, для совместимости с модами. Многие моды сделаны из рассчета MCP, если фикс будет вносится иным способом не факт что мод корректно заработает. Плюс продвинутые MWSE моды проверяют требуемые компоненты и выдают окно с требованием при запуске игры. Им будет все равно на содержимое text.dll, они проверяют в MCP какие опции установлены пользователем. А еще если мне не изменяет память без установки MCP последние версии толи MGE XE то ли MWSE выдают ошибку с русской версией morrowind.exe, не помню что именно. Так что нужно соблюдать баланс между прогрессом и совместимостью.
-
Загрузил стабильную версию 3.01.1 (сообщения при повышении уровня, буфер консоли гибридный) в раздел плагины, закрепил её файлы в шапке темы. Это будет отправной точкой в дальнейшем совершенствовании, в принципе с ней можно играть. (Она в оригинальном виде, каким сделал его Angel Death). Я уже провел полный рефакторинг файлов/кода. Разместил все по отдельным папкам. Теперь каждый файл .CPP либо .H структурно элегантен, не выполняет один всю работу. А именно console.cpp и helperfunctions.cpp. Приступаю к анализу того, какие правки необходимо перенести из MCP в text.dll на уровень движка. Необходимо не только text.dll вырвать из состояния "застыло во времени" но и правки из MCP.
-
wisefox присоединился к сообществу
- Вчера
-
Доделал MWSE меню управления ключами в angel.ini https://www.fullrest.ru/files/mwse-menyu-dlya-moda-russkiy-vvod-teksta Уже некоторое время хотел сделать проверку ключей top\cel\mrk и выводить предупреждение если отключено, т.к. иногда встречаются пользователи у которых выключено и у них криво работает перевод модов. Только я хотел это к своему модулю данных прикрутить как доп функцию, а тут вышел апдейт text.dll с выбором клавиши и я решил что выбор кнопки 100% нужно автоматизировать для простого игрока внутри морровинда, что бы не нужно было икать сканкоды и вручную вписывать. В результате сделал отдельное меню управления всеми параметрами. Вот как то так вышло.
-
yamizukz присоединился к сообществу
- Последняя неделя
-
Anton_dy присоединился к сообществу
-
И снова здравствуйте форумчане! Спешу вас порадовать тем, что я внёс исправление в расширение консоли (если включена функция EnableConsole=1 в Angel.ini)! Теперь при наличии длинных скриптов text.dll должен вести себя так, как и задумывалось! Коротко о том что было сделано: 1. Безопасность памяти. Увеличен буфер вывода с 1024 до 2048 байт в Con_Printf Заменён опасный sprintf на безопасный strncpy с принудительной нуль-терминацией Добавлена проверка памяти в .dump s команде через IsBadReadPtr 2. Умное управление ресурсами. Гибридная система буферов в GameCommandLine Быстрый стековый буфер 1КБ для обычных команд (как изначально было в статичной версии) Динамический буфер 4КБ для длинных скриптов (автовыделение) 3. Защита от переполнений. _vsnprintf с sizeof() вместо магических чисел Гарантированная нуль-терминация во всех строковых операциях Уменьшен массив argv со 1024 до 64 элементов для безопасности (если будет обрезаться строка, сделаю и его гибким, с изначальным значением 64 и он сможет увеличиваться по мере необходимости). А теперь о каждом действии и подробно: 1. Безопасность памяти (Buffer Overrun в Con_Printf): 2. Самое главное изменение - умная система буферов в GameCommandLine: Изначальная строгая статичная версия: Моя версия - гибкая, при получении текста/длинного скрипта сама выбирает какой буфер выделять для текущей операции: 3. Защита дампа памяти: Было (чтение любой памяти): Стало (проверка доступности): 4. Добавление защиты в сам файл Console.cpp: Прикрепляю новый text.dll c пофикшенной консолью и изменённым исходником консоли. Сохранена кодировка cp1251 (ох как же она мне дорога, кто бы знал....). Все предыдущие фиксы включены в эту версию. ПРОШУ ОБРАТИТЬ ВНИМАНИЕ, Я ДО СИХ ПОР НЕ МЕНЯЛ ВЕРСИЮ (написание версии text.dll) C ВЕРСИИ 3.00! Я ЭТО СДЕЛАЮ КОГДА БУДЕТ ПРОВЕДЕНА ПОЛНАЯ РЕВИЗИЯ ВСЕХ .cpp ИСХОДНИКОВ И ПРОЙДУТ ТЕСТЫ, ТОГДА ВЕРСИЯ СРАЗУ ПЕРЕПРЫГНЕТ С ВЕРСИИ 3.00 ДО версии 3.02! п.с если мне кто-то подскажет как я могу скрывать длинные рулоны сообщений под спойлер, буду премного благодарен. text.dll Console.cpp
-
jovep присоединился к сообществу
-
auduy присоединился к сообществу
-
То что было лицензионным в СССР вовсе не значит лицензионным за бугром. Тогда и музыку тырили в открытую мы у них, они у нас... Ни кто не выставляет иски по этому поводу. Однако после интеграции с зарубежьем в свободном использовании это исчезло. Новые игры типа Обливион или Скайрим не меняют EXE и DLL файлы, а следовательно не нарушают права. Но для продажи игры все равно должно быть разрешение и договоренность с авторами по процентам отчисления с продаж. Без разрешения можно продавать только отдельно русификатор без исходных файлов. Я уверен, что у 1С есть лицензии на продажу CD дисков. Не стало дисков - не стало продаж. Аналогично и для польской версии, но я не верю что за бугром дали добро на изменение игрового движка. В Морке есть поддержка кодовых страниц для языков, но внедрение DLL в исходник является нарушением не авторских прав, а защиты ПО.
-
Ну лично мое мнение, конечно не подтвержденное никакими пруфами что у ру издателей (не только 1с и у других) были права только на распространение дисков, даже если бессрочные, то с выходом дисков из обихода, они просто забили. Делать свой стим не особо выгодно, тем более заново права на цифровое распространение получать. А во всяких стимах\гогах нет ру перевода у старых игр, опять же из за отсутствия прав и исходников перевода, из за того что тогда отдавалось все на откуп местного издателя. А сейчас зарубежным издателям (не только бевезде) просто нафиг не сдалось искать кто там чего в 2002 году издавал в других странах, а если по документам права на сам перевод оставались у издателя еще и выкупать их у него. Вот лично это мое мнение. ну само по себе продажа ключей стим\гог нормально и проблемы где взять игру нет, вот с отсутствием русского перевода, который был на дисках, бедя
-
На скрине кусочек кода МВ, аглицкого. Не от 1с, а именно чисто породного как он есть. Где черным по синему нарисованы "официальные" языки. Что намекает. Другой вопрос, что сама беседка не стала себя обременять переводом (и заморочками с локалями), что для тех времен было нормальной практикой. Еще, на коробке с диском, ясно написано, что сие Лицензионная копия, а этому надо верить. В каких отношения 1с была с Беседкой, тема отдельного научного изыскания. Но учитывая статус 1с, "для перевода игры нужно разрешение" оно у них скорее всего было во всем феншуе, т.к. вкрячивать кусок кода в виде этого самого ДЛЛа, куда проще имея доступ к этому самому коду. Если же, 1с не имела ничего такого, то у беседки было полно времени (аж 20лет) чтобы высказать свое фи, в той, или иной форме. И если не изменяет память, то ни Обливион ни Скурицион, не вызывали у беседки вопросов к локализации. Другой вопрос, что 1с могла не дать разрешение на публикацию ру версию в ГОГЕ, либо оное не смогли "получить". Т.е. называть официально лицензионную копию (от1с))) - пираткой, несовсем корректно. Так проще делать, не? Проще повесить внешний патч, чем копать код, с низвестными последствиями по совместимости с модами и обновлениями. Бладмун это 2003, хотя да, с переводом он вышел едва не в 2005ом, там большая задержка была. А перевод и выход Морровинда в ру версии, осень 2002го. Может отдельную кнопку сделать? 😄 Одна версия, но, по умолчанию все "лишнее" выключено. Для включения, зайти в АнгелИни и что-то там поменять, после чего, Длл будет считывать во всей полноте привнося разумное и доброе и вечное. Они давно на всё положили на 32х. Впрочем, как и беседка на поддержку своих старых активов. А так конечно, теперь в тренде продажа ключей, а где вы возьмете саму игру, уже никого не волнует. 😄 Создание локализации != созданию лекарства от опроса диска и выкладыванию в открытый доступ без взимания налога на желания обрести желаемое.
-
всегда думал что сотни лицушных игр на дисках от 1с\акелла\бука\новый диск пропали с продажи, потому что диски вышли из обихода, а создавать "свой стим" не было денег\желания\целесообразности да лицуха была только на распространение дисков. А оказывается 1с просто всю жизнь пиратили... но вот ровно аккурат к окончанию массового использования данного носителя одумались и решили все больше ни ни. Обливион 1с тоже спиратили? эти диски тоже с продажи пропали и тоже в стиме\гоге не ру языка.
-
Не хочу проверять, но подозреваю что сейчас они просто ключи на стим или гог продают, поэтому и указывают английский язык. Так стоп, вроде по ссылке и нельзя купить, какая то старая карточка товара А раньше вроде как именно русскую версию продавали, я услышал об этом когда продаж уже не было, поэтому не могу сказать достоверно. сборки с модами на бусти никто за лицуху и не считает, изначально речь про диск от 1с шла. 1с же по лицензии диск морки выпускали?