· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.HEAP —› РЕЗИДЕНТ НА С++, ВЫРУБАЮЩИЙ CTRL+ALT+DEL

<< . 1 . 2 . 3 . >>

Посл.отвђт Сообщенiе


Дата: Май 29, 2003 02:14:08

anton
постарайся еще один язык подучить ;)


Дата: Май 29, 2003 04:27:14

anton
А как по другому?
Как в примере из help'а.

[code]
/*
*
* test.c
*
* Компиляция: bcc.exe -ms test.c
*
*/

#include<stdio.h>
#include<dos.h>

#define CTRL_ALT 0xC

#define DEL 83

void interrupt (*old)();
void interrupt new9();
char far *reg = (char far*)0x417;

void main()
{
old = getvect(9);
setvect(9, new9);
printf("Программа стала резидентной.\n");
keep(0, (_SS + (_SP/16) - _psp));
}

void interrupt new9()
{
if(inportb(0x60) == DEL && (*reg & CTRL_ALT) == CTRL_ALT)
{
outport(0x20, 0x20);
/* чтобы убедиться в работоспособности */
sound(800);
delay(500);
nosound();
}
else
old();
}
[/code]


Дата: Июн 1, 2003 00:45:37

Ну дык чо с keep'ом-то, великоуважаемый <-----P2M----->!
Как изменили Вы его, что всё так круто заработало (был бы признателен за ответ :-) ).


Дата: Июн 1, 2003 00:56:11

Вау народ, охренеть! Даже и не заметил как тема на вторую страницу перевалила!
Я всё старые сообщения перечитываю и не пойму почему никто не пишет, а оно оказывается на second page!
Поэтому забираю своё (уже не уместное) сообщение к P2M и говорю ему огромное п-а-с-и-б-о за предоставленный мне help с его стороны!
Ща скачаю и разберу, чо там изменено.
И вообще П-А-С-И-Б-О ВСЕМ кто откликнулся на хриплый крик студента о помощи! Не перевились в стране нашей доблестные программисты(типа рыцари)!!!!


Дата: Июн 1, 2003 01:16:40

---------------------
----->to Аноним<-----
---------------------

Думаешь стоит, я вроде и так уже почти состаялся в этой жизни(как программист).
А если имя Вам моё и не знакомо, то в этом я уж ну никак не виноват!
;););););););););););););););););)

А вообще планы мои(на этот лето) грандиозны:
овладетьь в совершенстве:
1. assembler
2. Visual C++
3. ну и ещё "MS Блокнот" и машинный код
Ну как не хило???
не каждый на это отчаится!!!!


Дата: Июн 1, 2003 05:13:11

anton
Думаешь стоит, я вроде и так уже почти состаялся в этой жизни(как программист).

Вообще-то, я говорил о _русском_ языке :)


Дата: Июн 1, 2003 20:19:53

Да, а что он сильно изменился с того времени как я последний раз в инет выходил :)


Дата: Июн 3, 2003 21:06:46

Как оказалось, та - первая программа, по отключению CTRL+ALT+DEL, полностью рабочая, но только под dos, а я первоначально тестил её в win.
-----------------------------
--------->for P2M<---------
-----------------------------
Что касается изменения keep, то:
keep(0, (_SS + (_SP/16) - _psp)) = keep(0, _DS - _CS + _SP/16 + 1)
вот почему (размещение резидента в памяти (модель памяти small)):

_________ Начало стека (регистр SP)
| |
_DS = _SS__|_________|Конец стека (регистр SS)
| |
| HEAP |
|_________|
| |неинициализированные
|_________|данные
| |инициализированные
|_________|данные
| текст |
|программы|
|_________|
| psp |
_CS______|_________|

Только вот в левый keep (для пущей верности) надо 1 параграф добавить, как и в правом, так как при делении _SP/16 дробная часть отбрасывается. А так они, получается, оба идентичны.
--------------------------------------
--------->for Black_mirror<---------
--------------------------------------
Программа одинаково удачно работает с любым из вариантов:
1) (*reg & CTRL_ALT) == CTRL_ALT
2) *reg == CTRL_ALT
Но честно говоря, первый вариант мне не до конца понятен (не могли ба Вы более подробно по нему написать, если можно). Что он делает и в чём его преимущество?

Если у Вас есть какие-либо соображения по изложенной информации или Вы видите, что её автор в чём-то сильно заблуждается, то напишите, пожалуйста, не стесняйтесь (а то мне 9 июня экзамен по этой теме сдавать, а я ,может быть, ещё и нифига не знаю)! Буду благодарен.

Заранее благодарен!!!!!!!

P. S.
Спасибо всем кто откликнулся и помог в решении проблемы!
Отдельное спасибо:
P2M
Black_mirror
volodya
алех


Дата: Июн 3, 2003 21:09:09

Блин, чо за фигня, я столько над картинкой батрачил, а она через жо..у получилась.
Попытка№2: __________ Начало стека (регистр SP)
| |
_DS = _SS_________ |_________ | Конец стека (регистр SS)
| |
| | HEAP
|_________ |
|_________ | неинициализированные данные
|_________ | инициализированные данные
| текст |
|программы|
|_________ |
| psp |
_CS _________ |_________ |


Дата: Июн 3, 2003 21:10:55

ЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭ
что за хрень почему я под ником Анонима выхожу
мой ник - anton
!!!!!!!!!
:( :( :( :( :( :( :( :( :( :(


Дата: Июн 3, 2003 23:21:56


Программа одинаково удачно работает с любым из вариантов:
1) (*reg & CTRL_ALT) == CTRL_ALT
2) *reg == CTRL_ALT


Описание флагов клавиатуры:

40:17 byte Keyboard flag byte 0 (see KB FLAGS)

│7│6│5│4│3│2│1│0│ keyboard flag byte 0
│ │ │ │ │ │ │ └─── right shift key depressed
│ │ │ │ │ │ └──── left shift key depressed
│ │ │ │ │ └───── CTRL key depressed
│ │ │ │ └────── ALT key depressed
│ │ │ └─────── scroll-lock is active
│ │ └──────── num-lock is active
│ └───────── caps-lock is active
└────────── insert is active

40:18 byte Keyboard flag byte 1 (see KB FLAGS)

│7│6│5│4│3│2│1│0│ keyboard flag byte
│ │ │ │ │ │ │ └─── left CTRL key depressed
│ │ │ │ │ │ └──── left ALT key depressed
│ │ │ │ │ └───── system key depressed and held
│ │ │ │ └────── suspend key has been toggled
│ │ │ └─────── scroll lock key is depressed
│ │ └──────── num-lock key is depressed
│ └───────── caps-lock key is depressed
└────────── insert key is depressed

Как видим в ячейке 40:17 кроме состояния CTLR'а и ALT'а, хранится еще и другие флаги, то есть если у нас включен CAPS_LOCK то когда мы нажимаемм CTRL+ALT+DEL в ячейке 40:17 будет 4Ch != 0Ch.
В первом варианте маскируются все биты кроме битов соответствующих CTRL и ALT. Поэтому состояние остальных флагов не будет влиять на результат сравнения.


Дата: Июн 6, 2003 00:54:05

Знаете, тут сегодня, перед кафедрой вышки такой дебат состоялся, на тему: так что же происходит при нажатии CTRL+ALT+DEL?
И честно говоря я тоже сильно задумался, хотя казалось решил для себя эту проблему раз и навсегда. Так вот было высказано море различных мнений(часть из них мне удалось опровергнуть на месте, а часть действительно ввело меня в сомнения).
Ниже приведены те варианты, которые меня заинтересовали и на которые я не смог дать однозначного ответа (здесь же приведены мотивации этих вариантов их же авторами):

Вариант_1
при нажатии на эти клавиши, происходит отдельное прерывание (сказали двадцать какое-то), которое приводит к перезагрузки системы;
Мотивация: так же как и на CTRL+Break так же как и на PrintScreen на CTRL+ALT+DEL есть своё отдельное прерывание
Вариант_2
вот об этом я точно ничего не слышал и даже не знаю как поверить: при нажатии этих клавиш - на определённую ножку процессора подаётся какой-то импульс, который и приводит к перезагрузки системы;
Мотивация: как тогда программно перезагрузить машину, естественно это делается каким-то крутым способом

Вот, что я думаю по этим вариантам:
По_варианту_1
если бы такое прерывание и было, то оно обязательно описывалось бы в векторной таблице прерываний (которых там 256), но такового в списке я не обнаружил, поэтому это предложение опрометчиво
По_варианту_2
есть прерывание INT 19h, которое вызывает перезагрузку операционной системы. Правда, как я понимаю, перезагрузка системы не значит перезагрузку машины, но тогда и впрямь становится не понятным – как программно перезагрузить машину?

Вот как я для себя понимаю этот вопрос:
Так же как и PrintScreen и SysReq и CTRL+Break – CTRL+ALT+DEL тоже отслеживается прерыванием INT09h, которое в свою очередь проверяет формат байтов по адресам 0000h : 0417h и 0000h : 0418h и используя эти данные плюс скан-код нажатой клавиши вычисляет ASCII код нажатой клавиши или комбинации клавиш, а потом выполняет нужное действие, например выводит клавишу в консоль. Или, как в случае с нашими комбинациями запускает обработчик соответствующего прерывания(INT05h-<PrtScr> INT1Bh-<CTRL+Break>). В случае же с CTRL+ALT+DEL после проверки байта 0000h : 0417h, проверяется порт 60h на наличие в нём скан-кода DEL и если таковой имеется выполняется перезагрузка. Но здесь есть один нюанс – приоритет прерываний. Прерывание INT05h имеет высший приоритет чем INT09h, а INT1Bh более низший поэтому при нажатии <PrtScr> сперва выполняется INT05h и только потом INT09h, а в случае с <CTRL+Break> сначала INT09h, а потом уже INT1Bh. Короче какие-то непонятные цепочки.

P.S. всем стойким перцам: если Вы дочитали это до сюда, то не бросайте и прочтите 3 следующие строки.
Так помогите люди добрые разъяснить ситуацию раз и навсегда.
Так что всё-таки происходит при нажатии CTRL+ALT+DEL и как программно перезагрузить машину.
P.S.2 и не смейтесь, пожалуйста, если видите, что я сильно заблуждаюсь, лучше помогите! :)


Дата: Июн 6, 2003 05:35:19

anton
при нажатии этих клавиш - на определённую ножку процессора подаётся какой-то импульс
"Брехня" (C) Неуловимые мстители.
У процессора есть нога Reset. Где-то в начале 90х я читал статью (не помню в каком журнале, Юн. техник или Тех. молодежи или еще где-то)
где приводилась схема, как сделать кнопку Reset на корпусе компьютера. Идея в том чтобы на время заземлить ножку Reset. (Не пробуйте повторить это сегодня!)

Вот как я для себя понимаю этот вопрос ...
Почти согласен. Только:
1. int9h не только проверяет 0417h и 0418h, но и устанавливает их.
2. int9h не выводит клавишу на консоль, а только помещает ее значение в буфер клавиатуры.

Прерывание INT05h имеет высший приоритет чем INT09h
Если речь о CPU-generated (80186+) - BOUND RANGE EXCEEDED, то afaik да. Если о PRINT SCREEN, то afaik нет.

Короче какие-то непонятные цепочк
В чем проблема. Int9h принимает все нажатия, отпускания и удержания кнопок клавиатуры, анализирует и в результате либо меняет состояние 0417h/0418h, либо вызывает обработчики int5h/int1Bh/CtrlAltDel/..., либо кладет код+сканкод с кольцевой буфер (может пикать если буфер полон) либо ничего не делает, например, если произошло отпускание кнопки.

что всё-таки происходит при нажатии CTRL+ALT+DEL
Мой вариант - работает обработчик int9h (иначе, почему работает Ваша программа?)
Хотите узнать не из чужих уст - возьмите sourcer, дизассемблируете bios и смотрите код int9h.

как программно перезагрузить машину
Из Int 19h from Ralf Bron:
... To accomplish a warm boot equivalent to Ctrl-Alt-Del, store 1234h in 0040h:0072h and jump to FFFFh:0000h. For a cold boot equivalent to a reset, store 0000h at 0040h:0072h before jumping ...
Итого Int19h или jump to FFFFh:0000h.
Все это сработает под dos, как поведет себя win мне неведомо.


Дата: Июн 8, 2003 10:34:28

А где этот учебник Фроловых качнуть можно?


Дата: Июн 9, 2003 23:36:50

-------------------------------
----->F O R A L L<-----
-------------------------------

С – П – А – С – И – Б – О ВАМ ВСЕМ ОГРОМНОЕ ЗА ПОМОЩЬ!!!!!!!!!
Ваши знания, опыт и моё упорство сотворили 5(ОТЛИЧНО) в моей глубокоуважаемой зачётке!! ==)))))))) У-РРРРРРРРРРРР-А
На экзамене мною был сотворён резидент на INT9h, с заменой обработчика прерывания INT1Ch. Рулёзная прога получилась, хоть и глупая ===))))))(ею можно изрядно нервы пользователя потрепать, если в autoexec.bat прописать).

------------------------
----->for 640k<-----
------------------------
Честно говоря мне было лень ссылку из скрипта выдирать и просматривать её по фреймам, поэтому привожу общий адрес:
http://www.info.datarecovery.ru
Когда загрузится страничка, в нижнем левом фрейме будет дерево всех тем данного ресурса, путь к тому учебнику, о котором я говорю:
Info-центр DataRecovery.Ru-->Библиотека книг-->Библиотека системного программиста-->1991-->1-A. Операционная система MS-DOS. Том 1, книги 1 - 2
А вообще там много чего интересного и на что можно потратить своё время (оно того стоит – моё личное мнение).
Если Вам интересно про буфер почитать (не про Памелин, а про Вашей Клавы), то зайдите на тему «Буфер клавиатуры на С++»(в этом же форуме). Там я выложил те ссылочки, что мне очень понравились(правда быть может для Вас это юмор детский, посему как знаете :-) ). А вообще там не только про буфер, но и про системный таймер, жёсткий ну и т.д и т.п.

-------------------------------------------------------------------------------------------------------------------
Однако тему эту мне кажется не культурным объявлять закрытой и тем более закрывать оную, так как много ещё чего написать можно здесь и много ещё не открытых и не изведанных тайн она в себе хранит!!!!
---------------------------------------------------------------------- ---------------------------------------------

P. S.
и ещё раз огромное ВСЕМ САСИБО
отдельное спасибо за наставления:
Black_mirror
P2M

<< . 1 . 2 . 3 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.066