2011-10-12 3 views
0
Hi to all.... 

//////////////////////////////////////////// 

PUSH 214D84DD // thread id address out 
PUSH 0 
PUSH 0 
PUSH 214D84CD // my function address to run in the thread 
PUSH 0 
PUSH 0 
CALL DWORD PTR DS:[4EBD1204] // KERNEL32.CreateThread 


waiting_label: 
NOP 
JMP waiting_label 

//////////////////////////////////////////// 

Je mets un point d'arrêt sur ma fonction (214D84CD), mais après la CreateThread, dans la « boucle d'attente » ma fonction n'est pas appelée. Sinon, si j'appelle CreateThread mon application (et non la boucle d'attente) avec beaucoup d'autres threads, ma fonction est invoquée.Win32 Kernel32.CreateThread assembleur de

Pourquoi? Il y a des API "DoEvents" à forcer dans ma boucle pour appeler ma fonction de thread?

L'ID de thread (214D84DD) et la valeur de retour EAX ne sont pas NULL. Je cours mon application dans un débogueur (OllyDbg). Et je n'utilise aucun compilateur.

Un grand merci, Riccardo

+0

Vous Pusing les arguments dans le mauvais ordre Utilisez un compilateur –

+0

je pense que l'ordre est correct, car dans le débogueur je vois: | pSecurity = NULL | StackSize = 0 | ThreadFunction = 214D84CD | pThreadParm = NULL | CreationFlags = 0 \ pThreadId = 214D84DD – Riccardo

Répondre

0

Vous devez passer manuellement au fil nouvellement créé par la fenêtre « fils ».

+0

Je vois mon nouveau fil dans la fenêtre fils, mais si je double cliquez dessus, le débogueur me montrer le module ntdll et non mon module . Que puis-je faire? merci – Riccardo

1
HANDLE WINAPI CreateThread(
    __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, 
    __in  SIZE_T dwStackSize, 
    __in  LPTHREAD_START_ROUTINE lpStartAddress, 
    __in_opt LPVOID lpParameter, 
    __in  DWORD dwCreationFlags, 
    __out_opt LPDWORD lpThreadId 
); 

vous les passez mal. Puisque dans stdcall, vous devez pousser l'argument dans l'ordre inverse, lpThreadId devrait être poussé en premier. 214D84CD et 214D84DD doivent donc être retournés.

+0

je suis tellement désolé ... je me trompe de couper et coller le code dans mon message, ma commande est comme vous l'avez dit et je confirme que ne fonctionne pas ... merci ... – Riccardo

+0

Quelle est la valeur de retour quand vous appeler la fonction? si c'est nul, quelle est la valeur de LastErr (dans l'écran Registres) – JosephH

+0

EAX = 00000184 LastErr = ERROR_SUCCESS (00000000) 214D84DD = 00000840 (ça change) – Riccardo

0

Est-ce parce que le CreateThread est dans la routine d'initialisation d'une DLL .... :(

« Lors du démarrage du processus et des routines d'initialisation de DLL, de nouveaux threads peuvent être créés, mais ils ne commencent pas l'exécution jusqu'à ce que l'initialisation de DLL ... est fait pour le processus »

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682453%28v=vs.85%29.aspx

+0

s'il vous plaît être détaillé que possible lorsque vous posez une question. – JosephH