Вот что происходит:
Если у меня есть два std:: cout после системных вызовов (NtDelayExecution_Syscall и NtWaitForSingleObject_Syscall), все работает как положено.
Если я удалю операторы std::cout (или оставлю только один из них), NtWaitForSingleObject_Syscall вернет 0xC0000008 (неверный дескриптор).
Я проверил значения в регистрах и переменных, и они кажутся правильными перед вызовом NtWaitForSingleObject. Дескриптор, передаваемый функции, является результатом GetCurrentProcess(), который должен быть допустимым.
Вот мой код:
Ассемблерный код (.asm):
Код: Выделить всё
.code
; func NtDelayExecution
NtDelayExecution_Syscall proc
mov rax, 34h
syscall
ret
NtDelayExecution_Syscall endp
; func NtWaitForSingleObject
NtWaitForSingleObject_Syscall proc
mov rax, 04h
syscall
ret
NtWaitForSingleObject_Syscall endp
end
Код: Выделить всё
#define WIN32_LEAN_AND_MEAN
#include
#include
extern "C" LONG NtDelayExecution_Syscall(
BOOLEAN Alertable,
PLARGE_INTEGER DelayInterval
);
extern "C" LONG NtWaitForSingleObject_Syscall(
HANDLE hProcess,
BOOLEAN Alertable,
PLARGE_INTEGER DelayInterval
);
void StartMonitor(HANDLE hProcessToMonitor) {
// Установка нулевого таймаута
LARGE_INTEGER integer;
integer.QuadPart = -10000 * 1000;
LARGE_INTEGER timeout;
timeout.QuadPart = 0;
LONG result;
while (true) {
result = NtDelayExecution_Syscall(FALSE, &integer);
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79037498/mysterious-behavior-with-ntwaitforsingleobject-in-c-returns-invalid-handle-e[/url]