Загадочное поведение с NtWaitForSingleObject в C++ — возвращает недопустимую ошибку дескриптора без std::coutC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Загадочное поведение с NtWaitForSingleObject в C++ — возвращает недопустимую ошибку дескриптора без std::cout

Сообщение Anonymous »

Я столкнулся со странной проблемой в своей программе, которая использует в цикле NtWaitForSingleObject и NtDelayExecution. Проблема в том, что функция NtWaitForSingleObject иногда возвращает ошибку 0xC0000008 (STATUS_INVALID_HANDLE), но только тогда, когда я удаляю инструкции std::cout из своего кода. Такое поведение сводит меня с ума, и я не могу понять, в чем дело.
Вот что происходит:
Если у меня есть два 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
Код C++ (.cpp):

Код: Выделить всё

#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]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»