Запретить APC пользовательского режима из пользовательского режима - PullRequest
0 голосов
/ 14 сентября 2018

Код режима ядра может предотвратить некоторые или все асинхронные вызовы процедур (APC), введя критическую или защищенную область или Повышение текущего IRQL .Таким образом, возможно выполнение кода, содержащего ожидаемые оповещения, без помех от APC.

Существует ли аналогичный способ для кода пользовательского режима (временно) отключать APC пользовательского режима в текущем потоке?


Я был бы рад получить ответы как для управляемого, так и для неуправляемого кода.Я уже проверил, что следующие методы не работают:

  • критические секции (EnterCriticalSection / LeaveCriticalSection)
  • мьютексы stdlib (std::mutex,std::recursive_mutex, ...)
  • функции управляемой синхронизации (lock операторы, MethodImpl(MethodImplOptions.Synchronized) аннотация)

1 Ответ

0 голосов
/ 15 сентября 2018

Нет. Единственные варианты предотвращения появления APC в пользовательском режиме:

  • Во-первых, не планируя APC
  • Не выполняется ожидание с предупреждением
  • Планирование APC в другом потоке
  • Перемещение всех ожидающих оповещений в другой поток, для которого нет запланированных APC или которые не разрешают ожидающие оповещения в первую очередь

    QueueUserWorkItem кажется хорошим кандидатом при использовании WT_EXECUTEDEFAULT:

    Функция обратного вызова ставится в очередь в потоке, который [...] не может выполнить ожидаемое оповещение.

(Спасибо RbMm за гарантию того, что в комментариях нет API пользовательского режима для отключения APC)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...