Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как "заморозить" процесс? Приостановить процесс 
:(
    Опции темы
Jetus
  Дата 24.2.2005, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 16.2.2005
Где: Украина, Хмельниц кий

Репутация: 1
Всего: 1



Каким образом можно приостановить выбранный процесс?
Например, приостановить процесс чата в локальной сети, чтобы окно оставалось, но никаких сообщений программа не обрабатывала.

Я так понимаю, что сначала надо по имени процесса получить его PID, потом по этому PID найти главный поток и сделать ему SuspendThread(ThreadHandle)? smile
PM MAIL ICQ   Вверх
Александра
Дата 24.2.2005, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 20.2.2005
Где: Москва

Репутация: 1
Всего: 12



Jetus
совершенно верно smile
--------------------
PM   Вверх
Петрович
Дата 24.2.2005, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 15
Всего: 55



Только тогда и его окошко перерисовываться не будет.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
legwar
Дата 24.2.2005, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 24.12.2004
Где: Москва

Репутация: нет
Всего: нет



Sleep(dwMilliseconds:DWORD);
Kernel32.dll
PM MAIL ICQ   Вверх
Александра
Дата 24.2.2005, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 20.2.2005
Где: Москва

Репутация: 1
Всего: 12



legwar
слип не останавливает, а передает процессорное время на указанное кол-во милисекунд другим процессам или потокам, причем удаленно его не сделать.

Петрович
??? тут же останавливается поток, который сообшения по сетки ловит?

Это сообщение отредактировал(а) Александра - 24.2.2005, 16:10
--------------------
PM   Вверх
Петрович
Дата 24.2.2005, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 15
Всего: 55



Цитата
Петрович
??? тут же останавливается поток, который сообшения по сетки ловит?

Я не понял что этим ты хотела сказать.
Я в в своем посте имел ввиду то, что отрисовка окна делается самим процессом, причем обычно его главным потоком. Соответственно, если приостановить тот поток процесса который обрабатывает WM_PAINT то, окно на экране останется лиш до тех мор пока его не подпортят. Например, если по нему проедутся другим окном, то затертая часть изображения не восстановится. Кроме того, естественно, такое окно нельзя будет ни таскать, ни перемещать, пока не "отпустят" поток.
А я так понял, что Jetus хочет что-бы окно-то осталось. Он хочет только приостановить прием сообщений по сетке.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Александра
Дата 24.2.2005, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 20.2.2005
Где: Москва

Репутация: 1
Всего: 12



Петрович
ну да, т.е. все и будет рисоваться а прием просто остановится... все верно...
--------------------
PM   Вверх
Jetus
Дата 24.2.2005, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 16.2.2005
Где: Украина, Хмельниц кий

Репутация: 1
Всего: 1



Так мне так и надо - чтобы процесс полностью "замёрз".
А как это осуществить? Я пробовал, но ничего не вышло smile
PM MAIL ICQ   Вверх
_hunter
Дата 24.2.2005, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



останавливай все потоки процесса. а что пробовал?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
p0s0l
Дата 26.2.2005, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Код
uses TlHelp32;

function OpenThread (dwDesiredAccess : DWORD; bInheritHandle : BOOL; dwThreadId : DWORD) : THandle; stdcall; external 'kernel32.dll';

const
 THREAD_SUSPEND_RESUME = $0002;

procedure SetSuspendState (PID : DWORD; Resume : Boolean);
var
 hSnap, hThread : THandle;
 te32 : THREADENTRY32;
begin
 hSnap := CreateToolhelp32Snapshot (TH32CS_SNAPTHREAD, 0);
 te32.dwSize := SizeOf(te32);
 if Thread32First (hSnap, te32) then
 repeat
   if te32.th32OwnerProcessID = PID then
   begin
     hThread := OpenThread (THREAD_SUSPEND_RESUME, False, te32.th32ThreadID);
     if Resume then ResumeThread (hThread)
     else SuspendThread (hThread);      
     CloseHandle (hThread);
   end;
 until not Thread32Next (hSnap, te32);
 CloseHandle (hSnap);
end;

Если нужно остановить какой-то процесс, к примеру, на 5 сек, то будет так:
Код
SetSuspendState (ProcessID, False);
Sleep (5000);
SetSuspendState (ProcessID, True);


PS: OpenThread нет в Win9x, поэтому там будет облом. Если надо, чтобы работало под 9x, то смотри "Арсенал" - там Girder приводил функцию OpenThread для всех версий винды...



--------------------
С уважением, г-н Посол.
PM   Вверх
Jetus
Дата 27.2.2005, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 16.2.2005
Где: Украина, Хмельниц кий

Репутация: 1
Всего: 1



Большое спасибо, p0s0l! smile
PM MAIL ICQ   Вверх
Jetus
Дата 28.2.2005, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 16.2.2005
Где: Украина, Хмельниц кий

Репутация: 1
Всего: 1



Уважаемый p0s0l, твой код отлично работает и я стал пробовать его на всех процессах подряд - останавливался даже поток System. Однако меня постигло разочарование, когда я попробовал остановить процесс navapsvc.exe - это служба Norton Antivirus'a. Этот процесс не желал останавливаться ни в какую! Даже принудительно завершатся не хочет через TaskManager и другие подобные менеджеры процессов. Как это может быть? Неубиваемый процесс??? smile
PM MAIL ICQ   Вверх
Girder
Дата 28.2.2005, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



попробуй включить привелегию: SE_DEBUG_NAME


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
p0s0l
Дата 28.2.2005, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Делается это так:
Код
procedure SetDebugPrivilege (Enabled : Boolean);
var hToken : THandle;
   TokenPriv, PrevTokenPriv : TOKEN_PRIVILEGES;
   Tmp : DWORD;
begin
 OpenProcessToken (GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);
 LookupPrivilegeValue (nil, 'SeDebugPrivilege', TokenPriv.Privileges[0].Luid);
 TokenPriv.PrivilegeCount := 1;
 TokenPriv.Privileges[0].Attributes := 0;
 if Enabled then TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
 Tmp := 0;
 PrevTokenPriv := TokenPriv;
 AdjustTokenPrivileges (hToken, False, TokenPriv, SizeOf(PrevTokenPriv), PrevTokenPriv, Tmp);
 CloseHandle (hToken);
end;
Тогда выглядеть всё будет примерно так:
Код
 SetDebugPrivilege (True);
 SetSuspendState (ProcessID, False);
 Sleep (5000);
 SetSuspendState (ProcessID, True);




--------------------
С уважением, г-н Посол.
PM   Вверх
RA
Дата 28.2.2005, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115



Цитата(Girder @ 28.2.2005, 10:29)
попробуй включить привелегию: SE_DEBUG_NAME


Не поможет.
Добавлено @ 19:52
Цитата(Jetus @ 28.2.2005, 10:16)
Как это может быть? Неубиваемый процесс???


Теоретически процесс убиваемый просто нужно обойти хук, каторым он защищен.
Как правило речь идет о некой специфической dll в каждом твоём процессе.





PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0918 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.