Ostatnio zainteresował mnie temat thunków. Siedzę i kombinuję, ale gdzieś robię błąd i nie mogę wpaść na to gdzie. Przy okazji mam też kilka pytań na temat assembly.
EDIT: kod usunalem poniewaz znalazlem zrodlo problemow. Jak to przewaznie bywa - sprawka braku wiedzy ;)
1. Czy jest w ogóle możliwe ZUPEŁNE ominięcie statycznej/globalnej funkcji? I jeśli tak, to można docelową metodę wywołać konwencją thiscall, żeby nie ruszać parametru HWND już na wejściu?
Przekonalem sie, ze to w sumie nic trudnego. Wystarczy thunk robiacy miejsce miedzy HWND a adresem powrotu i wrzucajacy tam pointer instancji klasy. Oczywiscie metoda musi byc oznaczona jako __stdcall.
Jednak pojawia sie inny problem, poniewaz oszukujac kompilator thunkiem, nie mozna uzyc powrotu z funkcji w stylu
return DefWindowProc( hwnd, msg, wparam, lparam )
. Najpierw trzeba przywrocic stos do pierwotnej formy czyli wywalic wskaznik klasy oraz poprzesuwac argumenty. Rozwiazanie z zastapieniem HWND jest lepsze i prostsze. Coz... przynajmniej sie czegos nauczylem :)
2. Rev w tym poście http://4programmers.net/Forum/1048116 użył dla
JMP
opkodu E9, co wyczytałem w manualu Intela, że podaje się jako operand adres relatywny. Dlaczego nie użyć tutaj np. FF25</del> juz ogarniam z grubsza w czym rzecz.
3. Czy można w thunkach swobodnie mieszać argumentami potencjalnie wywołanej funkcji zakładając, że nie będzie się gmyrać ze stosem? Czyli np. rozbijając LPARAM na dwa 16 bitowe wartości i wrzucenie jednej z nich na miejsce nieużywanego WPARAM?
5. Czy ta strona https://defuse.ca/online-x86-assembler.htm#disassembly jest dobrym źródłem na sklecanie bytecode'u czy lepiej tworzyć pseudo-programy np. w NASM i stamtąd brać opkody?
6. Jak wygląda użycie thunków w przypadku dziedziczenia i metod wirtualnych? Rozumiem, że bez "ręcznego" znajdowania adresu vtable, indeksu metody i delty "thisa" się nie obejdzie?
7. Kod 32-bitowy, VS2012 CTP nov 2012. non-portable mnie nie uwiera ;)
Z góry dziękuję za odpowiedzi i wskazówki :)