ОК, флаг принял.-=RIP=-
Флаг передам Arsunt-у, как куда более грамотному в этом.
Начну с общей теоретической части, которая будет понятна более-менее всем. Игра обращается к CD-диску, как к любой другой папке или любому другому диску; есть только один простой нюанс - обращение происходит по форме "A:\", где "A" - буква CD-диска ("D", "E", "F"... без разницы). Буквы дисков игра последовательно перебирает и проверяет, начиная с "A".
Отсюда делаем выводы:
1) Форму обращения к диску необходимо переправить с "A:\" на ".\", т.е. заставить игру искать файлы в текущей папке, а не на диске.
2) Игра проверяет, является ли выбранный диск CD-диском, поэтому эту проверку имеет смысл отменить.
3) Игра перебирает буквы начиная с "A" и заканчивая последним символом символьной таблицы ANSI. Нужно, отменить подобный перебор, иначе вместо запроса на папку ".\" мы рискуем получить запросы на папки "/\", "0\", "1\", "2\" и т.д. (в порядке следования по символьной таблице ANSI). Так и случилось на компьютере Andariel, потому что изначально мы забыли исправить этот пункт (фактически все наши предшественники забыли исправить его). Я подозреваю этот пункт выходит боком только при отсутствии floppy-привода, хотя я не уверен точно.
Теперь более-менее подробная техническая часть с конкретными указаниями. В секции данных .data по виртуальным адресам 0x0046CFA0, 0x0046CFA8, 0x0046CFAC наличествуют следующие ANSI-строки:
%c:\%s A:\ D:\data\legal.pcxИх мы правим соответственно на:
%c\%s .\ .\data\legal.pcxВ секции кода .text необходимо переписать инструкцию, которая пишет символ 'A' (код 0x41) по виртуальному адресу 0x004E2838 откуда в последствии читается сие символ для броска в вышеописанный текстовой формат %c\%s
:0044D03A C60538284E0041 mov ptr[004e2838],41Короче, меняем его на "точку" (код 0x2E)
:0044D03A C60538284E002E mov ptr[004e2838],2EНужно так же заNOPить две ближние к ней инструкции: первая - та, что перескакивает не туда, куда надо (то бишь проверка на наличие CD)
:0044D06F 7528 jne 0044D099
:0044D06F 90 nop :0044D070 90 nopА вторая, та что пишет по вышеназванному адресу некий символ, код которого инкрементирован до величины счетчика цикла (в оригинале это был байт 'A', как имя диска. Но инкремент нашего байта '.' ни к чему хорошему не приведет, как упоминалось выше). В общем ее тоже NOPим.
:0044D0A3 880D38284E00 mov [004E2838],cl
:0044D0A3 90 nop :0044D0A4 90 nop :0044D0A5 90 nop :0044D0A6 90 nop :0044D0A7 90 nop :0044D0A8 90 nop
Собственно, это все. Я думаю, тот, кому надо, поймет.