Форум: "Система";
Текущий архив: 2002.08.15;
Скачать: [xml.tar.bz2];
ВнизКак заморозить всех? Найти похожие ветки
← →
Timon (2002-02-05 14:32) [0]Нужно состряпать прогу, которая в определенное время блокирует все проги (кроме себя ес-но). Т.е. пользователь элементарно не может ничего сделать. По прошествию определенного времени та же прога должна врубать все обратно.
Please помогите. Всем зарание огромный thanks!
← →
VuDZ (2002-02-05 15:10) [1]1. realistic way:
realtime priority + огромные вычислительные расчёты... если мышь будет двигаться раз в 2-3 минуты - уже круто (и это есть огромный недостаток win32 в отличие от OS/2)
2. crazy way:
получаем привилегии 0 кольца защиты проца, и потом
(assembly)
cli;
; тут код, который ждёт некоторое время или hlt если надо убить комп :)
вот-с...
← →
AlexRush (2002-02-05 16:45) [2]VuDZ: Привелегии нулевого кольца - это круто. Если знаешь как это сделать реально, вышли мне рабочий ASM-код, буду премного благодарен.
Timon:
*Вариант 1: твоя прога ставит хуки на клаву и мышу, а в худшем случае - на все виндовс-сообщения, и запрещает окнам их обрабатывать. реально юзверь сделать ничего не может. Потом прога просто снимает хуки - и все возврашается на круги своя.
*Вариант 2: твоя прога энумерует все процессы, а в них - потоки,
и суспендит их, потом резюмит.
*Вариант 3: энумерыешь все топ-мост окна и дизэйблишь их >>
EnableWindow(hwnd,FALSE); , вернуть - то же ,но EnableWindow(hwnd,TRUE);
*Вариант 4:
var ht,tid:DWORD;
procedure ThreadProc(param:pointer);assembler;stdcall;
asm
@@_rep:
jmp @@_rep
end;
BEGIN
// Устанавливаем реал-таймовский приоритет потока своей проги
SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS);
// Создаем поток....
ht:=CreateThread(nil,0,@ThreadProc,nil,0,tid);
// Утанавливаем приоретет созданого потока
SetThreadPriority(ht,THREAD_PRIORITY_TIME_CRITICAL);
// Он зажрет б Ольшую(подавляющую) часть процессорного времени,
// Теоретически система не остановится, просто будет сильно тормозить, но реально, когда я тестировал этот код на своей NT4 Ws, у меня тачка стала намертво - ни тебе Ctrl-Alt-Del, ни тебе движения мыши на экране, только всемогущий Reset.
...............
// если нужно потом это дело снять, НЕ бери высших приоритетов для процесса и потока.
// Снимаем ручник:
TerminateThread(ht,0);
END.
Последний вариант можно использовать в комбинации с предидущими. Но учти, что тормозится вся система, и твоя прога в т.ч.
← →
Timon (2002-02-08 12:45) [3]
Alex, спасибо большое, но чтоб моя прога тормозила как раз не нужно. Да и ктому же я не совсем точно поставил вопрос, потому получил не совсем точный ответ.
Просто нужно написать прогу типа клиент - сервер, которая будет администрировать игровой зал. Клиенская часть запускается вместо shell и в определенный момент просто должна блокироватьмашину. Но как показывает практика, для игр типа Conter Strike (помоему так пишется) блокирование сервера сетевой игры приводит к блокированию всех. Соответственно нужно просто блокировать устройства ввода. Ну или что-то вроде этого, так что бы сама игра как раз не тормозила, а просто была недоступна для пользователя.
← →
AlexRush (2002-02-08 15:50) [4]Ну тогда можно воспользоваться вариантом 1, ставь хуки на сообщения клавы и мыши, или на все, но разрешай те, которые пользует твоя прога(например WM_ASYNC и т.п.)
Вариант 5: Напиши прогу - блокировщик экрана, которая по удаленной команде будет выводить на экран максимизированное top-most окно с запретом переключения по Alt+Tab, Alt+Space, и незакрываемое по Alt+F4 (и с надписью "Заплати, и играйся дальше" :)
Вариант 6: Если речь идет только о Counter Stike, можно подменить его запускаемый екзешник на свой, который будет запускать настояший(получая при этом хендлы процесса и первого потока), а по удаленной команде суспендить/резюмить этот процесс. Реальный екзешник лучше держать с другим расширением, например .DAT или чего еще, чтоб продвинутый гамер не догадался.
← →
hotfix (2002-02-08 17:41) [5]ring0 добыть очень легко для определенного куска кода - смотри исходник вируса ВыньЧих(чернобылЬ) в кратце так:
получаешь !!локальную!! таблицу исключений вешайся на int4 or int6 генерируй исключение и ты там!,
учитывай что перед уходом в исключение участку кода, который у тебя будет включать ring0 для всей программы ты должен передать локальную таблицу дескрипторов дабы поменять приоритет в ней. а далее пеерд тем как делать iret в стеке поменяй также приоритет (cs)
← →
Timon (2002-02-13 09:31) [6]Всем спаибо большое за помощь. Я для себя ответ уже нашел.
← →
ilg (2002-02-13 14:10) [7]Timon, а не мог бы ты рассказать нам как это сделать?
← →
Polygon keeper (2002-02-16 20:57) [8]Подключаюсь к вопросу Timona. Alex, вариант 1 хорош, но как быть
если задача не использует GetMessage для получения клавиатурных
и мышиных сообщений ( например использует DInput ?).
Timon, если не сложно, расскажи и мне какой путь нашел ты ?
← →
Timon (2002-03-01 16:26) [9]
У меня было все просто. Мне нужно было сделать все под Win9x, собственно я сделал это при помощи BlockInput. Пока она блочила, все что я проверял.
← →
SerVS - S (2002-03-01 17:57) [10]Интересно узнать вариант для вин2000 (в ней BlockInput работает, но снимаеться по Ctrl-Alt-Del
← →
Timon (2002-03-11 15:05) [11]SerVS - S, это сложнее. Попробуй одновременно ставить хук на CTRL+ALT+DEL, может поможет ;)
А вообще я под NT очень мало программировал... :(
← →
Song (2002-03-11 15:42) [12]По правде скзать BlockInput снимается комбинацей этих трёх клавиш в любой ОС. А выход тут есть - их заблокировать и не надо никаких хуков:
SystemParametrsInfo(SPI_SCREENSAVERRUNNING,1,0,0);
← →
MegaVolt (2002-03-11 20:08) [13]Под Win95-98
asm
cli //заблокировали прерывания
end;
asm
sli //разрешили оные :)
end;
Проверялось забирает все ресурсы!!! Но только под Вынь95-98 :)
← →
VuDZ (2002-03-11 21:50) [14]
> Timon © (11.03.02 15:05)
> SerVS - S, это сложнее. Попробуй одновременно ставить хук
> на CTRL+ALT+DEL, может поможет ;)
> А вообще я под NT очень мало программировал... :(
>
>
> Song © (11.03.02 15:42)
> По правде скзать BlockInput снимается комбинацей этих трёх
> клавиш в любой ОС. А выход тут есть - их заблокировать и
> не надо никаких хуков:
> SystemParametrsInfo(SPI_SCREENSAVERRUNNING,1,0,0);
ну вы и шутники про NT.
Если бы было так просто - ей бы никто и не пользовался :>
← →
Шрек (2002-03-12 03:18) [15]Вариант неотносящийся к делфи, но все же: выделеный сервер, его как раз для этого придумали
← →
Song (2002-03-12 09:03) [16]2VuDZ
Автор при составлении вопроса написал "D5,D6, Win95/98", вот и ответы соответственные.
← →
skovorodka (2002-03-17 13:50) [17]ээ
Насчёт SystemParametrsInfo(SPI_SCREENSAVERRUNNING,1,0,0);
Delphi пишет, что не знает таких :( Может я что в Uses не дописал?
← →
Song (2002-03-17 16:30) [18]Uses ShellApi; ????
← →
ATLANTIDO (2002-06-03 18:42) [19]
> AlexRush (05.02.02 16:45)
по поводу исходника ...
можно полный исходник установки и уничтожения потока с рилтайм-приоритетом ? (ideya@bigmir.net).
Или обьясни пожалуйста что такое ht и tid.
Я их определил как хендл, и поток ставиться, машина падает, но потом поток не срывается.
← →
Burmistroff (2002-06-03 22:01) [20]> SerVS - S
Под вынь *NT (Win NT, 2000, XP) очень круто использовать таймер, который методично вызывает BlockInput. Тогда появится TaskManager, но вскоре клава и мышь опять отрубятся.
Однако есть и метод супер-бизона , о котором упомянул AlexRush под номером 2.
Готовый исходник юнита (procman) можно взять с http://maxcomputing.narod.ru/dev.html?lang=ru
вот некоторый фрагмент
unit xxx;
interface
uses
Windows, SysUtils, Classes, PSAPI, TlHelp32;
const
THREAD_SUSPEND_RESUME = ($0002);
{$EXTERNALSYM THREAD_SUSPEND_RESUME}
type
TGrey=array[0..255] of Cardinal;
var
FProcList: array of DWORD;
function OpenThread( dwDesiredAccess: DWORD ; bInheritHandle: Boolean; dwThreadId, PID: DWORD ): THandle; stdcall;
{$EXTERNALSYM OpenThread}
procedure BuildThreadsList(ProcessID: DWORD; var ex:TGrey);
procedure SuspendProc(PID:cardinal);
procedure ResumeProc(PID:cardinal);
implementation
function OpenThread( dwDesiredAccess: DWORD ; bInheritHandle: Boolean; dwThreadId, PID: DWORD ): THandle; stdcall; // Открытие чужого thread"а. Только для *NT
type
xoa=packed array[1..6] of DWORD;
id=packed array[1..2] of DWORD;
TOTNT = function (i:PHANDLE; a:DWORD; b:xoa; c: id): THandle; stdcall;
var
cid: id;
oa: xoa;
otXP2000: TOTXP2000;
otNT: TOTNT;
FuncPtr: TFarProc;
hDll: THandle;
begin
result:=dwThreadID;
// In Win NT 4.0 вызываем NtOpenThread из ntdll
try
hDll:=LoadLibrary("ntdll");
FuncPtr:=GetProcAddress(hDLL,"NtOpenThread");
if FuncPtr<>nil then
begin
@otNT:=FuncPtr;
cid[1]:=PID;
cid[2]:=dwThreadID;
oa[1]:=$18; oa[2]:=$0; oa[3]:=$0;
oa[4]:=$0; oa[5]:=$0; oa[6]:=$0;
otNT(@result, dwDesiredAccess, oa, cid);
FuncPtr:=nil;
end;
finally
FreeLibrary(hDll);
end;
if result<>dwThreadID then exit;
end;
procedure SuspendProc(PID:cardinal); //Только для Win *NT "замораживает процесс"
var
ex: TGrey;
x: Integer;
card: Cardinal;
begin
BuildThreadsList(pid, ex);
for x:=1 to ex[0] do
begin
card:=OpenThread(THREAD_SUSPEND_RESUME,false,ex[x], PID);
if card>0 then SuspendThread(card);
end;
end;
procedure ResumeProc(PID:cardinal); //Только для Win *NT "размораживает процесс"
var
ex: TGrey;
x: Integer;
card: Cardinal;
begin
BuildThreadsList(pid, ex);
for x:=1 to ex[0] do
begin
card:=OpenThread(THREAD_SUSPEND_RESUME,false,ex[x], PID);
if card>0 then ResumeThread(card);
end;
end;
procedure BuildThreadsList(ProcessID: DWORD; var ex:TGrey); // Получаем список Thread"ов
var
SnapProcHandle: THandle;
ThreadEntry: TThreadEntry32;
Next: Boolean;
begin
try
ex[0]:=0;
SnapProcHandle := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if SnapProcHandle <> THandle(-1) then
begin
ThreadEntry.dwSize := Sizeof(ThreadEntry);
Next := Thread32First(SnapProcHandle, ThreadEntry);
while Next do
begin
if ThreadEntry.th32OwnerProcessID = ProcessID then
begin
ex[0]:=ex[0]+1;
ex[ex[0]]:=ThreadEntry.th32ThreadID;
end;
Next := Thread32Next(SnapProcHandle, ThreadEntry);
end;
CloseHandle(SnapProcHandle);
end;
finally
end;
end;
end.
Буду признателен, если кто-нибудь ответит на http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1023126384&n=2
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2002.08.15;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.007 c