[C++|WinApi] Dll - pluginy

0

Taka opcja mnie zastanawia ostatnio.
Mam dwa pliki dll ladowane przez ten sam proces. Pierwszy dll exportuje pewna funkcje. Drugi z tej funkcji korzysta.
Czy jest mozliwosc i jesli tak, to jaka aby w tej funkcji w momencie wywolania przez drugi dll uzyskac handle do niego?

Dziekuje za odpowiedzi.

0
Malcolm napisał(a)

Taka opcja mnie zastanawia ostatnio.
Mam dwa pliki dll ladowane przez ten sam proces. Pierwszy dll exportuje pewna funkcje. Drugi z tej funkcji korzysta.
Czy jest mozliwosc i jesli tak, to jaka aby w tej funkcji w momencie wywolania przez drugi dll uzyskac handle do niego?

To zależy...
Jeśli oba DLL nie wiedzą nic o sobie (w konteksie plugina to chyba dobre założenie) to cała robota spada na główny program, powiedzmy, że ładując drugiego DLLa musi wywołać coś w stylu

PluginInit(INFO *info)

i podać mu kilka interesujących DLL parametrów (np. uchwyt okna, uchwyt tego inngo DLLa :) , itp.) w strukturze INFO, które plugin skopiuje do swojej pamięci/bufora. Czy o coś takiego Ci chodzi? Bo trochę zamieszałeś...

0

A staralem sie nieskomplikowanie opisac :)

Chodz mi o to by w tej konkretnej eksportowanej funkcji pobrac handle do dll'a ktory ja wywoluje.

Swoja droga to jakos bez przekonania napisalem to pytanie :)
Proboje napisac system pluginow wykorzystujacy dll injection, jeden z dll'i musi eksportowac funkcje, ktora ma nadpisywac funkcje wywolywane przez glowny program z systemu tymi w pluginach i wynik oczywiscie zwracac do aplikacji.
Problem mam wlasnie w momencie komunikacji glowny dll <--> pluginy.

Troche zakrecony temat, ale jakos mnie meczy skoro juz zaczalem to pisac :)

Jak dysponujesz jakimis linkami, ktore nie sa na pierwszych 5 stronach google to chetnie sie przygladne. Ewentualnie na gg zapraszam.

0
Malcolm napisał(a)

Chodz mi o to by w tej konkretnej eksportowanej funkcji pobrac handle do dll'a ktory ja wywoluje.

Znaczy myślałem, że one nie wiedzą o sobie... Hmmm, w DllMain dostajesz HINSTANCE DLLa, wystarczy zapisać sobie, a skoro to ten DLL wywołuje funkcję z pierwszego DLL to można przekazać jako parametr co tylko chcesz, np. jego HINSTANCE... Coś w stylu:
{DLL1: export foo(HINSTANCE hi);} <--- {DLL2: DLL1.foo( myinstance );}

Z drugiej strony wewnątrz tej funkcji można chyba wywołać GetModuleHandle(), no tylko trzeba by znać nazwę DLLa2, co też można przez przekazanie parametru zrobić...

Kwestia odpowiedniego projektu systemu pluginów.

[jeśli gdzieś się walnąłem z działaniem tego to sory ale jest dosć późno :>]

Malcolm napisał(a)

Swoja droga to jakos bez przekonania napisalem to pytanie :)
Proboje napisac system pluginow wykorzystujacy dll injection, jeden z dll'i musi eksportowac funkcje, ktora ma nadpisywac funkcje wywolywane przez glowny program z systemu tymi w pluginach i wynik oczywiscie zwracac do aplikacji.
Problem mam wlasnie w momencie komunikacji glowny dll <--> pluginy.
Troche zakrecony temat, ale jakos mnie meczy skoro juz zaczalem to pisac :)
Jak dysponujesz jakimis linkami, ktore nie sa na pierwszych 5 stronach google to chetnie sie przygladne. Ewentualnie na gg zapraszam.

Dżi, ale po co dll-injection?????????? Wszystko można załatwić w pluginach bez takich sztuczek.

0

No gdyby mialo przekazywac jako parametr to bym w ogole nie pytal :)

A poco dll injection? Bo ma dzialac na '98 w gore, a korzystajac z haczkow nie hulalo jak trzeba. Zreszta najtrudniejsze za mna (dll injection), zostalo mi wlasnie rozwiazac opcje z nadpisywaniem funkcji i udostepnianiem tego pluginom.

Moze to wkoncu rozgryze, wlasnie google zaczely zeznawac :D

Szczerze mowiac wiecej to sie naczytalem niz samego pisania bylo zeby dobrnac do tego momentu (w ktorym zreszta stoje). Szkoda tylko, ze polska czesc internetu jest straszliwie uboga jesli chodzi o jakiekolwiek bardziej zaawansowane tematy. :(

0

to proste:
-masz adres funkcji, ok
-szukasz wstecz dworda 0x00004550 czyli PE header
-potem szukasz też wstecz worda 0x5A4D czyli MZ header
-i to właśnie uchwyt do modułu :)
...czyli:

HMODULE GetModuleHandleFromProc (void* proc)
{
    BYTE *funkcja = (BYTE*) proc;
 
        while( ((DWORD*)funkcja)[0] != 0x00004550) 
            funkcja--; 
        
        while( ((WORD*)funkcja)[0] != 0x5A4D) 
            funkcja--; 
    
    return (HMODULE) funkcja;
};

1 użytkowników online, w tym zalogowanych: 0, gości: 1