Windows: атомарно приостановить весь процесс?


С помощью Win32 API можно приостановить только один поток, используя SuspendThread(), но не полный процесс в одном вызове.
Перебирать потоки процесса и приостанавливать их по одному не очень хороший вариант, так как это может привести к блокировкам и неожиданному поведению.

Предполагается, что это возможно в ядре с помощью функции из DDK (название которой я не помню).
Как можно представить эту функцию в пользовательском режиме?

Есть ли какие-либо другой способ достичь этого без обращения к ядру?

Обозреватель процессов SysInternals имеет возможность приостановить процесс. Как он это делает?

2 3

2 ответа:

Недокументированная функция NtSuspendProcess в ntdll.dll звучит как то, что вы ищете. Компании Sysinternals программа pssuspend и процесс Эксплорер как пользоваться этим.

Применяются обычные предостережения относительно недокументированных функций.

Этот ответ содержит еще несколько деталей: Как я могу заморозить выполнение программы?

На самом деле это именно то, что MiniDumpWriteDump Похоже, что да - он по отдельности приостанавливает все потоки в процессе (за исключением вызывающего потока), прежде чем создать дамп.

Это само по себе не должно приводить к тупику или неожиданному поведению, хотя очевидно, что лучше всего это делать из отдельного процесса.