IPB

Добро пожаловать, гость ( Вход | Регистрация )

> RTPatch 8.0, Отображение кириллицы и пр.
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 -- буду признателен.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
 
Reply to this topicStart new topic
Ответов
-=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, но, честно сказать, я в такие дебри не углублялся, но, на всякий случай, будьте готовы и к таким возможным поворотам событий.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Сообщения в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0 -

 



Упрощённая версия Сейчас: 21st July 2026 - 16:00