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はnullではありません。アプリケーションをデバッガー(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

「スレッド」ウィンドウを介して、新しく作成されたスレッドに手動で切り替える必要があります。

于 2011-10-12T12:41:21.320 に答える
0

CreateThread が DLL の初期化ルーチンにあるためです.... :(

「プロセスの起動中および DLL の初期化ルーチン中に、新しいスレッドを作成できますが、プロセスの DLL の初期化が完了するまで実行を開始しません。」

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

于 2011-10-13T13:02:27.343 に答える