Windows: атомарно приостановить весь процесс?
С помощью Win32 API можно приостановить только один поток, используя SuspendThread()
, но не полный процесс в одном вызове.
Перебирать потоки процесса и приостанавливать их по одному не очень хороший вариант, так как это может привести к блокировкам и неожиданному поведению.
Предполагается, что это возможно в ядре с помощью функции из DDK (название которой я не помню).
Как можно представить эту функцию в пользовательском режиме?
Есть ли какие-либо другой способ достичь этого без обращения к ядру?
Обозреватель процессов SysInternals имеет возможность приостановить процесс. Как он это делает?
2 ответа:
Недокументированная функция NtSuspendProcess в ntdll.dll звучит как то, что вы ищете. Компании Sysinternals программа pssuspend и процесс Эксплорер как пользоваться этим.
Применяются обычные предостережения относительно недокументированных функций.
Этот ответ содержит еще несколько деталей: Как я могу заморозить выполнение программы?
На самом деле это именно то, что
MiniDumpWriteDump
Похоже, что да - он по отдельности приостанавливает все потоки в процессе (за исключением вызывающего потока), прежде чем создать дамп.Это само по себе не должно приводить к тупику или неожиданному поведению, хотя очевидно, что лучше всего это делать из отдельного процесса.