#76 30-07-2007 15:49

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Адреса и функции gta_sa.exe 1.0

Спасибо, я обязательно добавлю эти функции в общий список.

Проверил функцию 7451D0   psErrorMessage - работает smile
t975673_testmsg.jpg

Чем ps-функция отличается от rs? (619AF0   RsGrabScreen, 7452B0   psGrabScreen)

если нужно, могу выложить исходники этого скелетного приложения

выкладывай wink

Offline

#77 30-07-2007 23:16

AleX AciD
From: RU-VLG
Registered: 27-02-2007
Posts: 36
Website

Re: Адреса и функции gta_sa.exe 1.0

Seemann wrote:

Чем ps-функция отличается от rs? (619AF0   RsGrabScreen, 7452B0   psGrabScreen)

Большинство Rs функций являются переходниками на ps функции.
Как я понимаю, Rs - платформонезависимый код, ps - платформозависимый код.

Seemann wrote:

выкладывай wink

Скелетное (каркасное) приложение из состава RWG SDK 3.7 Скачать

Код в исходниках и в exe-шнике может различаться:
- из-за различий в версиях (3.7 / 3.6)
- из-за изменений, внесенных Рокстаровцами.:rolleyes:

Эх, жаль нет полных исходников RWSDK, тогда восстановить код от Рокстара было бы намного легче...:/


[large][acronym=Завтра, завтра, постоянно завтра, так проходит жизнь]Cras, cras, semper cras, sic evadit aetas[/acronym][/large]

Offline

#78 02-08-2007 13:01

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Адреса и функции gta_sa.exe 1.0

2AleX AciD:

PS: в базе RwEngineInstance и RwGlobals представлены как две разных структуры, на самом деле RwEngineInstance это указатель на структуру типа RwGlobals

Есть такое дело. Надо будет поправить при очередной чистке.
Если же стремиться к абсолютной точности: RwEngineInstance указывает на структуру, первым (и, обычно, единственным) элементом которой является структура типа RwGlobals.

Вообще, покопать skeleton - было здравой идеей. Я, в свое время, просто взял оттуда минимум и забил (вернее, отложил до лучших времен). В exe-шнике еще много нерасписанного библиотечного кода (libjpeg, libpng, STL и т.д.). Кое-что полезное, можно нарыть из примеров (например, чтобы понять смысл одной из констант, пришлось изрядно покопаться в примерах).

Что касается исходников RWSDK - да, это была бы полезная вещь, но и без них обойтись достаточно легко. Все структуры, макросы и функции есть в хэдерах, а по использованию, к SDK прилагается нехилая трехтомная книжица аж на 800 с лишним страниц.

Почти все перечисленное добавил в базу (кроме dialogInit - у меня к нему есть некоторые претензии). Параллельно расписал еще десяток функций (RwMalloc/RwFree/....).

[You must login to view hidden text.]

Offline

#79 04-08-2007 04:11

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Адреса и функции gta_sa.exe 1.0

Обновленную базу и Renderware SDK можно скачать с http://public.sannybuilder.com (thx to listener).

Offline

#80 11-08-2007 22:18

AleX AciD
From: RU-VLG
Registered: 27-02-2007
Posts: 36
Website

Re: Адреса и функции gta_sa.exe 1.0

listener wrote:

Что касается исходников RWSDK - да, это была бы полезная вещь, но и без них обойтись достаточно легко. Все структуры, макросы и функции есть в хэдерах, а по использованию, к SDK прилагается нехилая трехтомная книжица аж на 800 с лишним страниц.

Ну, не совсем все. Я недавно (вернее, не очень давно) занимался восстановлением исходников RW. Иногда там встречаются нигде не описанные функции/структуры, например:

struct RwChunkHeader
{
    RwUInt32 type;        /* chunk ID - see RwStreamFindChunk */
    RwUInt32 length;      /* length of the chunk data in bytes */
    RwUInt32 libraryID;   /* library ID stamp */
};

Хотя, покопавшись в использующих/используемых функциях, разобраться с ними несложно. wink


[large][acronym=Завтра, завтра, постоянно завтра, так проходит жизнь]Cras, cras, semper cras, sic evadit aetas[/acronym][/large]

Offline

#81 13-08-2007 23:18

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Адреса и функции gta_sa.exe 1.0

2AleX AciD:
имеется в виду вот это?

struct RwChunkHeaderInfo
{
    RwUInt32 type;      /**< chunk ID - see \ref RwStreamFindChunk */
    RwUInt32 length;    /**< length of the chunk data in bytes */
    RwUInt32 version;   /**< version of the chunk data.
                         *   See \ref RwEngineGetVersion. */
    RwUInt32 buildNum;  /**< build number of the RenderWare libraries
                         *   previously used to stream out the data */
    RwBool isComplex;   /**< Internal Use */
};

Описано. Кратенько, но описано.
Страница I-171 и далее

Last edited by listener (13-08-2007 23:20)

Offline

#82 19-08-2007 00:12

AleX AciD
From: RU-VLG
Registered: 27-02-2007
Posts: 36
Website

Re: Адреса и функции gta_sa.exe 1.0

2listener:
В том то и дело, что не это. wink
RwChunkHeaderInfo - используется приложением при работе с движком.
RwChunkHeader - испольуется самим движком при чтении/записи файлов RW.


[large][acronym=Завтра, завтра, постоянно завтра, так проходит жизнь]Cras, cras, semper cras, sic evadit aetas[/acronym][/large]

Offline

#83 21-08-2007 18:50

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Адреса и функции gta_sa.exe 1.0

Выложил на паблик новую базу.
В ней расписаны конструкторы и деструкторы для всех объектов CTask. ( >300 объектов, ~1500 функций, около 10% от общего количества).

Поведение объекта (актера, машины и т.д.), делится на две части: перая - "программная" - задается скриптом и легко модифицируется. Вторая - "аппаратная" - справляется сабклассами CTask и, на текущий момент, модификациям практически не поддается.

Что все это дает в ближней перспективе:
во-первых, обозначена куча методов, на которые можно не обращать внимание. :-)
во-вторых, многие фрагменты становятся гораздо проще, например:

Адрес 46C149, opcode_07A7, put_jetpack_on_actor %1d% в свете расписанного, выглядит так:

getNumberParams(1);
assignTaskToPed (opcodeParams[0], new CTask_8705C4 (0, 10.0, 0, 0), opcode);
return 0;

В оригинале, эта конструкция занимает 89 байт.

Что это дает в дальней перспективе: возможность задавать и модифицировать базовое поведение (добавляя собственные сабклассы CTask). (Когда/если это будет делаться, оставляю заказ на ОМОН на джетпаках).

Что дальше: дальше нужно нарисовать нормальное дерево классов (сейчас есть только список, какой объект от какого наследуется), дать им нормальные имена (шестизначные числа не очень подходят для этой цели), расписать оставшиеся методы и так далее и в том же духе.

Offline

#84 22-08-2007 21:22

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Адреса и функции gta_sa.exe 1.0

Попутно, дорисовалась иерархия основных объектов игры (как обычно, цифра после подчеркивания - адрес VMT)

_863C40:
	_8630E8: (CGtaCamera или CGtaViewport?)
	_863928:
		CBuilding_8585C8 (size=0x38)
			CBuilding_8639B0 (size=0x38)
		CDummy_8638C0		
			CDummy_866E78 (size=0x38)
			CDummy_86C198 (unused)
		_863BA0: (size=0x138)
			CObject_866F60: (size=0x17C)
				CObject_866EE0: (size=0x18C)
				CObject_867030: (size=0x17C)
				CObject_868A60: (size=0x19C)
			CPed_86C358
				CPed_86C0A8 (size=0x79C) normal pedestrian
				CPed_86C120 (size=0x7C4) => CPedCop
				CPed_86C200 (size=0x79C) => CPedService (medic or fireman)
				CPed_86D168 (size=0x7A4) => CPedPlayer?
			CVehicle_871E80
				CVehicle_871120 (size=0x988)
					CVehicle_871680 (size=0xA18) => CVehicleHeli
					CVehicle_8717D8 (size=0x99C) => CVehicleCar?
					CVehicle_871948 (size=0xA04)
					CVehicle_871AE8 (size=0x9BC) => CVehicleMtruck?
					CVehicle_871C28 (size=0x9F4) => CVehicleTrailer?
				CVehicle_871360 (size=0x814)
					CVehicle_871528 (size=0x838)
				CVehicle_8721A0 (size=0x7E8)
				CVehicle_872370 (size=0x6AC) => CVehicleTrain?

Как и обещалось, никаких всеобъемлющих объектов CPed и CVehicle не обнаружено, несмотря на все попытки описать их структуру на gtaforums/gtamodding tongue
Там, где стоят знаки вопроса, требуются уточнения (например, объект CVehicleHeli я очень долго обзывал как CVehicleQuad, пока не обнаружил, что он вызывается с ID maverick).

Принимаются пожелания по обзыванию непоименованных объектов smile  _863BA0, скорее всего, станет CEntity, что придумать для остальных, я пока не решил.

PS. Как обычно, я не возражаю и даже приветствую закидывание данной структуры на gtaforums и т.д. (Самого меня, скорее всего, заломает)

Offline

#85 23-08-2007 11:22

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Адреса и функции gta_sa.exe 1.0

CVehicle_871E80 => CDummyVehicle
                CVehicle_871120 (size=0x988) => CVehicle
                    CVehicle_871680 (size=0xA18) => CHeli
                    CVehicle_8717D8 (size=0x99C) => CTruck
                    CVehicle_871948 (size=0xA04) => CPlane
                    CVehicle_871AE8 (size=0x9BC) => CQuad
                    CVehicle_871C28 (size=0x9F4) => CTrailer
                CVehicle_871360 (size=0x814) => CMotorBike
                    CVehicle_871528 (size=0x838) => CBike
                CVehicle_8721A0 (size=0x7E8) => CBoat
                CVehicle_872370 (size=0x6AC) => CTrain

_863BA0 можно было бы назвать CScriptableObject, CScriptableUnit или что-то в этом духе.

Offline

#86 23-08-2007 14:38

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Адреса и функции gta_sa.exe 1.0

Кстати, CScriptableUnit+484h - это ссылка (Reference). Если равно 2 - юнит уникальный (создан скриптами) и трогать его нельзя. Если равен 1, то это обычный generic - выгружаем сразу, когда не нужен. Если посмотреть опкоды remove_references, можно найти и процедуры, которые это меняют, например

.text:006D5D70 ; 1 - removeref
.text:006D5D70 ; 2 - addref
.text:006D5D70 ; int __stdcall SetCarRef(int Type)


.text:005E47E0 ; 1 - remove
.text:005E47E0 ; 2 - add
.text:005E47E0 ; int __stdcall SetActorRef(char Ref)

При создании юнитов в конструктор обычно передается значение ссылки, 1 или 2.

.text:006F2940 ; int __cdecl CBoat__constructor(int ModelID,char NewRef)

В опкодах обычно передается 2, во всяких траффик-генераторах, типа (006CD2F0 CreateAirTraffic), передается 1

.text:006CD3BE                     push 1
.text:006CD3C0                     push ecx
.text:006CD3C1                     mov ecx, eax
.text:006CD3C3                     call _CHeli__constructor

Offline

#87 11-09-2007 12:22

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Адреса и функции gta_sa.exe 1.0

Сравнение rwplcore.h и частично расписанной процедуры 0080A240 дает почти 2 десятка процедур для работы со строками (структура RwStringFunctions):

.text:0080A240 _RwStringFuncsInit proc near                                ; CODE XREF: sub_7F3170+70p
.text:0080A240           mov   eax, ds:_RwEngineInstance
.text:0080A245           mov   dword ptr [eax+0F0h], offset _sprintf       ; Write formatted data to a string.
.text:0080A24F           mov   ecx, ds:_RwEngineInstance
.text:0080A255           mov   dword ptr [ecx+0F4h], offset _vsprintf      ; Write formatted output using a pointer to a list of arguments.
.text:0080A25F           mov   edx, ds:_RwEngineInstance
.text:0080A265           mov   dword ptr [edx+0F8h], offset _strcpy        ; Copy a string.
.text:0080A26F           mov   eax, ds:_RwEngineInstance
.text:0080A274           mov   dword ptr [eax+0FCh], offset _strncpy       ; Copy characters of one string to another.
.text:0080A27E           mov   ecx, ds:_RwEngineInstance
.text:0080A284           mov   dword ptr [ecx+100h], offset _strcat        ; Append a string.
.text:0080A28E           mov   edx, ds:_RwEngineInstance
.text:0080A294           mov   dword ptr [edx+104h], offset _strncat       ; Append characters of a string.
.text:0080A29E           mov   eax, ds:_RwEngineInstance
.text:0080A2A3           mov   dword ptr [eax+108h], offset _strrchr       ; Scan a string for the last occurrence of a character.
.text:0080A2AD           mov   ecx, ds:_RwEngineInstance
.text:0080A2B3           mov   dword ptr [ecx+10Ch], offset _strchr        ; Find a character in a string.
.text:0080A2BD           mov   edx, ds:_RwEngineInstance
.text:0080A2C3           mov   dword ptr [edx+110h], offset _strstr        ; Returns a pointer to the first occurrence of a search string in a string.
.text:0080A2CD           mov   eax, ds:_RwEngineInstance
.text:0080A2D2           mov   dword ptr [eax+114h], offset _strcmp        ; Compare strings.
.text:0080A2DC           mov   ecx, ds:_RwEngineInstance
.text:0080A2E2           mov   dword ptr [ecx+118h], offset _strncmp       ; Compare characters of two strings without regard to case.
.text:0080A2EC           mov   edx, ds:_RwEngineInstance
.text:0080A2F2           mov   dword ptr [edx+11Ch], offset _stricmp       ; Perform a lowercase comparison of strings.
.text:0080A2FC           mov   eax, ds:_RwEngineInstance
.text:0080A301           mov   dword ptr [eax+120h], offset _strlen        ; Get the length of a string
.text:0080A30B           mov   ecx, ds:_RwEngineInstance
.text:0080A311           mov   dword ptr [ecx+124h], offset _strupr        ; Convert a string to uppercase.
.text:0080A31B           mov   edx, ds:_RwEngineInstance
.text:0080A321           mov   dword ptr [edx+128h], offset _strlwr        ; Convert a string to lowercase
.text:0080A32B           mov   eax, ds:_RwEngineInstance
.text:0080A330           mov   dword ptr [eax+12Ch], offset _strtok        ; Find the next token in a string
.text:0080A33A           mov   ecx, ds:_RwEngineInstance
.text:0080A340           mov   eax, 1
.text:0080A345           mov   dword ptr [ecx+130h], offset _sscanf        ; Read formatted data from a string
.text:0080A34F           retn
.text:0080A34F _RwStringFuncsInit endp

(по оффсетам - адреса стандартных функций).


Также в дополнение к File IO (большая часть уже известна, за исключением пары функций):

.text:00804140 _RwFileIOFuncsInit proc near                                ; CODE XREF: sub_7F3170+96p
.text:00804140           mov   eax, ds:_RwEngineInstance
.text:00804145           mov   dword ptr [eax+0C4h], offset _fexist
.text:0080414F           mov   ecx, ds:_RwEngineInstance
.text:00804155           mov   dword ptr [ecx+0C8h], offset _fopen
.text:0080415F           mov   edx, ds:_RwEngineInstance
.text:00804165           mov   dword ptr [edx+0CCh], offset _fclose
.text:0080416F           mov   eax, ds:_RwEngineInstance
.text:00804174           mov   dword ptr [eax+0D0h], offset _fread
.text:0080417E           mov   ecx, ds:_RwEngineInstance
.text:00804184           mov   dword ptr [ecx+0D4h], offset _fwrite
.text:0080418E           mov   edx, ds:_RwEngineInstance
.text:00804194           mov   dword ptr [edx+0D8h], offset _fgets         ; Get a string from a stream
.text:0080419E           mov   eax, ds:_RwEngineInstance
.text:008041A3           mov   dword ptr [eax+0DCh], offset _fputs         ; Write a string to a stream
.text:008041AD           mov   ecx, ds:_RwEngineInstance
.text:008041B3           mov   dword ptr [ecx+0E0h], offset _feof
.text:008041BD           mov   edx, ds:_RwEngineInstance
.text:008041C3           mov   dword ptr [edx+0E4h], offset _fseek
.text:008041CD           mov   eax, ds:_RwEngineInstance
.text:008041D2           mov   dword ptr [eax+0E8h], offset _fflush        ; Flushes a stream.
.text:008041DC           mov   ecx, ds:_RwEngineInstance
.text:008041E2           mov   eax, 1
.text:008041E7           mov   dword ptr [ecx+0ECh], offset _ftell         ; Gets the current position of a file pointer.
.text:008041F1           retn
.text:008041F1 _RwFileIOFuncsInit endp

Еще непонятна функция

.text:00836FBA _uppercase

вроде как конвертирует строку в верний регистр (используется только в процедуры создания stats.html).

Offline

#88 11-09-2007 13:14

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Адреса и функции gta_sa.exe 1.0

Seemann wrote:

Сравнение rwplcore.h и частично расписанной процедуры 0080A240 дает почти 2 десятка процедур для работы со строками (структура RwStringFunctions):

А разве у меня этого не было?

Seemann wrote:

Еще непонятна функция

.text:00836FBA _uppercase

вроде как конвертирует строку в верний регистр (используется только в процедуры создания stats.html).

Она называется char * _strupr (char *);

Положил на паблик msvc2003crt.rar - исходники стандартных библиотек. Эта функция там в файле strupr.c. Можно посмотреть и ужаснуться.

Offline

#89 11-09-2007 13:32

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Адреса и функции gta_sa.exe 1.0

Еще на паблик выложена база от 8 сентября. Там, в основном косметические изменения, но их много (см. подпись).
Начерно накидана структура объектов моделей (которые используются в loadModel).

Специально для людей, которые предпочитают черный текст на белом фоне, выложен recolor.idc - макрос, который заменяет фон всех функции некого цвета на какой-нибудь другой цвет (в конкретном случае - черный на синий. Диалог выбора я делать не стал, проще поменять в самом макросе (он всего 20 строчек, места, которые меняются, откомментированы).

Макросами в IDA пользоваться очень просто: в меню выбирается File->IDC File и файл с макросом. Если в нем нет ошибок, он автоматически запускается на исполнение.

Кстати, я несколько раз выкладывал fwalk.idc - макрос, который выводит в файл список функций с указанием размера и комментарием (внутри есть еще закомментированный кусок, который также выводит все перекрестные ссылки на функцию).

И вообще, нужен ли какой-либо ликбез по IDA scripting (или вообще по обработке текста?  (а то, почитаешь, как народ не может написать три строчки на перле, чтобы автоматически параметры опкодов в исходнике поменять - и хочется плакать)

Offline

#90 11-09-2007 14:23

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Адреса и функции gta_sa.exe 1.0

А разве у меня этого не было?

У тебя была расписана структура RwStringRunctions, но сами функции не были названы:

.text:0080A240     __rwStringOpen  proc near               ; CODE XREF: _RwEngineInit+70p
.text:0080A240 000                 mov     eax, _RwEngineInstance
.text:0080A245 000                 mov     dword ptr [eax+0F0h], offset _sprintf
.text:0080A24F 000                 mov     ecx, _RwEngineInstance
.text:0080A255 000                 mov     dword ptr [ecx+0F4h], offset sub_8230B8
.text:0080A25F 000                 mov     edx, _RwEngineInstance
.text:0080A265 000                 mov     dword ptr [edx+0F8h], offset sub_826590
.text:0080A26F 000                 mov     eax, _RwEngineInstance
.text:0080A274 000                 mov     dword ptr [eax+0FCh], offset _strncpy
.text:0080A27E 000                 mov     ecx, _RwEngineInstance
.text:0080A284 000                 mov     dword ptr [ecx+100h], offset sub_8265A0
.text:0080A28E 000                 mov     edx, _RwEngineInstance
.text:0080A294 000                 mov     dword ptr [edx+104h], offset loc_826450
.text:0080A29E 000                 mov     eax, _RwEngineInstance
.text:0080A2A3 000                 mov     dword ptr [eax+108h], offset loc_80A420
.text:0080A2AD 000                 mov     ecx, _RwEngineInstance
.text:0080A2B3 000                 mov     dword ptr [ecx+10Ch], offset loc_80A400
.text:0080A2BD 000                 mov     edx, _RwEngineInstance
.text:0080A2C3 000                 mov     dword ptr [edx+110h], offset sub_822650
.text:0080A2CD 000                 mov     eax, _RwEngineInstance
.text:0080A2D2 000                 mov     dword ptr [eax+114h], offset sub_8263C0
.text:0080A2DC 000                 mov     ecx, _RwEngineInstance
.text:0080A2E2 000                 mov     dword ptr [ecx+118h], offset _strncmp
.text:0080A2EC 000                 mov     edx, _RwEngineInstance
.text:0080A2F2 000                 mov     dword ptr [edx+11Ch], offset sub_80A350
.text:0080A2FC 000                 mov     eax, _RwEngineInstance
.text:0080A301 000                 mov     dword ptr [eax+120h], offset sub_826330
.text:0080A30B 000                 mov     ecx, _RwEngineInstance
.text:0080A311 000                 mov     dword ptr [ecx+124h], offset loc_80A3A0
.text:0080A31B 000                 mov     edx, _RwEngineInstance
.text:0080A321 000                 mov     dword ptr [edx+128h], offset loc_80A3D0
.text:0080A32B 000                 mov     eax, _RwEngineInstance
.text:0080A330 000                 mov     dword ptr [eax+12Ch], offset _strtok
.text:0080A33A 000                 mov     ecx, _RwEngineInstance
.text:0080A340 000                 mov     eax, 1
.text:0080A345 000                 mov     dword ptr [ecx+130h], offset _sscanf
.text:0080A34F 000                 retn
.text:0080A34F     __rwStringOpen  endp

Макросами в IDA пользоваться очень просто: в меню выбирается File->IDC File и файл с макросом

угу, я запускал несколько раз fwalk.idc

И вообще, нужен ли какой-либо ликбез по IDA scripting (или вообще по обработке текста?

если есть желание wink

Offline

#91 13-09-2007 04:29

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Адреса и функции gta_sa.exe 1.0

Seemann wrote:

И вообще, нужен ли какой-либо ликбез по IDA scripting (или вообще по обработке текста?

если есть желание wink

Хорошо. Будет. Если есть идеи, с чего начать - welcome.

Offline

#92 13-09-2007 04:36

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Адреса и функции gta_sa.exe 1.0

Несколько потенциально полезных адресов:

5619D0     _profileStartInterval
561A00     _profileEndInterval

B7CB38     _profileTotalTimeLow dd ?
B7CB3C     _profileTotalTimeHig dd ?
B7CB40     _enableProfiling db ?

Если enableProfiling не равна нулю, время в миллисекундах между вызовами profileStartInterval и profileEndInterval приплюсовывается в profileTotalTime

Количество обработанных интервалов помещается в
B7CB44     _profileIntervalCount dd ?

Last edited by listener (13-09-2007 04:36)

Offline

#93 21-09-2007 10:38

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Адреса и функции gta_sa.exe 1.0

Кое-какая информация по поводу вертолетов полиции (см. также скрипт в Модификациях).

.text:006C79A0 processPursuitHelis

обрабатывает запуск вертолетов. Вертолеты запускаются с интервалом в 15 секунд.

.text:006C6520 ; int __cdecl CreatePursuitHeli(int Player2Follow,char PoliceOrVCN)

создает вертолет преследования

.data:00C1C960 _TimeLastPoliceHeliWasCreated

хранит время последнего запуска (см. 006C79A0)

.data:00C1C964 _pPoliceHeli
.data:00C1C968 _pPoliceHeli2

хранят указатели на вертолеты. Это могут быть либо два маверика, либо маверик и вертолет новостей

Offline

#94 28-10-2007 13:53

Alexander
Registered: 19-08-2006
Posts: 184
Website

Re: Адреса и функции gta_sa.exe 1.0

2listener : ты не сталкивался в коде с такой вешью , как IPL Mapping  ?

Last edited by Alexander (28-10-2007 13:53)

Offline

#95 29-10-2007 09:35

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Адреса и функции gta_sa.exe 1.0

2Alexander:
Пока нет.
А что нужно? Я как раз сейчас с IPL разбираюсь.

Offline

#96 29-10-2007 15:36

Alexander
Registered: 19-08-2006
Posts: 184
Website

Re: Адреса и функции gta_sa.exe 1.0

2listener : очень нужно ) увеличить бы его ...

Offline

#97 02-11-2007 03:16

AleX AciD
From: RU-VLG
Registered: 27-02-2007
Posts: 36
Website

Re: Адреса и функции gta_sa.exe 1.0

По просьбам трудящихся wink описываю изменения, вносимые моими патчами (выложенными в теме "disassembler-friendly GTA_SA.exe")

В общем, недавно я решил вернуть в gta-sa стандартную для Renderware-приложений возможность выбирать при запуске разрешение или оконный режим.

Первой была отключена проверка одной переменной, "мешающей" показу диалогового окна:

.text:00746219 02C                 mov     eax, dword_C920F0
.text:0074621E 02C                 mov     edi, 1
.text:00746223 02C                 cmp     eax, edi
.text:00746225 02C                 jle     short loc_746273   ; <- забито 2-мя NOP'ами

До этой проверки в dword_C920F0 записывается количество подсистем (грубо говоря, видеоускорителей), и если их меньше 2-х, то диалоговое окно не показывается.

При создании диалогового окна заполняются два списка: список подсистем и список режимов для выбранной подсистемы. Рокстаровцы добавили код, отбрасывающий режимы:
- не полноэкранные;
- с шириной меньше 640 пикселей;
- с высотой меньше 480 пикселей.

.text:0074594D 09C                 call    _RwEngineGetVideoModeInfo
.text:00745952 09C                 mov     ecx, [esp+98h+modeinfo.flag]
.text:00745956 09C                 and     ecx, 1
.text:00745959 09C                 add     esp, 8
.text:0074595C 094                 test    cl, cl
.text:0074595E 094                 jz      loc_745A54          ; <-- забито NOP'ами отсюда 
.text:00745964 094                 cmp     [esp+90h+modeinfo.width], 640
.text:0074596C 094                 jl      loc_745A54
.text:00745972 094                 cmp     [esp+90h+modeinfo.height], 480
.text:0074597A 094                 jl      loc_745A54          ; <-- досюда

Некоторое время спустя куча заставок, выводимых при запуске меня окончательно достала. Были найдены два метода пропуска заставок (оба заменяют состояние игры на "послезаставочное"). Метод Kyeman'а - замена состояния в памяти после загрузки. Метод Stretchnutter'а - замена состояния путем модификации кода в exe-файле.

оригинальный код:

00748AA8  |> 53             ||PUSH EBX                               ;  Case 0 of switch 00748A98
00748AA9  |. 57             ||PUSH EDI
00748AAA  |. E8 0176E4FF    ||CALL gta_sa_c.005900B0
00748AAF  |. 57             ||PUSH EDI
00748AB0  |. 57             ||PUSH EDI
00748AB1  |. E8 FA77E4FF    ||CALL gta_sa_c.005902B0

модифицированный методом Stretchnutter'а код:

00748AA8   > C705 C0D4C800 >MOV DWORD PTR DS:[C8D4C0],5              ;  Case 0 of switch 00748A98
00748AB2   .^EB DF          JMP SHORT gta_sa_c.00748A93
00748AB4     90             NOP
00748AB5     90             NOP

При обработке состояния 0 происходит установка состояния 5 и переход к его обработке.

Наконец, чтобы запускать игру только в оконном режиме, достаточно вместо создания диалогового окна

00746236   . 6A 00          PUSH 0                                   ; /lParam = NULL
00746238   . 68 505E7400    PUSH gta_sa_c.00745E50                   ; |DlgProc = gta_sa_c.00745E50
0074623D   . 55             PUSH EBP                                 ; |hOwner
0074623E   . 6A 68          PUSH 68                                  ; |pTemplate = 68
00746240   . 53             PUSH EBX                                 ; |hInst
00746241   . FF15 CC828500  CALL DWORD PTR DS:[<&USER32.DialogBoxPar>; \DialogBoxParamA
00746247   . 85C0           TEST EAX,EAX
00746249   . 0F84 85010000  JE gta_sa_c.007463D4

установить номер подсистемы и номер режима равными нулю (оконный режим обычно идет первым в списке)

00746236   . 90             NOP
00746237   . 90             NOP
00746238   . 33C0           XOR EAX,EAX
0074623A   . A3 F420C900    MOV DWORD PTR DS:[C920F4],EAX    ; подсистема
0074623F   . A3 20628D00    MOV DWORD PTR DS:[8D6220],EAX    ; видеорежим
00746244   . 90             NOP
00746245   . 90             NOP
00746246   . 40             INC EAX                          ; return TRUE :)
00746247   . 85C0           TEST EAX,EAX
00746249   . 0F84 85010000  JE gta_sa_c.007463D4

Вышеописанные модификации меняют код, находящийся в "скелете" Renderware, файл skel\win\win.c cool


[large][acronym=Завтра, завтра, постоянно завтра, так проходит жизнь]Cras, cras, semper cras, sic evadit aetas[/acronym][/large]

Offline

#98 02-11-2007 07:53

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Адреса и функции gta_sa.exe 1.0

2Alexander:
Я выложил то, что у меня отдекомпилировано, на public. (sources/gta_dll_...) Там есть некоторое количество работы с IPL (ogConfig.cpp).
Если того, чего надо, не найдется - через несколько дней будет больше (исходники страшно "непричесанные", мне за них стыдно, поэтому просьба особо широко не распространять).

Если есть пожелания по конкретному фрагменту - можно высказывать.

Offline

#99 02-11-2007 07:58

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Адреса и функции gta_sa.exe 1.0

Выложена свежая база. Изменения, в основном, относятся к структурам, читаемым из конфигов, плюс, немного по графике (плагины R*).
Новый цвет в базе - зеленый. Если какая-то функция покрашена зеленым, значит, она полностью декомпилирована (либо для нее написан аналог), компилируется и работает вместо оригинальной (см. предыдущий коммент).

Если все пойдет нормально, через несколько дней проблема лимитов на что-либо пропадет, как явление.

Offline

#100 17-11-2007 04:08

AleX AciD
From: RU-VLG
Registered: 27-02-2007
Posts: 36
Website

Re: Адреса и функции gta_sa.exe 1.0

Как была отключена динамическая камера для поезда (описание патча):

При включении этой камеры всплывает сообщение "Нажмите NUM4...", id которого - "CINCAM".

В exe-шнике всего 5 функций (показывающих это сообщение) используют этот id, причем все 5 функций, в свою очередь, вызываются в "switch'е" одной функции (sub_527FA0, глядя на граф этой функции можно ужаснуться :wow: ).

После показа сообщения, происходит обращение к какой-то переменной:

.text:0052A71F                  call    sub_526950         ; <-- забито 
.text:0052A724                  mov     dx, word_B70140    ; <-- nop'ами
.text:0052A72B                  jmp     short loc_52A757

Забивая по очереди вызов функции и обращение к переменной в каждой из пяти ветвей "switch'a", я нашел нужную ветвь.


[large][acronym=Завтра, завтра, постоянно завтра, так проходит жизнь]Cras, cras, semper cras, sic evadit aetas[/acronym][/large]

Offline

Board footer

Powered by FluxBB