-=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
Собственно, это все. Я думаю, тот, кому надо, поймет.
To seek. To learn. To do. ©