Ok, więc mi się udało zauważyć tyle (w sumie nie mam specjalnego doświadczenia w tych sprawach, więc mogę się mylić):
- Ładujesz dynamicznie (albo chyba raczej prolog kompilatora ładuje) bibliotekę mbrola.dll
- Pobierasz po kolei z niej adresy funkcji - naliczyłem 23 ładowane funkcje, chociaż biblioteka eksportuje 25. Nie wiem jakie bo nie chciało mi się sprawdzać :P (pesymistycznie ponad 500 porównań) i to pewnie nic ważnego (patrz koniec i obrazy pamięci, tam jest lista wczytanych). Ważne: wszystkie adresy, razem z HMODULE otrzymanym z LoadLibrary zostają zapisane w pamięci. (patrz p. B)
- Następnie wykonywanie kodu leci dalej, przez main, wchodzi do SyntCore::SayIt(char *)
- Wywołuje MbrolaDllLoading::MbrStart(void), wszystko jak na razie OK.
- Sterowanie przechodzi do SyntSettings::LoadSets(void), przy czym otrzymuje 2 parametry. Na początku się nad tym głowiłem a później załapałem że to __thiscall - metoda klasy otrzymuje pewnie instancje klasy. Tak czy inaczej (jeśli wierzyć temu co widzę - a mogę źle interpretować) drugi parametr to wskaźnik do HMODULE z mbrola.dll
- Wywołanie leci w tej funkcji, kilka wywołań typu SyntSettings::CurrentSetInfo(void), porównanie czegoś z "NO ERROR" i takie tam.
- dużo wywołań na istreamach
- już prawie koniec - stworzenie (?) ostringstreama.
- do edi przenosimy drugi (a właświe pierwszy) argument funkcji - czyli HMODULE mbrola.dll
A. do edx przenosimy [edi + 70h] (czyli w c++ w rodzaju edx = edi[0x70] - w sumie raczej edi[28] bo mówimy o dwordach )
B. zapomniałem napisać... to niby-hmodule w pamięci wygląda tak:
[wskaźnik do załadowanej do pamięci biblioteki]
[wskaźniki do eksportowanych funkcji * 23 (te 23 ładowane funkcje) ]
czyli edi[X] oznacza odwołanie do X funkcji
C. No a odwołanie do edi[28] oznacza odwołanie do 28 funkcji, której nie ma.
D. i wywołujemy edx.
dokładnie fragment [8..D] wygląda tak:
.text:0130B38B call ??0?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@H@Z
.text:0130B390 mov edi, [esp+64Ch+arg_do_calla]
.text:0130B397 mov byte ptr [esp+64Ch+var_4], 1Ch
.text:0130B39F fld [esp+64Ch+var_5D0]
.text:0130B3A3 mov edx, [edi+70h] ; 70-ty element tablicy czy co 0_o Tak czy inaczej [0 + 70]
.text:0130B3A6 push ecx
.text:0130B3A7 fstp [esp+650h+var_650]
.text:0130B3AA call edx
a niby-hmodule w pamięci wygląda tak:
.data:013358CC ParametrDoEdi dd offset unk_10000000 ; DATA XREF: SyntCore::SyntCore(void)+33o
.data:013358CC ; SyntCore::~SyntCore(void):loc_13030A8o ...
.data:013358D0 dd offset mbrola_init_MBR
.data:013358D4 dd offset mbrola_init_rename_MBR
.data:013358D8 dd offset mbrola_write_MBR
.data:013358DC dd offset mbrola_flush_MBR
.data:013358E0 dd offset mbrola_read_MBR
.data:013358E4 dd offset mbrola_readtype_MBR
.data:013358E8 dd offset mbrola_close_MBR
.data:013358EC dd offset mbrola_reset_MBR
.data:013358F0 dd offset mbrola_lastError_MBR
.data:013358F4 dd offset mbrola_lastErrorStr_MBR
.data:013358F8 dd offset mbrola_setNoError_MBR
.data:013358FC dd offset mbrola_getNoError_MBR
.data:01335900 dd offset mbrola_setFreq_MBR
.data:01335904 dd offset mbrola_getFreq_MBR
.data:01335908 dd offset mbrola_setVolumeRatio_MBR
.data:0133590C dd offset mbrola_getVolumeRatio_MBR
.data:01335910 dd offset mbrola_getVersion_MBR
.data:01335914 dd offset mbrola_getDatabaseInfo_MBR
.data:01335918 dd offset mbrola_setParser_MBR
.data:0133591C dd offset mbrola_init_Phone
.data:01335920 dd offset mbrola_reset_Phone
.data:01335924 dd offset mbrola_close_Phone
.data:01335928 dd offset mbrola_appendf0_Phone
.data:0133592C dd 0
.data:01335930 dd 0
.data:01335934 dd 0
.data:01335938 dd 0
.data:0133593C dd 0 ; a do tego się odwołujesz
Sorry za chaotyczność, pisałem jednocześnie wchodząc w głąb pliku. Mam nadzieję że nie namieszałem za bardzo i nie pomyliłem się w ocenie czegoś (dalej nie wiem co to HMODULE tam robi...)
edit: minuta spóźnienia :D