Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | | |
Все что в ntdll.dll только для user-mode (подсистема win32,... 31.01.05 15:59 Число просмотров: 1324
Автор: leo <Леонид Юрьев> Статус: Elderman
|
Все что в ntdll.dll только для user-mode (подсистема win32, для kernel-mode нужно subsystem='native').
Там еще много чего хорошего/удобного/полезного, я вот туда из delphi часто "хожу" :)
Минус (или плюс?) только один - ntdll.dll нет под win95/98/me.
|
<programming>
|
[Win32] Возможно ли остановить все потоки какого-нибудь процесса одним вызовом API? 31.01.05 15:11
Автор: HandleX <Александр М.> Статус: The Elderman
|
Или перебирать все его потоки, делая им SuspendThread() ???
Как-то не нравится мне "растянутость" сего действа...
Потоки могут создаваться и уничтожаться очень быстро и их может быть тысячи... И кто-то после снятия снэпшота отойдёт в "мир иной", а кто-то новый родится ;-)
Заранее всем спасибо за ответы.
|
|
ntdll.dll::NtSuspendProcess() 31.01.05 15:42
Автор: leo <Леонид Юрьев> Статус: Elderman
|
про Win95/98/Me ничего сказать не могу
|
| |
Ох, вещь... А прототипы можно к ней? И обратной к ней тоже (NtResumeProcess)? 31.01.05 15:50
Автор: HandleX <Александр М.> Статус: The Elderman
|
|
| | |
Мог бы догадаться :) 31.01.05 15:55
Автор: leo <Леонид Юрьев> Статус: Elderman
|
NTSTATUS STDCALL NtSuspendProcess(IN HANDLE Process);
NTSTATUS STDCALL NtResumeProcess(IN HANDLE Process);
|
| | |
И ещё: она в user mode вызывается? 31.01.05 15:55
Автор: HandleX <Александр М.> Статус: The Elderman
|
|
| | | |
Все что в ntdll.dll только для user-mode (подсистема win32,... 31.01.05 15:59
Автор: 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
|
|
| | | | | | | |
Есть ExAquireRundownProtection 31.01.05 18:52
Автор: amirul <Serge> Статус: The Elderman
|
Хотя не знаю, что это за защита, раз есть - значит скорее всего работает как предполагается
|
| | | | | | | | |
Всем спасибо, всё работает! 2 leo & amirul — many thanks!!! 31.01.05 19:26
Автор: HandleX <Александр М.> Статус: The Elderman Отредактировано 31.01.05 19:27 Количество правок: 1
|
|
| | | | | | |
Ты дизассемблировал или есть сорцы этой части W2K? 31.01.05 17:48
Автор: leo <Леонид Юрьев> Статус: Elderman
|
|
| | | | | | | |
Дизассемблировал, потому как именно этой функции в сырцах и нету 31.01.05 18:49
Автор: amirul <Serge> Статус: The Elderman
|
Да собственно, там и дизассемблировать то нечего:
nt!PsSuspendProcess:
80607738 53 push ebx
80607739 57 push edi
8060773a 8b7c240c mov edi,[esp+0xc]
8060773e 8d9f80000000 lea ebx,[edi+0x80]
80607744 8bcb mov ecx,ebx
80607746 e8c617f7ff call nt!ExAcquireRundownProtection (80578f11)
8060774b 84c0 test al,al
8060774d 7426 jz nt!PsSuspendProcess+0x3d (80607775)
8060774f 56 push esi
80607750 6a00 push 0x0
80607752 eb09 jmp nt!PsSuspendProcess+0x25 (8060775d)
80607754 6a00 push 0x0
80607756 56 push esi
80607757 e89e48faff call nt!PsSuspendThread (805abffa)
8060775c 56 push esi
8060775d 57 push edi
8060775e e8384ef6ff call nt!PsGetNextProcessThread (8056c59b)
80607763 8bf0 mov esi,eax
80607765 85f6 test esi,esi
80607767 75eb jnz nt!PsSuspendProcess+0x1c (80607754)
80607769 8bcb mov ecx,ebx
8060776b e8d817f7ff call nt!ExReleaseRundownProtection (80578f48)
80607770 33c0 xor eax,eax
80607772 5e pop esi
80607773 eb05 jmp nt!PsSuspendProcess+0x42 (8060777a)
80607775 b80a0100c0 mov eax,0xc000010a
8060777a 5f pop edi
8060777b 5b pop ebx
8060777c c20400 ret 0x4
nt!NtSuspendProcess:
8060777f 55 push ebp
80607780 8bec mov ebp,esp
80607782 51 push ecx
80607783 56 push esi
80607784 64a124010000 mov eax,fs:[00000124]
8060778a 8a8040010000 mov al,[eax+0x140]
80607790 6a00 push 0x0
80607792 8845fc mov [ebp-0x4],al
80607795 8d4508 lea eax,[ebp+0x8]
80607798 50 push eax
80607799 ff75fc push dword ptr [ebp-0x4]
8060779c ff35587c5480 push dword ptr [nt!PsProcessType (80547c58)]
806077a2 6800080000 push 0x800
806077a7 ff7508 push dword ptr [ebp+0x8]
806077aa e83080f6ff call nt!ObReferenceObjectByHandle (8056f7df)
806077af 8bf0 mov esi,eax
806077b1 85f6 test esi,esi
806077b3 7c12 jl nt!NtSuspendProcess+0x48 (806077c7)
806077b5 ff7508 push dword ptr [ebp+0x8]
806077b8 e87bffffff call nt!PsSuspendProcess (80607738)
806077bd 8b4d08 mov ecx,[ebp+0x8]
806077c0 8bf0 mov esi,eax
806077c2 e80926eeff call nt!ObfDereferenceObject (804e9dd0)
806077c7 8bc6 mov eax,esi
806077c9 5e pop esi
806077ca c9 leave
806077cb c20400 ret 0x4
---
|
|
Одним думаю не получицца 31.01.05 15:28
Автор: Killer{R} <Dmitry> Статус: Elderman
|
Но можно извернуться - перехватить CreateThread (и соответствующую нативную ZwCreateThread) и замораживать сам процесс создания новых потоков Ж). А то что старые могут умереть к тому времени.. Ну чтож - это в принципе не так страшно, для профилактики можно приоритет процесса выставить в IDLE а свой - REALTIME.
|
|
|