来自汇编程序的Win32 Kernel32.CreateThread

时间:2011-10-12 10:25:24

标签: multithreading x86 assembly disassembly kernel32

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

3 个答案:

答案 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