Win32 Kernel32.CreateThread от ассемблера - PullRequest
0 голосов
/ 12 октября 2011
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 мое приложение (а не цикл ожидания) со многими другими потоками, моя функция вызывается.

Почему? Есть некоторый API DoEvents, чтобы заставить мой цикл вызывать мою функцию потока?

Идентификатор потока (214D84DD) и возвращаемое значение EAX не равны нулю. Я запускаю свое приложение в отладчике (OllyDbg). И я не использую никакой компилятор.

Большое спасибо, Риккардо

Ответы [ 3 ]

1 голос
/ 12 октября 2011
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 должны быть перевернуты.

0 голосов
/ 13 октября 2011

Это потому, что CreateThread находится в подпрограмме инициализации DLL ....: (

"Во время запуска процесса и подпрограммы инициализации DLL могут быть созданы новые потоки, но они не начинают выполнение до тех пор, пока DLLинициализация для процесса. "

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

0 голосов
/ 12 октября 2011

Вы должны вручную переключиться на вновь созданную тему через окно «Потоки».

...