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
////////////////////////////////////////////
我在我的函数(214D84CD)上放了一个断点,但是在CreateThread之后,在“等待循环”中我的函数没有被调用。 否则,如果我在CreateThread之后调用我的应用程序(而不是等待循环)与许多其他线程,我的函数被调用。
为什么呢?在我的循环中有一些“DoEvents”api强制调用我的线程函数?
线程标识(214D84DD)和返回值EAX不为空。 我在调试器(OllyDbg)中运行我的应用程序。而且我没有使用任何编译器。
非常感谢, 的Riccardo
答案 0 :(得分: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
);
你错了他们。因为在stdcall中,你必须以相反的顺序推送参数,所以应该首先推送lpThreadId。因此应该翻转214D84CD和214D84DD。
答案 1 :(得分:0)
您必须通过'threads'窗口手动切换到新创建的线程。
答案 2 :(得分:0)
是因为CreateThread在DLL的初始化例程中.... :(
“在进程启动和DLL初始化例程期间,可以创建新线程,但是在为进程完成DLL初始化之前它们不会开始执行。”
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682453%28v=vs.85%29.aspx