Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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
6-48235
JibSkeart
2002-05-30 14:32
2002.08.15
Как сделать прогу что то вроде Клинт ,Сервер ?


1-48191
Sedunov Vitaly
2002-08-02 18:41
2002.08.15
OnActivate


14-48270
A2
2002-07-19 17:08
2002.08.15
вопрос


14-48313
AlexRya
2002-07-22 22:43
2002.08.15
Как изменить меню загрузки?


6-48223
keymaster
2002-06-01 02:25
2002.08.15
Синхронизация времени. КАК?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский