Все что в ntdll.dll только для user-mode (подсистема win32, для kernel-mode нужно subsystem='native').
Там еще много чего хорошего/удобного/полезного, я вот туда из delphi часто "хожу" :)
Минус (или плюс?) только один - ntdll.dll нет под win95/98/me.
Или перебирать все его потоки, делая им SuspendThread() ???
Как-то не нравится мне "растянутость" сего действа...
Потоки могут создаваться и уничтожаться очень быстро и их может быть тысячи... И кто-то после снятия снэпшота отойдёт в "мир иной", а кто-то новый родится ;-)
Заранее всем спасибо за ответы.
ntdll.dll::NtSuspendProcess()31.01.05 15:42 Автор: leo <Леонид Юрьев> Статус: Elderman
Все что в ntdll.dll только для user-mode (подсистема win32, для kernel-mode нужно subsystem='native').
Там еще много чего хорошего/удобного/полезного, я вот туда из delphi часто "хожу" :)
Минус (или плюс?) только один - ntdll.dll нет под win95/98/me.
Ну и напоследок: у замороженного таким способом процесса можно запустить отдельный поток(и) вызовом ResumeThread(), т.е...31.01.05 16:06 Автор: HandleX <Александр М.> Статус: The Elderman
Она работает как обычный SuspendThread, увеличивая счётчик "саспендности" каждого потока, или же фиг вам до особого вызова ResumeProcess?
Если увеличивает счётчики потоков, значит их состояние как-бы запоминается до остановки, поскольку не нужно, чтобы уже остановленные потоки (до вызова SuspendProcess), вдруг, после вызова ResumeProcess(), ВСЕ ломанулись как бешенные ;-)
В NT у процесса нет понятия "замороженности", и насколько я...31.01.05 17:46 Автор: leo <Леонид Юрьев> Статус: Elderman
В NT у процесса нет понятия "замороженности", и насколько я знаю в KPROCESS и ЕPROCESS нет полей, которые за это отвечают. Поэтому NtSuspendProcess() может только за-suspend-ить все треды. Другое дело, что при этом будет блокирована база данных диспетчера, и новые треды не должны создаваться при всем желании. Поэтому, думаю, что после NtSuspendProcess() можно бес проблем запустить отдельный поток через NTResumeThread().
Есть один "хитрый" момент в случае race между NtCreateThread() и NtSuspendProcess(). Когда suspend уже захватил блокировку, а create уже выполняется в режиме ядра и с race-опозданием дошел до той-же блокировки. Теоретически возможно, что create продолжит выполнение и создаст новый выполняющийся поток, сразу после того, как suspend остановит все существовавшие до этого потоки и отпустит блокировку. Но думаю, что такая ситуация предусмотренна и все продуманно.
Вроде можно31.01.05 17:41 Автор: amirul <Serge> Статус: The Elderman
> Она работает как обычный SuspendThread, увеличивая счётчик > "саспендности" каждого потока, или же фиг вам до особого > вызова ResumeProcess? Только что посмотрел, в цикле саспендятся все потоки процесса (ну а саспенд потока - это увеличение SuspendCount-а)
А блокировка есть какая-нибудь перед перебором (для обеспечения атомарности)?31.01.05 17:50 Автор: HandleX <Александр М.> Статус: The Elderman Отредактировано 31.01.05 17:51 Количество правок: 1
Хотя не знаю, что это за защита, раз есть - значит скорее всего работает как предполагается
Всем спасибо, всё работает! 2 leo & amirul — many thanks!!!31.01.05 19:26 Автор: HandleX <Александр М.> Статус: The Elderman Отредактировано 31.01.05 19:27 Количество правок: 1
Но можно извернуться - перехватить CreateThread (и соответствующую нативную ZwCreateThread) и замораживать сам процесс создания новых потоков Ж). А то что старые могут умереть к тому времени.. Ну чтож - это в принципе не так страшно, для профилактики можно приоритет процесса выставить в IDLE а свой - REALTIME.