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

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

我在我的函数(214D84CD)上放了一个断点,但是在 CreateThread 之后,在“等待循环”中我的函数没有被调用。否则,如果我在 CreateThread 之后用许多其他线程调用我的应用程序(而不是等待循环),我的函数就会被调用。

为什么?在我的循环中有一些“DoEvents”api可以强制调用我的线程函数吗?

线程 id (214D84DD) 和返回值 EAX 不为空。我在调试器(OllyDbg)中运行我的应用程序。而且我没有使用任何编译器。

非常感谢,里卡多

4

3 回答 3

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 应该翻转。

于 2011-10-12T14:28:51.560 回答
0

Is because the CreateThread is in the initialization routine of a DLL.... :(

"During process startup and DLL initialization routines, new threads can be created, but they do not begin execution until DLL initialization is done for the process."

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

于 2011-10-13T13:02:27.343 回答
0

您必须通过“线程”窗口手动切换到新创建的线程。

于 2011-10-12T12:41:21.320 回答