You are not logged in.
Offline
Чем ps-функция отличается от rs? (619AF0 RsGrabScreen, 7452B0 psGrabScreen)
Большинство Rs функций являются переходниками на ps функции.
Как я понимаю, Rs - платформонезависимый код, ps - платформозависимый код.
выкладывай
Скелетное (каркасное) приложение из состава RWG SDK 3.7 Скачать
Код в исходниках и в exe-шнике может различаться:
- из-за различий в версиях (3.7 / 3.6)
- из-за изменений, внесенных Рокстаровцами.:rolleyes:
Эх, жаль нет полных исходников RWSDK, тогда восстановить код от Рокстара было бы намного легче...:/
[large][acronym=Завтра, завтра, постоянно завтра, так проходит жизнь]Cras, cras, semper cras, sic evadit aetas[/acronym][/large]
Offline
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
Обновленную базу и Renderware SDK можно скачать с http://public.sannybuilder.com (thx to listener).
Offline
Что касается исходников RWSDK - да, это была бы полезная вещь, но и без них обойтись достаточно легко. Все структуры, макросы и функции есть в хэдерах, а по использованию, к SDK прилагается нехилая трехтомная книжица аж на 800 с лишним страниц.
Ну, не совсем все. Я недавно (вернее, не очень давно) занимался восстановлением исходников RW. Иногда там встречаются нигде не описанные функции/структуры, например:
1 2 3 4 5 6 | struct RwChunkHeader { RwUInt32 type; /* chunk ID - see RwStreamFindChunk */ RwUInt32 length; /* length of the chunk data in bytes */ RwUInt32 libraryID; /* library ID stamp */ } ; |
Хотя, покопавшись в использующих/используемых функциях, разобраться с ними несложно.
[large][acronym=Завтра, завтра, постоянно завтра, так проходит жизнь]Cras, cras, semper cras, sic evadit aetas[/acronym][/large]
Offline
2AleX AciD:
имеется в виду вот это?
1 2 3 4 5 6 7 8 9 10 | 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
2listener:
В том то и дело, что не это.
RwChunkHeaderInfo - используется приложением при работе с движком.
RwChunkHeader - испольуется самим движком при чтении/записи файлов RW.
[large][acronym=Завтра, завтра, постоянно завтра, так проходит жизнь]Cras, cras, semper cras, sic evadit aetas[/acronym][/large]
Offline
Выложил на паблик новую базу.
В ней расписаны конструкторы и деструкторы для всех объектов CTask. ( >300 объектов, ~1500 функций, около 10% от общего количества).
Поведение объекта (актера, машины и т.д.), делится на две части: перая - "программная" - задается скриптом и легко модифицируется. Вторая - "аппаратная" - справляется сабклассами CTask и, на текущий момент, модификациям практически не поддается.
Что все это дает в ближней перспективе:
во-первых, обозначена куча методов, на которые можно не обращать внимание. :-)
во-вторых, многие фрагменты становятся гораздо проще, например:
Адрес 46C149, opcode_07A7, put_jetpack_on_actor %1d% в свете расписанного, выглядит так:
1 2 3 | getNumberParams(1); assignTaskToPed (opcodeParams[0], new CTask_8705C 4 (0, 10.0, 0, 0), opcode); return 0; |
В оригинале, эта конструкция занимает 89 байт.
Что это дает в дальней перспективе: возможность задавать и модифицировать базовое поведение (добавляя собственные сабклассы CTask). (Когда/если это будет делаться, оставляю заказ на ОМОН на джетпаках).
Что дальше: дальше нужно нарисовать нормальное дерево классов (сейчас есть только список, какой объект от какого наследуется), дать им нормальные имена (шестизначные числа не очень подходят для этой цели), расписать оставшиеся методы и так далее и в том же духе.
Offline
Попутно, дорисовалась иерархия основных объектов игры (как обычно, цифра после подчеркивания - адрес VMT)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | _863C40: _8630E8: (CGtaCamera или CGtaViewport?) _863928: CBuilding_8585C 8 (size=0x38) CBuilding_8639B 0 (size=0x38) CDummy_8638C 0 CDummy_866E 78 (size=0x38) CDummy_86C 198 (unused) _863BA0: (size=0x138) CObject_866F60: (size=0x17C) CObject_866EE0: (size=0x18C) CObject_867030: (size=0x17C) CObject_868A60: (size=0x19C) CPed_86C 358 CPed_86C0A 8 (size=0x79C) normal pedestrian CPed_86C 120 (size=0x7C4) => CPedCop CPed_86C 200 (size=0x79C) => CPedService (medic or fireman) CPed_86D 168 (size=0x7A4) => CPedPlayer? CVehicle_871E 80 CVehicle_ 871120 (size=0x988) CVehicle_ 871680 (size=0xA18) => CVehicleHeli CVehicle_8717D 8 (size=0x99C) => CVehicleCar? CVehicle_ 871948 (size=0xA04) CVehicle_871AE 8 (size=0x9BC) => CVehicleMtruck? CVehicle_871C 28 (size=0x9F4) => CVehicleTrailer? CVehicle_ 871360 (size=0x814) CVehicle_ 871528 (size=0x838) CVehicle_8721A 0 (size=0x7E8) CVehicle_ 872370 (size=0x6AC) => CVehicleTrain? |
Как и обещалось, никаких всеобъемлющих объектов CPed и CVehicle не обнаружено, несмотря на все попытки описать их структуру на gtaforums/gtamodding
Там, где стоят знаки вопроса, требуются уточнения (например, объект CVehicleHeli я очень долго обзывал как CVehicleQuad, пока не обнаружил, что он вызывается с ID maverick).
Принимаются пожелания по обзыванию непоименованных объектов _863BA0, скорее всего, станет CEntity, что придумать для остальных, я пока не решил.
PS. Как обычно, я не возражаю и даже приветствую закидывание данной структуры на gtaforums и т.д. (Самого меня, скорее всего, заломает)
Offline
1 2 3 4 5 6 7 8 9 10 11 | CVehicle_871E 80 => CDummyVehicle CVehicle_ 871120 (size=0x988) => CVehicle CVehicle_ 871680 (size=0xA18) => CHeli CVehicle_8717D 8 (size=0x99C) => CTruck CVehicle_ 871948 (size=0xA04) => CPlane CVehicle_871AE 8 (size=0x9BC) => CQuad CVehicle_871C 28 (size=0x9F4) => CTrailer CVehicle_ 871360 (size=0x814) => CMotorBike CVehicle_ 871528 (size=0x838) => CBike CVehicle_8721A 0 (size=0x7E8) => CBoat CVehicle_ 872370 (size=0x6AC) => CTrain |
_863BA0 можно было бы назвать CScriptableObject, CScriptableUnit или что-то в этом духе.
Offline
Кстати, CScriptableUnit+484h - это ссылка (Reference). Если равно 2 - юнит уникальный (создан скриптами) и трогать его нельзя. Если равен 1, то это обычный generic - выгружаем сразу, когда не нужен. Если посмотреть опкоды remove_references, можно найти и процедуры, которые это меняют, например
1 2 3 4 5 6 7 8 | .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.
1 | .text :006F2940 ; int __cdecl CBoat__constructor(int ModelID,char NewRef) |
В опкодах обычно передается 2, во всяких траффик-генераторах, типа (006CD2F0 CreateAirTraffic), передается 1
1 2 3 4 | .text :006CD3BE push 1 .text :006CD3C0 push ecx .text :006CD3C1 mov ecx, eax .text :006CD3C3 call _CHeli__constructor |
Offline
Сравнение rwplcore.h и частично расписанной процедуры 0080A240 дает почти 2 десятка процедур для работы со строками (структура RwStringFunctions):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | .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 (большая часть уже известна, за исключением пары функций):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | .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 |
Еще непонятна функция
1 | .text :00836FBA _uppercase |
вроде как конвертирует строку в верний регистр (используется только в процедуры создания stats.html).
Offline
Сравнение rwplcore.h и частично расписанной процедуры 0080A240 дает почти 2 десятка процедур для работы со строками (структура RwStringFunctions):
А разве у меня этого не было?
Еще непонятна функция
1.text
:00836FBA
_uppercase
вроде как конвертирует строку в верний регистр (используется только в процедуры создания stats.html).
Она называется char * _strupr (char *);
Положил на паблик msvc2003crt.rar - исходники стандартных библиотек. Эта функция там в файле strupr.c. Можно посмотреть и ужаснуться.
Offline
Еще на паблик выложена база от 8 сентября. Там, в основном косметические изменения, но их много (см. подпись).
Начерно накидана структура объектов моделей (которые используются в loadModel).
Специально для людей, которые предпочитают черный текст на белом фоне, выложен recolor.idc - макрос, который заменяет фон всех функции некого цвета на какой-нибудь другой цвет (в конкретном случае - черный на синий. Диалог выбора я делать не стал, проще поменять в самом макросе (он всего 20 строчек, места, которые меняются, откомментированы).
Макросами в IDA пользоваться очень просто: в меню выбирается File->IDC File и файл с макросом. Если в нем нет ошибок, он автоматически запускается на исполнение.
Кстати, я несколько раз выкладывал fwalk.idc - макрос, который выводит в файл список функций с указанием размера и комментарием (внутри есть еще закомментированный кусок, который также выводит все перекрестные ссылки на функцию).
И вообще, нужен ли какой-либо ликбез по IDA scripting (или вообще по обработке текста? (а то, почитаешь, как народ не может написать три строчки на перле, чтобы автоматически параметры опкодов в исходнике поменять - и хочется плакать)
Offline
А разве у меня этого не было?
У тебя была расписана структура RwStringRunctions, но сами функции не были названы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | .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_8230B 8 .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_8265A 0 .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_80A 420 .text :0080A2AD 000 mov ecx, _RwEngineInstance .text :0080A2B3 000 mov dword ptr [ecx+10Ch], offset loc_80A 400 .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_8263C 0 .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_80A 350 .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_80A3A 0 .text :0080A31B 000 mov edx, _RwEngineInstance .text :0080A321 000 mov dword ptr [edx+128h], offset loc_80A3D 0 .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 (или вообще по обработке текста?
если есть желание
Offline
Несколько потенциально полезных адресов:
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
Кое-какая информация по поводу вертолетов полиции (см. также скрипт в Модификациях).
1 | .text :006C79A0 processPursuitHelis |
обрабатывает запуск вертолетов. Вертолеты запускаются с интервалом в 15 секунд.
1 | .text :006C6520 ; int __cdecl CreatePursuitHeli(int Player2Follow,char PoliceOrVCN) |
создает вертолет преследования
1 | .data :00C1C960 _TimeLastPoliceHeliWasCreated |
хранит время последнего запуска (см. 006C79A0)
1 2 | .data :00C1C964 _pPoliceHeli .data :00C1C968 _pPoliceHeli2 |
хранят указатели на вертолеты. Это могут быть либо два маверика, либо маверик и вертолет новостей
Offline
2listener : ты не сталкивался в коде с такой вешью , как IPL Mapping ?
Last edited by Alexander (28-10-2007 13:53)
Offline
Offline
По просьбам трудящихся описываю изменения, вносимые моими патчами (выложенными в теме "disassembler-friendly GTA_SA.exe")
В общем, недавно я решил вернуть в gta-sa стандартную для Renderware-приложений возможность выбирать при запуске разрешение или оконный режим.
Первой была отключена проверка одной переменной, "мешающей" показу диалогового окна:
1 2 3 4 | .text :00746219 02C mov eax, dword_C920F 0 .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 пикселей.
1 2 3 4 5 6 7 8 9 10 | .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_745A 54 ; <-- забито NOP'ами отсюда .text :00745964 094 cmp [esp+90h+modeinfo.width], 640 .text :0074596C 094 jl loc_745A 54 .text :00745972 094 cmp [esp+90h+modeinfo.height], 480 .text :0074597A 094 jl loc_745A 54 ; <-- досюда |
Некоторое время спустя куча заставок, выводимых при запуске меня окончательно достала. Были найдены два метода пропуска заставок (оба заменяют состояние игры на "послезаставочное"). Метод Kyeman'а - замена состояния в памяти после загрузки. Метод Stretchnutter'а - замена состояния путем модификации кода в exe-файле.
оригинальный код:
1 2 3 4 5 6 | 00748AA 8 |> 53 ||PUSH EBX ; Case 0 of switch 00748A 98 00748AA 9 | . 57 ||PUSH EDI 00748AAA | . E 8 0176E4FF ||CALL gta_sa_c.005900B 0 00748AAF | . 57 ||PUSH EDI 00748AB 0 | . 57 ||PUSH EDI 00748AB 1 | . E 8 FA77E4FF ||CALL gta_sa_c.005902B0 |
модифицированный методом Stretchnutter'а код:
1 2 3 4 | 00748AA 8 > C 705 C0D4C 800 >MOV DWORD PTR DS:[C8D4C0], 5 ; Case 0 of switch 00748A 98 00748AB 2 .^EB DF JMP SHORT gta_sa_c.00748A 93 00748AB 4 90 NOP 00748AB 5 90 NOP |
При обработке состояния 0 происходит установка состояния 5 и переход к его обработке.
Наконец, чтобы запускать игру только в оконном режиме, достаточно вместо создания диалогового окна
1 2 3 4 5 6 7 8 | 00746236 . 6A 00 PUSH 0 ; /lParam = NULL 00746238 . 68 505E 7400 PUSH gta_sa_c.00745E 50 ; |DlgProc = gta_sa_c.00745E 50 0074623D . 55 PUSH EBP ; |hOwner 0074623E . 6A 68 PUSH 68 ; |pTemplate = 68 00746240 . 53 PUSH EBX ; |hInst 00746241 . FF 15 CC 828500 CALL DWORD PTR DS:[<&USER32.DialogBoxPar>; \DialogBoxParamA 00746247 . 85C 0 TEST EAX,EAX 00746249 . 0F 84 85010000 JE gta_sa_c.007463D4 |
установить номер подсистемы и номер режима равными нулю (оконный режим обычно идет первым в списке)
1 2 3 4 5 6 7 8 9 10 | 00746236 . 90 NOP 00746237 . 90 NOP 00746238 . 33C 0 XOR EAX,EAX 0074623A . A 3 F420C 900 MOV DWORD PTR DS:[C920F4],EAX ; подсистема 0074623F . A 3 20628D 00 MOV DWORD PTR DS:[8D6220],EAX ; видеорежим 00746244 . 90 NOP 00746245 . 90 NOP 00746246 . 40 INC EAX ; return TRUE :) 00746247 . 85C 0 TEST EAX,EAX 00746249 . 0F 84 85010000 JE gta_sa_c.007463D4 |
Вышеописанные модификации меняют код, находящийся в "скелете" Renderware, файл skel\win\win.c
[large][acronym=Завтра, завтра, постоянно завтра, так проходит жизнь]Cras, cras, semper cras, sic evadit aetas[/acronym][/large]
Offline
2Alexander:
Я выложил то, что у меня отдекомпилировано, на public. (sources/gta_dll_...) Там есть некоторое количество работы с IPL (ogConfig.cpp).
Если того, чего надо, не найдется - через несколько дней будет больше (исходники страшно "непричесанные", мне за них стыдно, поэтому просьба особо широко не распространять).
Если есть пожелания по конкретному фрагменту - можно высказывать.
Offline
Выложена свежая база. Изменения, в основном, относятся к структурам, читаемым из конфигов, плюс, немного по графике (плагины R*).
Новый цвет в базе - зеленый. Если какая-то функция покрашена зеленым, значит, она полностью декомпилирована (либо для нее написан аналог), компилируется и работает вместо оригинальной (см. предыдущий коммент).
Если все пойдет нормально, через несколько дней проблема лимитов на что-либо пропадет, как явление.
Offline
Как была отключена динамическая камера для поезда (описание патча):
При включении этой камеры всплывает сообщение "Нажмите NUM4...", id которого - "CINCAM".
В exe-шнике всего 5 функций (показывающих это сообщение) используют этот id, причем все 5 функций, в свою очередь, вызываются в "switch'е" одной функции (sub_527FA0, глядя на граф этой функции можно ужаснуться :wow: ).
После показа сообщения, происходит обращение к какой-то переменной:
1 2 3 | .text :0052A71F call sub_ 526950 ; <-- забито .text :0052A724 mov dx, word_B 70140 ; <-- nop'ами .text :0052A72B jmp short loc_52A757 |
Забивая по очереди вызов функции и обращение к переменной в каждой из пяти ветвей "switch'a", я нашел нужную ветвь.
[large][acronym=Завтра, завтра, постоянно завтра, так проходит жизнь]Cras, cras, semper cras, sic evadit aetas[/acronym][/large]
Offline