@armadillo-cld

Как передать управление в __asm?

Всем привет.
Допустим, есть такой код:
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
	PROCESSENTRY32 entry;
	DWORD procID = 0;
	if (Process32First(snapshot, &entry) == TRUE) {
		while (Process32Next(snapshot, &entry) == TRUE) {
			if (strcmp(entry.szExeFile, "Checker.exe") == 0) {
				procID = entry.th32ProcessID;
			}
		}
	}
	
	if (procID != 0) {
		HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS | PROCESS_VM_READ, NULL, procID);
		__asm {
			mov eax, hProcess
			push eax
			push 0
			call TerminateProcess
		}
	}

Но при выполнении этого кода:
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS | PROCESS_VM_READ, NULL, procID);
		__asm {
			mov eax, hProcess
			push eax
			push 0
			call TerminateProcess
		}

Он просто игнорирует. Не закрывает процесс.
Как правильно передать управление в __asm?

Проверял, процесс детектит, в hProcess не NULL!
  • Вопрос задан
  • 75 просмотров
Решения вопроса 2
@galaxy
Keyword	Stack cleanup	Parameter passing
__stdcall	Callee	Pushes parameters on the stack, in reverse order (right to left)

https://docs.microsoft.com/en-us/cpp/cpp/argument-...

push 0
push eax
call TerminateProcess
Ответ написан
Комментировать
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Как правильно передать управление в __asm?

Проблема не в том, что ты "не смог передать управление в __asm", а в том, что внутри __asm ты перепутал порядок аргументов функции TerminateProcess: аргументы передаваемые через стек в конвенции __stdcall кладутся на него в обратном порядке. Попробуй
__asm {
      mov eax, hProcess
      push 0
      push eax
      call TerminateProcess
    }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы