Добро пожаловать, гость ( Вход | Регистрация )
| Siberian GRemlin |
Jul 12 2008, 16:57
Сообщение
#1
|
|
Advanced Member ![]() ![]() ![]() Группа: CTPAX-X Сообщений: 538 Регистрация: 4-February 08 Пользователь №: 2 Спасибо сказали: 223 раз(а) |
1. Думаю все знакомы с данной продукцией -- сталкивались с обновлениями для некоторых игр, созданных с помощью данной программы. Я тоже ей пользуюсь в тех же целях (в этом есть крайняя необходимость и посему советовать другое ПО не стоит). Проблема в том, что если написать текст приветствия (выводится при запуске откомпилированного обновления) на русском, то по-русски там ничего не будет, а будут "крякозябры". Посоветуйте, как побороть данный недуг и заставить программу выводить текст на русском. Если необходимо -- выложу примеры.
2. В дистрибутиве также идёт пример на сях и дельфях с использованием patchw32.dll т.е. как в свою прогу добавить поддержку обновления файлов из файло-обновления [.RTP], но что-то либо я переучился, либо одно из двух, но я не могу разобраться... P.S.: Если знаете где взять версию свежее 8.0 -- буду признателен. |
![]() ![]() |
| -=CHE@TER=- |
Jun 30 2026, 18:56
Сообщение
#2
|
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,449 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 332 раз(а) |
Подниму ещё одну тему почти 18 лет спустя.
Тут, короче, товарищ Corvin попросил помочь с установкой "eduke20.exe" - какое-то обновление для Duke Nukem 3D Atomic v1.5 вышедшее, страшно подумать, аж 25 лет назад. Шутка юмора была в том, что оно использовало RTPatch. Понятно, что нашей программой RTPatchX исправление можно было поставить насильно, но мне стало интересно, что нужно для его установки. А нужны были два оригинальных файла от v1.5 игры: "COMMIT.EXE" и "DUKE3D.EXE". Взял я эти файлы, закинул, а оно всё равно не обновляет. Как написал товарищ Corvin, там ещё нужно было специальное время у файлов и у него даже есть программа, которая, вроде бы как, должна была это время ставить, но ничего не помогало. Ну, то есть, время ставится, но патч по-прежнему не хочет вставать. Посмотрел я те исходные коды программы, которая должна была время правильное ставить, а там такое: CODE program katpatch; uses windows,dialogs; var time : tfiletime; handle : integer; path : string; {$R *.RES} {$O-} begin time.dwlowdatetime:=-775631872; time.dwhighdatetime:=29091681; path := inputbox('kill a ton eduke patch','enter the path of the kill a ton atomic dir to patch','c:\dukeatom'); if length(path) = 0 then halt; if path[length(path)]<>'\' then path := path + '\'; handle := createfile(pchar(path+'duke3d.exe'),generic_read+generic_write,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,0); setfiletime(handle,@time,@time,@time); closehandle(handle); handle := createfile(pchar(path+'commit.exe'),generic_read+generic_write,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,0); setfiletime(handle,@time,@time,@time); closehandle(handle); end. Вы уже видите, сколько тут проблем, да? Во-первых, под Delphi 7 у меня это не собралось, потому что dwLowDateTime это DWORD, а оно не может быть отрицательным. Но это фигня - я обе константы на их шестнадцатеричное представление заменил. Во-вторых, это всё равно поставить исправление не помогало. А знаете почему? Пока что подумайте, а я буду дальше описывать что делал. В общем, пришлось мне сделать программу для перебора времени, где я менял дату и время у файлов, затем пытался поставить патч и смотрел вернула ли мне RTPatchApply32() ноль (нет ошибок). Найдя нужное время я сравнил его вот с этим и увидел, что оно отличается. Уже догадались почему? Потому что время FILETIME - это время по Гринвичу (GMT/UTC). А RTPatch, оказывается, смотрит ЛОКАЛЬНОЕ ВРЕМЯ компьютера без учёта часовых поясов! То есть у автора этой программы, я уверен, всё работало, а вот чтобы оно работало у других нужно было ставить тот же часовой пояс (пойди догадайся какой). Потом я проверил под дизассемблером код "PATCHW32.DLL" и увидел там как работать с датой и временем файлов. Так что исправленный код теперь выглядел вот так: CODE t : FILETIME; ... DosDateTimeToFileTime($218B, $6E40, t); { v0.3: 1996-12-11 13:50:00 } LocalFileTimeToFileTime(t, time); { v0.3: RTPatch checks for local file time! } Где $218B - упакованная DOS дата, а $6E40 - упакованное DOS время файла. С этим разобрались, но на будущее я решил посмотреть, где в файле это время хранится, чтобы не перебирать, а сразу можно было нужное взять. Сделал просмотр и поиск "COMMIT.EXE" (непечатные символы заменены на "#"): CODE 43 4F 4D 4D 49 54 2E 45 | 58 45 00 00 00 00 00 00 | COMMIT.EXE###### 0A 2B 01 00 8B 21 40 6E | 0F 18 C9 F9 D3 3E 76 AE | #+###!@n####L>v# Первые 4 байта во второй строке - это размер файла "COMMIT.EXE" ($00012B0A - 76554 байта), а вот сразу за ним упакованные DOS дата (0x218B) и время (0x6E40). eduke20.exe - это Win32 приложение RTPatch, но почему оно хранит время в упакованном DOS формате? Потому что первоначально RTPatch выходил под DOS и, видимо, в 1999 году (время сборки этой версии RTPatch для Windows) дату и время оставили в том же формате для совместимости (в DOS не было часовых поясов и время было только локальным). В современном же Windows, когда ты копируешь файл с CD, то время считается как UTC/GMT. Отсюда и несовпадение (я уж молчу про оригинальный DOSBox (не сторонние сборки), который, вообще, время не умеет устанавливать у файлов). Возможно, в более поздних версиях RTPatch, таки добавили время по UTC/GMT, но, честно сказать, я в такие дебри не углублялся, но, на всякий случай, будьте готовы и к таким возможным поворотам событий. |
Siberian GRemlin RTPatch 8.0 Jul 12 2008, 16:57
-=CHE@TER=- Siberian GRemlin!
В программе ни разу не созда... Jul 12 2008, 17:10
Siberian GRemlin Разобрался я как работать с patchw32.dll и даже по... Jul 25 2008, 12:45
-=CHE@TER=- Ох... разбираться в этом.
Навскидку - вместо PChar... Jul 25 2008, 14:41
Siberian GRemlin Не помогло, к сожалению. Jul 26 2008, 13:04
-=CHE@TER=- Слушай, а в RTPatchApply32 не указывается каталог ... Jul 27 2008, 05:23![]() ![]() |
| Упрощённая версия | Сейчас: 21st July 2026 - 16:00 |