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

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

. 1 . 2 . 3 . >>

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


Дата: Май 23, 2003 22:50:39

Понимаю, что для Вас енто быть может и смешно выглядит, но вот у меня стал реальный вопрос, который Я чо-то немогу решить: "КАК НАПИСАТЬ РЕЗИДЕНТ НА С++, ВЫРУБАЮЩИЙ КОМБИНАЦИЮ CTRL+ALT+DEL"?? Если есть идеи или ДАЖЕ ПРОГА, то если конечно жаба Вас раньше не задушит, то отмыльте Мне на ящик:
mf_anton@pisem.net

P.S. заранее, п-а-с-и-б-о!!!!


Дата: Май 23, 2003 23:06:22

Это действительно выглядит смешно, потому что ты даже не озаботился посмотреть что-то в Google! Вместо этого все сразу бегут в форумы и принимаются что-то клянчить! Ответ на твой вопрос (из Google!) прост и изящен - хук на функции работы с клавиатурой. SDK для этого - http://www.meliorasoft.com/kits. C/C++ Q&A по твоему вопросу - http://msdn.microsoft.com/msdnmag/issues/02/09/CQA/ и потрудись наконец что-то сам сперва искать, а потом спрашивать, забирая у людей время, которое они могут провести с девушкой!


Дата: Май 24, 2003 12:51:53

---------------------------------
----->answer to volodya<-----
---------------------------------
Да, полностью согласен. Бичуйте меня как хотите, но если бы Вас момед и связь ставили бы в такую же позу, какую они ставят меня, то других способов я не нахожу(кроме как проси..ать инет карточки). Я же в-первые обращаюсь в инет за помощью по компам, поэтому не особо знаю куда залазить. Да и с английским у меня не всё так хорошо(как видимо) у Вас. Но за ссылки,как я и говорил,п-а-с-и-б-о!!


Дата: Май 24, 2003 20:46:43

Ясно. В таком случае можно потратить чуть побольше времени на объяснения причин ПОЧЕМУ задается вопрос. Опиши бедственное положение и люди поймут. А так - сильно уж много людей есть, которые просят помощи, не озаботившись куда-либо перед этим заглянуть.


Дата: Май 26, 2003 22:23:56

Да, я особо никуда не заглядывал, признаю (но почему - понятно, надеюсь). Вот ща как раз думаю полазить, потыкаться по безкрайним просторам инета, быть может и для меня тут шо-то обломится!?

А теперь - главное: ниже приведённые програмные строки ни есть новый анекдот на тему резидентов, эта прога должна была выполнять роль такового по отключению этих злополучных кнопочек, но с возложенной на неё обязанностью она ни фига не справляется (они всё равно работают)!!!

А вот и прога:

#include<stdio.h>
#include<dos.h>
#include<iostream.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);
cout<<"Программа стала резидентной";
keep(0, _DS - _CS + _SP/16 + 1);
}

void interrupt new9(...) {
if(inportb(0x60)==DEL && *reg==CTRL_ALT) {
outport(0x20, 0x20);
return;
}
(*old)();
}

Вообще-то я низнаю почему она не работает так же как и не подозреваю почему она должна работать? Не все мысли мне в ней понятны, а прога написана моим препадом в инс-те(Чернов Э. А. - быть может кто-то знает). Так сможет кто-нибудь ответить на мои вопросы (нет это не второй анекдот). Просто плюс этих прог от тех что я по ссылкам видел - их краткость! ТАК МОЖНО СВАЯТЬ ПОХОЖИЙ (ПО ОБЪЁМУ, НО РАБОТАЮЩИЙ) РЕЗИДЕНТ! Ведь как говорится:"КРАТКОСТЬ- СЕСТРА ТАЛАНТА".


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

anton
Вам под dos или под win?


Дата: Май 27, 2003 12:16:22 · Поправил: Black_mirror

anton
А не работает эта программа возможно потому, что Си генерит код который востанавливает вектора прерываний перед выходом из программы.

У AT-клавиатур 3 набора кодов. Первый из них совместим с XT-ой клавиатурой, а во 2 и 3 коды отличаются(для DEL код 109).

*reg==CTRL_ALT нужно заменить на (*reg&CTRL_ALT)==CTRL_ALT, так как там могут быть установленны и другие флаги.

Но работать это все равно не будет, так как стандартный обработчик, не сможет получить код клавиши, так как его прочитали мы. Можно конечно попытатся сообщить клавиатуре что мы код не получили, чтоб она отправила его повторно, только тут главное не запутаться: когда наш обработчик должен читать код, а когда стандартный.

А вообще обработчик от клавиатуры когда обнаруживает ALT+CTRL+DEL, сохраняет 1234h по адресу 40h:72h и делает переход на 0ffff:0.
Можешь поискать где он это делает, и исправить.

Или можно импользовать отладочные регистры: поставить брэкпоинт на выборку комманд по адресу 0ffff:0, и когда он сработает вернуть управление программе. Еще нужен обработчик int9, который сохранит адрес возврата и указатель стека(чтоб знать к чему вернуться), и вызовет старый обработчик.

А еще есть вариант для маньяков: написать полноценный обработчик int9.


Дата: Май 28, 2003 00:25:40

Для DOS'а.
А вообще я не очень-то понимаю(видимо в силу своей некомпетентности) какая разница? Ведь, что для dos, что для win резидент-то всё равно один. Какая ему разница в какой среде заменять стандартный обработчик прерывания? Он его заменит и тю-тю: клава (что под dos, что под win) пляшет под нашу дудку.
Да я слышал, что могут быть проблемы в среде win, если мы работаем с неофициальными функциями прерываний(они корректно работают в dos, но могут не работать в win). Но ведь в этой проге таковые не используются, здесь всё предельно просто.

А вообще предыстория сей темы такова:
"Есть у меня препод(помните кто). Так вот, препод этот, видимо изрядно подзабыв asm и ничерта не разобравшись с темой резидентных программ начал нам таковые преподавать. И придумал он как-то от нечего делать курс лекций на эту тему с 10-ю примерами. Примеры эти были гениальны с программной точки зрения, а мы баловни родительские не
ценили этого сидя на лекциях и смотря как он их МЕЛКОМ НА ДОСКЕ удачно компилирует. Но вот пришла экзаменационная страда и озаботились мы сией темой глобальной. А тут он ещё заявляет, что те кто отл. в зачётку хотят - резидент на экзамене сваять должны. Ладно, подумал я и скачал учебник Фроловых из инета. Круто братки
написали, но вот на asm'е много, да и уж дейсвительно больно круто (на самом деле, если все их проги поделать, то в бошке не хило прибавляется). Круто - оно круто, да только не совсем-то оно то. И решился я на дерзость не слыханную - подошёл к богатырю я к нашему программному(препод), да и попросил у него курс лекций. Тот думу подумав дал таки мне их. Ну думаю я, всё - отл. в кармане, ща только проги его напишу, оттестю и всё ок. Сел, написал и ох..ел(sorry): из 10 только 2 работали. Ну думаю блин, програмер хренов, что же ты написал такое, что же ты детям полгода парил? Взял я все эти проги да и принёс ему на лабу: НА ВОТ ПОДИВИСЬ на творения свои. Короче сидел он так часа 2, разбирался в потугах своих программных, так ни фига и не разобрался, но вот ответ нашёл(цитата):"Это ВИНДА виновата, вот мне бы ЧИСТЫЙ ДОС, я б вам всем КУЗЬКИНУ МАТЬ показал". Однако и под ДОСОМ МАТЬ эту мы так и не увидели.
Ну думаю стесняется барышня, всяко бывает. В общем пришёл домой, сел, книжки умные почитал, короче исправил я 5 его прог - заработали (правда ни без вставок на asm'е). Да, вот беда, одна - иуда ну ни в какую исправляться не хочет, а имя ей "KILL CTRL+ALT+DEL". А экзамен-то сдавать надо. И сдавать я его буду, как быть может Вы уже догадались, этому дикому преподу, а прикол-то в том что на экзамене все проги работать обязаны!! А коль эта не работает, значит в моих знаниях пробел. Так помогите люди добрые его ликвидировать!! ВУХ, НУ вот пожалуй и всё."


Дата: Май 28, 2003 02:33:02

Вот что мне удалось нагуглить
http://www.metlin.org/pgms/cad.cpp
Сам не проверял, т.к. сижу в линуксе.
Остальные результаты можешь посмотреть здесь


Дата: Май 28, 2003 06:43:35

Вот работающий вариант программы:

org 256
start:
jmp main
int1:
mov al,20h; обработчик int9 похоже решил перезагрузится, но у него ничего не вышло и управление теперь у нас
out 20h,al; поэтому завершим обработку прерывания
lss sp,dword [cs:regsp];востановим указатель стека
jmp exit;и перейдем к востановлению регистров
int9:
pushad;сохраняем регистры в стеке
push ds
push es
push fs
push gs
mov [cs:regsp],sp;а указатель стека в переменных
mov [cs:regss],ss
pushf;вызываем старый обработчик
db 09ah
int9ofs dw ?
int9seg dw ?
exit:
pop gs;востанавливаем регистры
pop fs
pop es
pop ds
popad
iret
regsp dw ?
regss dw ?

main:
xor ax,ax
mov es,ax
cli
mov ax,word [es:9*4]; сохраняем адрес старого int9
mov [int9ofs],ax
mov ax,word [es:9*4+2]
mov [int9seg],ax
mov word [es:9*4],int9; устанавливаем новый обработчик int9
mov [es:9*4+2],cs
mov word [es:1*4],int1; устанавливаем новый обработчик int1
mov [es:1*4+2],cs
mov eax,0ffff0h; адрес контрольной точки
mov dr0,eax
mov eax,3; разрешаем вызов int1 при выборке комманд по адресу 0ffff0h
mov dr7,eax
sti
mov ax,3100h
mov dx,(main+15)/16
int 21h


Дата: Май 28, 2003 08:00:23

anton
Для DOS'а ... какая разница? Ведь, что для dos, что для win резидент-то всё равно один.
Afaik не все прерывания доходят до dos-приложений. Под wnt/w2k/wxp Ctrl+Alt+Del вообще системная комбинация и чтобы поймать ее даже в win-приложении надо постараться.

Для dos Ваш код почти рабочий.
Проверял bc++v3.1, small memory model, keep вызывал чуть-чуть иначе и учел замечание Black_mirror по поводу сравнения CTRL_ALT.


Дата: Май 28, 2003 23:06:34

keep вызывал чуть-чуть иначе

А как по другому? Версия компилятора у меня таже, модель памяти поставил туже, ну ещё пару настроечек компилятора сделал под резиденты, учёл замечание Black_mirror, а она не работает! Так быть может всё дело именно в изменённом keep'е?
Может Вы напрямую задали размер памяти для резидента, что-то типа:
keep(0,1000);


Дата: Май 28, 2003 23:13:24

----------------------------------
----->answer to Black_mirror<-----
----------------------------------

Огромное Вам спасибо, но вот есть у меня одна м-а-а-а-алюсенькая проблемка: знание asm(не того уровня, что бы там что-то разобрать).
Но сложа руки я сидеть не сабираюсь(не в моём стиле). Поэтоому сегодня отдал её нашим asm'истам, попросил откомпалить и разобрать её, а потом мне непутёвому объяснить!
А она будет в эмуляции dos'а под win работать или тоолько в чистом DOS'е?


Дата: Май 28, 2003 23:19:43

И ВООБЩЕ ПОНЯЛ Я ОДНУ ИСТИНУ ОФФИГЕННУЮ:"БЕЗ ASM'А НИ КУДА В НАШЕ НЕЛЁГКОЕ ВРЕМЯ!!!"
ПОСИМУ РЕШИЛ Я ИЗУЧИТЬ СЕЙ ДИКОВИННЫЙ ПРОДУКТ ЭТИМ ЛЕТОМ (КОНЕЧНО ЕСЛИ СЕССИЮ ЗДАМ, А ТО МОЖЕТ ВСЁ ЕЩЁ ПРОЩЕ БУДЕТ: ГРУЗЩИКОМ ЗА $300 ПОЙДУ И БАСТА!)


Дата: Май 29, 2003 01:08:33

В режиме эмуляции работает, в чистом досе не тестил. Требуется проц не ниже 386.

. 1 . 2 . 3 . >>


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