Blokowanie watku

Blokowanie watku
KR
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:353
0

Ciezko jakis temat dobry wybrac, ale niech bedzie ;) Na razie mam dosc pisania i sprawdzania, wiec takie pytanie bardziej teoretyczne, bo jak bede znal sposob to z kodem dam rade.

Sytuacja wyglada tak, ze jestem podpiety pod funkcje(hook).

Wstepne wykonanie:

Kopiuj
77850DA8 > 8BFF             MOV EDI,EDI
77850DAA   55               PUSH EBP
77850DAB   8BEC             MOV EBP,ESP
77850DAD   A1 50A08777      MOV EAX,DWORD PTR DS:[0x7787A050] <-- tu sie podpinam 

W tym miejscu mamy skok do moich funkcji. Teraz tu rodzi sie problem. Czy pakujac moja funkcje w kolejny watek, zaradze temu, ze dopoki nie wykonaja sie moje funkcje i kod nie wroci w to miejsce to oryginalna funkcja nie ruszy dalej?

Istnieje taki problem ze danych jest bardzo duzo, funkcje wykonywane nie sa specjalnie szybkie i w zasadzie proces glowny zostaje zmrozony przy logowaniu tego. Czy tworzac watek wykonanie bedzie asynchroniczne?

Mam juz kilka watkow, ale jakos tego rozwiazania nie jestem pewien, moze ktos jakis lepszy sposob zna. ;)

Ps. Wiem ze tam jest MOV, w czasie runtime'u jest zakladany hook.

edytowany 2x, ostatnio: Krycho
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:4 dni
1

Jako kolejną instrukcje wpisujesz:
JMP $
i róbta co chceta.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
KR
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:353
0

hmm... a ze tak powiem co to "JMP $" zrobi? Bo w tym miejscu jestem w trakcie wykonania funkcji i skacze do innych.

@Edit

Albo ja Cie nie rozumiem albo Ty mnie ;p Ja mam taki flow func -> przerwanie... wykonuje sie moj kod -> powrot i dokonczenie func. Teraz to ma byc tak ze jest func -> przerwanie... ono zostaje gdzies tam oddelegowane i w zasadzie od razu leci dalej wykonanie func.

Kopiuj
	char *buf;

	__asm PUSHAD
	__asm PUSHFD

	// Getting data from func
	__asm mov eax, DWORD PTR [ebp+0xC] // buf pointer
	__asm MOV buf, eax

	func();

	__asm POPFD
	__asm POPAD

	__asm SUB ESP, 0x18
	__asm PUSH EBX
	__asm JMP dwJMPbackRecv

W zasadzie tamten mov jest zly bo podmieniam te 2 instrukcje SUB i PUSH, ale niewazne. Teraz chodzi Ci o to ze jesli dam jmp $ zaraz za tym "oryginalnym" pushem ktory musze tak czy tak wykonac aby nie zaburzyc przebiegu funkcji to watki sie nie zblokuja?

edytowany 1x, ostatnio: Krycho
_13th_Dragon
Odpalasz sobie wątek, twoja funkcja się kończy zaś wątek który przerwałeś swoją funkcję będzie wykonywał JMP $ dopóki nie podmienisz to na oryginalne bajty.
KR
Edit. bo na koment za dlugo ;)
_13th_Dragon
Chodzi o to że pomiędzy func(); a popfd program ma się kręcić w nieskończonej pętli dopóki wątek się nie skończy.
KR
No to wlasnie nie chce zeby ta func blokowala mi wykonywanie dalszej czesci kodu. Czyli ta func musi byc osobnym watkiem, wtedy w watku bedzie sobie cos robila, a program skoczy dalej i nie bedzie zablokowany.
_13th_Dragon
To chyba nie jarzę, przecież chciałeś aby ciekała na wątek ?
KR
Wydawalo mi sie ze jasno opisalem ;p. Domyslnie przeciez kod wykonuje sie po kolei czyli dopoki func i wszystkie to co tam w niej siedzi sie nie wykona i nie wroci w to miejsce do __asm POPFD dopoty moja glowna funkcja shookowana jest zablokowana przez co caly proces jest zblokowany bo czeka na to co zwroci funkcja glowna. Ja chce zeby func() zostala gdzies oddelegowana i kod lecial dalej.
_13th_Dragon
No to normalny wątek, odpalasz i po kłopocie.
KR
No spoko potem to sprawdze, bo jakos nie bylem pewien czy normalny watek to ogarnie ;)
_13th_Dragon
Pamiętaj tylko że może okazać się że nie będzie to jeden wątek.
KR
hmm... wlasnie. Bo jesli w miejsce func wstawie sobie createThread to sie okaze jeszcze ze mi odpali tysiac watkow xD Teoretycznie te watki powinny zyc bardzo krotko. Moge jakos upewnic sie ze zostaja one zakonczone? Funkcja watku gdy dojdzie do endthread w bloku to zakonczy sie na pewno?
_13th_Dragon
Wystarczy że podana funkcja wątku się skończy, nawet nie koniecznie jest wykonanie endthread. No właśnie zastanów się albo pozwalasz że ci się zrobi milion wątków i po jakimś czasie się skończą albo nie robisz wątków i działasz synchronicznie. Jest rozwiązanie pośrednie, tworzysz pule wątków i jeżeli aktualnie działa więcej wątków niż masz w pule to proces czeka na zwolnienie przynajmniej jednego.
KR
Kurcze troche kiepskie rozwiazanie. Nie dosyc ze w jak zaczelo naplywac duzo pakietow to mialem jakies 1000 watkow jednoczesnie, to jeszcze jest problem z przekazywaniem danych, ale to moglbym ominac globalnym kontenerem do zbierania danych. Zastanowie sie nad przyspieszeniem logowania tego, bo przy wielu watkach i tak z tego co widzialem dane byly odbierane z pewnym opoznieniem i niektore jakby znikaly, bo mialem watek nr 1 a potem nagle 5.
_13th_Dragon
Z tym to nie dasz rady walczyć, NIE MA gwarancji że ten co zaczął się wcześniej wcześniej się skończy. Może spróbuj jeden dodatkowy wątek z priorytetem timecritical, oraz z dwutaktowym ładowaniem obrabianych danych.
KR
Przyspiesze raczej wypisywanie i jak rozpoznam juz strukture danego rodzaju pakietu to sobie jakies 50% wywale z monitorowania, bo nie beda mi potrzebne. Nie wiem czy to wszystko az tak warte zachodu ^^. W sumie mam jeszcze 1 pomysl. Powiedz czy poprawny. Jakbym zrobil sobie pewnego rodzaju wspoldzielone dane, tj. W przejetej funkcji robilbym sobie kopie tych danych. W watku mialbym odpalony monitoring zmian tych danych. Wypisuje jesli sie zmienia i czyszcze. Tylko nie wiem czy nie doszloby do omijania czesci pakietow, jesli watek nie wyrobilby sie z obrobka.
_13th_Dragon
Musisz synchronizować i tyle.
KR
A sekcja krytyczna albo zegary oczekujace? Chociaz sekcja krytyczna to moze mala przesada ;p
_13th_Dragon
Wcale nie jest przesada, natomiast zegar oczekujący to bez sensu jak ci nie nadążało.
KR
Czyli moglbym sobie zrobic zasob dzielony ktory zmienialby sie w shookowanej funkcji a w sekcje krytyczna wpakowac obrobke tych danych. Sprawdze to, moze sie uda ;)
KR
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:353
0

Moze sie komus przyda to dam jak to rozwiazalem w koncu ;)

Zrobilem sobie globalna zmienna do monitorowania. W przechwyconej funkcji robie jedynie kopie, a w watku monitoruje zmiany. Jesli pojawi sie w buforze cos nowego to obrabiam to sobie.

Kopiuj
string recvPacket;

// w przechwyconej funkcji
recvPacket.assign(buf,buf+ASyncPos);

// watek

DWORD WINAPI monitorRecv(void *pParams)
{
	recvPacket.clear();
	while(1)
	{
		if(!recvPacket.empty())
		{
			// cos tam robie ;)
		}
		recvPacket.clear();
		Sleep(1);
	}
	return 0;
}

Teraz ladnie wszystko dziala, nie gubie danych z tego co widze i przede wszystkim nie blokuje calego procesu ;)

szopenfx
  • Rejestracja:prawie 21 lat
  • Ostatnio:5 miesięcy
0

Nie lepiej to założyć hook'a na funkcję recv?

KR
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:353
0

A myslisz ze skad przechwytuje pakiety? Przeczytaj od poczatku to dowiesz sie czemu bezposrednio logowanie z przejetej funkcji mi nie pasuje.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.