Вверх ↑
Ответов: 3889
Рейтинг: 362
#1: 2012-02-03 10:01:09 ЛС | профиль | цитата
[offtop]Что-то не дают общественности покоя кулхацкерские техники, я погляжу, их есть у меня, вот только потяните ли Вы - большой вопрос [/offtop]
Net2Com писал(а):
Как правильно приостановить чужое приложение?
Запуститься с повышенными привилегиями. Перечислить все потоки процесса-жертвы через CreateToolhelp32Snapshot, включая внешние библиотеки. Применить к каждому потоку функцию API SuspendThread. Регулярно следить, не запустит ли кто-нибудь в приложении поток без нашего ведома (например, по зарегистрированному Call-back) и считать свои секунды. По истечении требуемого интервала запустить все потоки через ResumeThread и молиться, что они не рассинхронизируются и всё не вылетит к чёртовой бабушке. Единственный случай, когда проблем наверняка не будет - однопоточное приложение, не использующее на момент заморозки асинхронных функций API (то есть без таймеров, ожидания соединения по портам, сокетам, прочих сообщений от системы). В общем, такого почти не бывает в реальной жизни.

Другими словами, Вы слишком многого хотите, 100% "правильно" (то есть без возможных негативных эффектов) приостановить чужое приложение невозможно. Единственный грамотный метод я Вам уже описал, но любая заморозка нарушает стабильность приложения-жертвы, и тут встаёт вопрос - насколько пряморукий человек писал то приложение, учитывал ли он возможную рассинхронизацию потоков в силу стороннего воздействия. Например, при виде чего-то страшного и многопоточного, без внутренней синхронизации и блокировок, что так любят клеить на коленке местные неофиты, закрадывается серьёзное сомнение в том, что ЭТО Вам удастся заморозить без фатальных (для приложения) последствий. А при попытках заморозить некоторые службы или системные процессы (естественно, нужны соответствующие привилегии) Вы имеете все шансы как минимум дестабилизировать, как максимум - "повесить" или выбить в BSoD всю систему.
------------ Дoбавленo в 09.37:
Net2Com, кстати, Ваш горячо "любимый" WMC - управляемый процесс виртуальной машины .NET, там добавляются свои ньюансы, сейчас впервые попробую приостановить простейшее самодельное .NET-приложение описанным выше методом, самому интересно, что получится.
------------ Дoбавленo в 10.01:
Практика показала, что экземпляры 32-хбитной виртуальной машины .NET под NT5.x замораживаются наравне с обычными процессами, но WMC наверняка использует мультимедийные функции системы с аппаратным ускорением и работой с потоковыми данными, сетью. Кроме того, там NT6.x x64 чаще всего, а Ваше приложение таки 32-хбитное, не исключаю, будет такая же история как с отловом окон и процессов.
карма: 1

0