Объявления

Друзья, если не получается зарегистрироваться, напишите на почту vdv_forever@bk.ru.
Я оторву свою задницу от всех дел и обязательно Вас активирую! :smile10:
Добро пожаловать на геройский форум! :smile25:

База данных IDA от void17

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineRoseKavalier  
Мастер
Мастер
 
Сообщения: 331
Зарегистрирован: 23 сен 2017, 17:00
Пол: Не указан
Поблагодарили: 234 раз.

Re: База данных IDA от void17

Сообщение RoseKavalier » 27 янв 2022, 21:05

Цитата:
Нужно избавляться от выравнивания не равного 4. Ясно же, что везде 4

99% true, there are definitely a few that are on 1-byte alignment. Hero class being the most well known example.

Цитата:
Виртуальные функции - чистое зло. Очень много наследуемых классов в дримкасте просто сбилось и занулилось.

Although the symbols do not give us everything, I find it made the job 100x as easy compared to before, especially given there are now two known sources of symbols which offers some additional cross-checking options.
Building up a database on RoE 1.0 or later version should be even easier given that the match should be pretty close for classes and functions compilation order... unfortunately there is not enough time.

I didn't spend that much time in your database 2.0 or 2.1 but after a quick glance there were places where alignment/order/... were not quite right.
Some months ago, I wrote a very basic script to find out functions in my database that had incorrect calling convention (usercall, userpurge...). I ran it here and you can check the attached results.

It's a big job, keep going :smile11:
Вложения
incorrect_function_conventions.csv
CSV dump of __usercall and __userpurge addresses+names
(16.36 КБ) Скачиваний: 105
Вернуться к началу

offlineАватара пользователя
void_17  
имя: DM
Ветеран
Ветеран
 
Сообщения: 537
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 122 раз.

Re: База данных IDA от void17

Сообщение void_17 » 28 янв 2022, 03:10

RoseKavalier, they have incorrent calling convention due to IDA Pro settings. It sets _stdcall or even __userpurge automatically and I need to manually correct them to __thiscall or __fastcall.
Your "dump" is just a list of functions which I hadn't corrected manually yet.

Btw, if you set default calling convention to __fastcall or __thiscall it creates a hell of __userpurge-s
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2161 раз.

Re: База данных IDA от void17

Сообщение AlexSpl » 28 янв 2022, 10:16

Значит, решил я восстановить класс TSingleSelectionWindow, но пока не срастается и довольно серьёзная разбежка. Неужели классы в Dreamcast RoE и SoD так отличаются или я туплю? Ещё вызывают сомнения классы FORWARD REF (так понимаю, объявленные заранее во избежание перекрёстных зависимостей) с field list 0x0000. У этих классов реально нет полей или как-то по-хитрому искать нужно? Вот восстановленный класс TSingleSelectionWindow со всеми классами, от которых зависит и которых пока нет в базе от void17 либо поля в ней отличаются:

Код: Выделить всё
class CHeroWindowEx : public heroWindow
{
   int m_lastIMHoverID;
   int lastHover;
};

class CAdvPopup : public CHeroWindowEx
{
public:
   int exitId;
   int exitCodeX;
   int exitCommand;
};

class textWidget : public widget
{
public:
   stdString Text;
   font* Font;
   font::TColor Color;
   font::TColor BackColor;
   font::EJustify Justify;
};

class CTextEntrySave
{
public:

};

class textEntryWidget : public textWidget
{
public:
   Bitmap816* textBack;
   CTextEntrySave* saveBack;
   unsigned short cursorIndex;
   unsigned short bufferSize;
   short textWidth;
   short textHeight;
   short textX;
   short textY;
   short textLines;
   short attributes;
   short type;
   short displayOffset;
   char cursorFlashOn;
   unsigned char focus;
   unsigned char autoDraw;
};

class GameSelectionHeadersStruct
{
public:

};

class CNewPlayerUpdateMan
{
public:

};

class CNetPlayerHandler
{
public:

};

class CChatEdit : public textEntryWidget
{
public:

};

struct slider : public widget
{
public:
   enum EGraphics
   {
      BROWN = 0,
      BLUE = 1
   };

   int knobPos;
   int currentState;
   int pageSize;
   int numStates;
   CSprite* sliderSprite;
   Bitmap816* sliderBitmap;
   int oldState;
   int knobRange;
   int length;
   long knob_start;
   short clickX;
   short clickY;
   unsigned char hotKeys;
   unsigned char scrolling;
   int lastFocus;
   void (*sliderFunction)(int, heroWindow*);
};

struct button : public widget
{
   CSprite* buttonIcon;
   int normalFrame;
   int selectedFrame;
   int disabled_frame;
   unsigned char endDialog;
   std::vector<int> hotKeyCodes;
   stdString Text;
};

class textButton : public button
{
public:
   font* Font;
   font::TColor textColor;
};

class CSaveScreen : public Bitmap16Bit
{
public:
   unsigned char screenSaved;
   int m_x;
   int m_y;
};

class CSingleSelectionNetMsgHandler
{
public:

};

class TSingleSelectionWindow : public CAdvPopup
{
public:
   char my_index;
   char pos_copy;
   char hero_pos[8];
   unsigned char loadMode;
   textWidget* human;
   textWidget* text;
   widget* handicap;
   widget* townL;
   widget* townR;
   widget* heroL;
   widget* heroR;
   widget* resL;
   widget* resR;
   widget* name;
   widget* flag;
   widget* face;
   widget* town;
   widget* bonus;
   textEntryWidget* nameEdit;
   unsigned long freeBlocks;
   unsigned long neededBlocks;
   int SavePart;
   char tempFilename[13];
   long tempBufStart;
   int SelectedVMPort;

   enum EWidgetIDs
   {
   };

   unsigned long clickTime;
   GameSelectionHeadersStruct* SelectionHeaders;
   int num_mapFiles;
   int max_maps;
   int* mapFilter;
   int mapsInFilter;
   unsigned char loadGameMode;
   unsigned char saveGameMode;
   int textIndex;
   CSprite* VictoryIcon;
   CSprite* LossIcon;
   CSprite* TownPix;
   CSprite* Resource;
   CSprite* heroSpecificAbility;
   Bitmap816* GoldBox;
   Bitmap816* Flags[8];
   Bitmap816* Panels[8];
   Bitmap816* HeroPix[156];
   Bitmap816* randomTownQuestion;
   Bitmap816* randomHeroQuestion;
   Bitmap816* randomTown;
   Bitmap816* randomHero;
   Bitmap816* noDice;
   Bitmap816* noHero;
   int sortDirection;
   int currentIndex;
   int currentMap;
   int durationIndex;
   unsigned char inAdvancedOptions;
   unsigned char inScenarioOptions;
   textEntryWidget* saveGameEdit;
   unsigned char mode;
   CNewPlayerUpdateMan* pNewPlayerUpdateMan;
   CNetPlayerHandler netPlayerHandler;
   unsigned char receivedMaps;
   slider* chatSlider;
   slider* fileSlider;
   slider* durationSlider;
   slider* nameSlider;
   textWidget* chatWidget;
   textWidget* nameList1;
   textWidget* nameList2;
   unsigned char mapChanged;
   unsigned char readingMaps;
   CChatEdit* chatEdit;
   int sortWhich;
   int filterSize;
   unsigned char scenarioOptionsStarted;
   unsigned char chatShowing;
   textButton* chatToggle;
   unsigned char receivingMaps;
   CSaveScreen* flagBack;
   char gameVersion[20];
   CSingleSelectionNetMsgHandler netMsgHandler;

   enum EOtherWidgetIDs
   {
   };

   enum
   {
      NWIDGETS = 211
   };
};

В коде, естественно, бардак. Не срастается. Думаю, в чём причина. Действительно классы такие разные или я упустил несколько полей и если их вернуть, то всё заведётся?
Вернуться к началу

offlineАватара пользователя
void_17  
имя: DM
Ветеран
Ветеран
 
Сообщения: 537
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 122 раз.

Re: База данных IDA от void17

Сообщение void_17 » 28 янв 2022, 10:19

AlexSpl писал(а):

Значит, решил я восстановить класс TSingleSelectionWindow, но пока не срастается и довольно серьёзная разбежка. Неужели классы в Dreamcast RoE и SoD так отличаются или я туплю? Ещё вызывают сомнения классы FORWARD REF (так понимаю, объявленные заранее во избежание перекрёстных зависимостей) с field list 0x0000. У этих классов реально нет полей или как-то по-хитрому искать нужно?
В коде, естественно, бардак. Не срастается. Думаю, в чём причина. Действительно классы такие разные или я упустил несколько полей и если их вернуть, то всё заведётся?


FORWARD REF это когда пишешь в в файлике что-то вроде class MyClass;
Почему они не сохранились, не очень понятно, игра же полностью скомпилирована, а не кусками. Поля не сохранились и кроме как у владельцев кода ее нет.

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

И да, некоторые типы не менялись, а некоторые менялись полностью. По-разному, вообщем-то.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2161 раз.

Re: База данных IDA от void17

Сообщение AlexSpl » 28 янв 2022, 10:25

Я доразобрал класс CSpriteFrame. Теперь работает метод Draw() :smile1: Не хватало полей:

Код: Выделить всё
_DDSURFACEDESC2 ddsd;
IDirectDrawSurface4 *ddsurf;
unsigned long compmap_len;
unsigned char *tempmem;


Например,

Код: Выделить всё
CSprite *sprite = *(CSprite**)(c->esi + 0x78);
sprite->Draw(0, 2 * (townType + 1), 0, 0, sprite->Width, sprite->Height, pWindowManager->screenBitmap->map, dx, dy,
   pWindowManager->screenBitmap->Width, pWindowManager->screenBitmap->Height, pWindowManager->screenBitmap->ScanlineSize, false, true);

Вот здесь c->esi и есть TSingleSelectionWindow.
Последний раз редактировалось AlexSpl 28 янв 2022, 10:34, всего редактировалось 1 раз.
Вернуться к началу

offlineАватара пользователя
void_17  
имя: DM
Ветеран
Ветеран
 
Сообщения: 537
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 122 раз.

Re: База данных IDA от void17

Сообщение void_17 » 28 янв 2022, 10:32

Я специально их и убрал. Размер не тот.

Смотрите адреса 0x55CE72 и 0x55CE35 соответственно.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2161 раз.

Re: База данных IDA от void17

Сообщение AlexSpl » 28 янв 2022, 10:34

Цитата:
Я специально их и убрал. Размер не тот.

Как раз таки тот. Без них не работает.
Вернуться к началу

offlineАватара пользователя
void_17  
имя: DM
Ветеран
Ветеран
 
Сообщения: 537
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 122 раз.

Re: База данных IDA от void17

Сообщение void_17 » 28 янв 2022, 10:36

AlexSpl писал(а):

Цитата:
Я специально их и убрал. Размер не тот.

Как раз таки тот. Без них не работает.


А если размер тот, неужели оператор new врет? Ну не может же такого быть, согласитесь. Какой смысл выделять память неполностью? Или я чего-то не понимаю?
Последний раз редактировалось void_17 28 янв 2022, 10:39, всего редактировалось 1 раз.
Вернуться к началу

offlineАватара пользователя
void_17  
имя: DM
Ветеран
Ветеран
 
Сообщения: 537
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 122 раз.

Re: База данных IDA от void17

Сообщение void_17 » 28 янв 2022, 10:37

AlexSpl писал(а):

Например,

Код: Выделить всё
CSprite *sprite = *(CSprite**)(c->esi + 0x78);
sprite->Draw(0, 2 * (townType + 1), 0, 0, sprite->Width, sprite->Height, pWindowManager->screenBitmap->map, dx, dy,
   pWindowManager->screenBitmap->Width, pWindowManager->screenBitmap->Height, pWindowManager->screenBitmap->ScanlineSize, false, true);

Вот здесь c->esi и есть TSingleSelectionWindow.


Вполне возможно что просто обычный shifted pointer. Как это часто бывает с классом hexcell внутри combatManager-а.
Меня это тоже сбивало с толку, но потом я научился ими пользоваться и находить закономерности и это помогало.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5547
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2161 раз.

Re: База данных IDA от void17

Сообщение AlexSpl » 28 янв 2022, 10:39

Код: Выделить всё
class CSpriteFrame : public resource
{
public:
   int DataSize;
   int ImageSize;
   TEncodingMethod EncodingMethod;
   int Width;
   int Height;
   int CroppedWidth;
   int CroppedHeight;
   int CroppedX;
   int CroppedY;
   int Pitch;
   unsigned char *map;
   _DDSURFACEDESC2 ddsd;
   IDirectDrawSurface4 *ddsurf;
   unsigned long compmap_len;
   unsigned char *tempmem;
};

struct CSequence
{
   int numFrames;
   int allocatedFrames;
   CSpriteFrame *f;
};

struct CSprite : public resource
{
   CSequence *s;
   TPalette16 *p16;
   TPalette24 *p24;
   int numSequences;
   int *validSeqMask;
   int Width;
   int Height;

   inline void Draw(int seqnum, int framenum, int sx, int sy, int sw, int sh, void *dst, int dx, int dy, int dw, int dh, int dpitch, bool hflip, bool tblit)
   {
      CALL_15(void, __thiscall, 0x47B610, this, seqnum, framenum, sx, sy, sw, sh, dst, dx, dy, dw, dh, dpitch, hflip, tblit);
   }
};

Без них неправильное смещение у Width и Height.
Вернуться к началу

Пред.След.

Вернуться в Общий раздел

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6