Консультация № 64791
29.11.2006, 18:13
0.00 руб.
0 6 1
Уважаемые эксперты у меня такая проблема:
Требуется написать резидент который бы через определенный промежуток времени блокировал работу до указания пароля. У меня все готово только когда я пытаюсь вводить пароль (через 0ah) в обработчике 1ch или что-то считывать с клавиатуры компьютер просто напросто зависает. Немного поискав информацию, я увидел следующее:
"Поскольку программа INT 1cH выполняется во время низкоуровневого аппаратного прерывания, вы должны помнить, что система еще не сбросила контроллер прерываний и потому другие аппаратные прерывания, в том числе прерывание от клавиатуры, не будут происходить при работе INT 1cH (т.е. вы не получите ввода пользователя)"
Вопрос: Как же это преодолеть?
PS: Стек точно уравнен, и прерывания нигде не запрещаются

Обсуждение

Неизвестный
30.11.2006, 00:41
общий
Вешаешь дополнительный обработчик на 28h прерывание.В 1сh ставишь флаг.В 28h проверяешь флаг. Если стоит, сбрасываешь флаг, и запрашиваешь пароль.
Неизвестный
30.11.2006, 18:56
общий
Спасибо, попробую.
Неизвестный
30.11.2006, 23:31
общий
это ответ
Здравствуйте, Logoff_!
Могу предложить следующее:
1)Использовать вместо 1Ch прерывание 8 :см. справочник helpassm(TECH help) http://www.kalashnikoff.ru/Assembler/prog/helpassm.exe
2)Раз нельзя работать с превываниями, сделаем вот что: После вызова 1Ch в стеке лежит адрес возврата(CS и IP и ещё flags register). Сохраняем его в памяти, подменяем на адрес своего кода(выполняется не в обработке 1Ch). Теперь после iret из 1Ch попадаем в наш код(вместо программы где произошло прерывание), делаем свои чёрные дела, восстанавливаем флаги, регистры и делаем jmp на ранее сохранённый адрес. Всё, вернулись в программу. Код, про который я сказал, можно поместить в том же обработчике 1Ch после iret.
Идею я изложил, надеюсь теперь справитесь.
С уважением, IceW0|f.


Приложение:
Примерно так:........;Обработчик 1Ch....;Сохранение адреса, сегмента возврата и флагов....;Подмена адреса и сегмента возвратаiret....;Подменили на адрес этого кода....;Делаем чего надоjmp XS:[переменная_куда сохранили_адрес]
Неизвестный
02.12.2006, 16:08
общий
2СтасИзвините, я могу ошибаться но насколько мне известно int 28h вызывается когда ДОС ничего не делает, точнее ждет вода пользователя. Внутри него нельзя использовать функции до 0сН включительно. Я не понимаю как мне запрашивать пароль. Прямым считыванием с буфера клавиатуры? мне не удалось это реализовать... Не могли бы Вы подробнее объяснить. Заранее спасибо
Неизвестный
02.12.2006, 16:41
общий
2IceWolfСпасибо за совет. Но почему-то у меня не выходит это сделать.. Вот код обработчика int 1ch:Int_1Ch_proc proc pop _ip push _ip ;pop _cs ;pop _fl ;push _fl ;push _cs pushf call cs:[int_1ch_vect] finit fstcw Dat or Dat,0c00h fldcw Dat fld num1 fild result fmul frndint FILD count fcom fstsw ax sahf jz CheckPass mov ax,count inc ax mov Count,ax jmp @exit1c CheckPass: pop _tmp mov ax, offset @x push ax @exit1c: iret @x: mov ah,2 mov dl,‘#‘ int 21h jmp cs:[_ip]Int_1Ch_vect dd ?count dw 0num1 dd 18.2Dat dw ?result dw ?_fl dw ?_cs dw ?_ip dw ?_tmp dw ?Int_1Ch_proc endpКод после метки @x почему-то не выполняется... при попытке заставить эту процедуру обрабатывать 08h при первом прохождении в некоторых местах экрана появляются разноцветные квадратики... Помогите пожалуйста разобраться.
Неизвестный
04.12.2006, 00:48
общий
Клавиатурное прерывание int10h
Форма ответа