|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Дек 1, 2002 21:17:44 Как писать резиденты. |
|
|
Дата: Дек 1, 2002 22:09:41 Molcha. |
|
|
Дата: Дек 2, 2002 13:54:38 > та б*я,что значит молча, подскажите ссылки, где найти инфу, или что-нибудь типа этого. Спасибо. |
|
|
Дата: Дек 2, 2002 16:43:28 Грубо. А что касается резидента, то здесь все очень просто. Пишешь программу обработки требуемого тебе прерывания. Точку входа прописываешь таблице прерываний. Завершаешь ее без освобождения памяти. Есть в DOS такая функция: "Завершить и оставить резидентной" (номер не помню, посмотри в справочнике функций DOS). Вот собственно и все. Примеры можно найти во многих книгах по ассемблеру (напр. у Зубкова) или по программированию в DOS (напр. у Роя Данкана). |
|
|
Дата: Дек 3, 2002 10:32:41 Спасибо, люди. Всё что хотел, я уже нашёл, а в Зубкове пример есть на страниц 15, теории мало. А разбирался я по всему этому по рассылкам Калашникова (www.Kalashnikoff.ru) - там не плохо написано. Пака. |
|
|
Дата: Дек 4, 2002 02:06:27 izvini |
|
|
Дата: Дек 4, 2002 02:06:52 Izvini. |
|
|
Дата: Дек 9, 2002 09:28:10 Уважаемые.... У меня проблема с написанием резидента.... В общем заменяю системный обработчик инт09 - и из него нужно выполнить обработку с использованием инт21.... Знаю что нельзя....потому перехватываю инт28 и из него пытаюсь вызывать инт21....никаких вроде проблем - прога не зависает.... но вот не работает - в смысле не делает того что мне нужно.... Я просто пытался удалить файл,а оно не удаляет.... Средствами инт10 вывел на экран то что в AX остается после вызова функции удаления файла mov ah,41h mov dx,offset filename int 21h И это значение 03h....совсем непонятно Но при этом инт10 вызываю и из обработчика инт09 и из инт28.... Пробовал флаг занятости ДОС проверять - тоже самое.... В смысле ничего не происходит....файл не удаляется.... Проверял из чистого доса и из-под виндов.... Результат один и тот-же....файло не удаляется.... Не знаю что делать.... Весь инет облазил - куча исходников,документов с описаловым.... Но большинство исходников не работают на моем компе....зависают Есть ли у кого исходник - 100% работающий |
|
|
Дата: Дек 9, 2002 17:04:58 Глупо, конечно... Но: 1. Файл должен быть закрыт; 2. Флаг занятости биос ? |
|
|
Дата: Дек 10, 2002 07:26:52 Уважаемый Chingachguk Конечно файл закрыт,и кроме того я проверил его существование на диске (т.е. что он есть в наличии и он никакой не системный и не скрытый - обычное файло короче).... А вот не работает.... Я видел ваши сообщения на подобную тему на форуме bugtraq.ru (Chingachguk - запоминается такое имя).... Можете посмотреть мой исходник этой моей TSR-проги? Я мог бы вложить его в сообщение на этом форуме.... |
|
|
Дата: Дек 10, 2002 19:15:08 Вообще-то ошибка 03 наводит на подозрение - а знает ли TSR именно полный путь к файлу? |
|
|
Дата: Дек 10, 2002 19:29:28 [QUOTE] Можете посмотреть мой исходник этой моей TSR-проги? Я мог бы вложить его в сообщение на этом форуме.... [/QUOTE] Да, конечно. |
|
|
Дата: Дек 11, 2002 07:26:32 Вот он....этот TSR Критика принимается любая.... ;******************************************************** ********* ;прога перехватывает int09h и если нажата 'q',то удаляет на диске файл ;001.txt,после этого выводит на экран "Deleted...." ;****************************************************************** text segment 'code' assume cs:text,ds:text,ss:text org 100h ;****************************************************************** ;начало программы,переход на секцию инициализации init ;****************************************************************** main_ proc far jmp init ;сам переход на метку инициализации old_09h dd 0 ;адрес системного обработчика int09h old_28h dd 0 ;адрес системного обработчика int28h my_key db 0 ;сюда будем сохранять скен-код нажатой клавиши my_flag db 0 ;флаг активизации (если он равен 1,то удалить файл) fname db 'c:\001.txt',0 ;имя удаляемого файла mes db 'Deleted....',13,10,'$' dos_addr dd 0 ;***************************************************************** ;мой обработчик int09h,проверяет какая клавиша нажата и устанавливает флаг ;***************************************************************** new_09h: ;начало моего обработчика push ax ;сохраним используемый регистр push bx ;сохраним используемый регистр in al,60h ;читаем символ из порта клавиатуры mov my_key,al ;здесь скен-код нажатой клавиши pushf ;сохраним в стеке все флаги cli ;запретим прерывания call cs:old_09h ;вызовем системный обработчик sti ;разрешим прерывания cmp my_key,10h ;10h-это скен-код клавиши 'q' jnz exit_ ;на выход из обработчика без установки флага активизации mov my_flag,1 ;установка флага активизации,если нажата клавиша 'q' exit_: ;выход из обработчика pop bx ;восстановим регистр из стека pop ax ;восстановим регистр из стека iret ;восстановим регистр флагов из стека и выход из обработчика ;****************************************************************** ;мой обработчик int28h,проверяет my_flag,если он равен 1,то удаляем файл ;****************************************************************** new_28h: cmp my_flag,1 jnz end_ ;если не установлен флаг,то передаем управу системному ;обработчику push ds lds di,dos_addr mov al,byte ptr ds:[di+2] pop ds cmp al,0 ;проверяем флаг занятости ДОС ja end_ ;если занято,то передаем управу системному обработчику mov ah,41h ;это удаление файла mov dx,offset fname int 21h mov ah,09h ;вывод на экран средствами БИОС кода ошибки mov cx,1000 int 10h mov my_flag,0 ;обнулим этот флаг mov ah,40h ;вывод сообщения "Deleted...." mov bx,1 mov cx,5 mov dx,offset mes int 21h end_: pushf sti popf cli jmp cs:old_28h ;это передача управления системному обработчику endres equ $-main_ ;метка,показывает сколько байт оставить ;резидентными в памяти init: mov ax,3509h ;получим адрес системного обработчика int09h int 21h ;вызов сервиса DOS для получения адреса mov word ptr old_09h,bx ;сохраним смещение системного обработчика int09h mov word ptr old_09h+2,es ;сохраним сегмент системного обработчика int09h mov ax,2509h ;установим мой обработчик int09h mov dx,offset new_09h ;адрес моего обработчика int09h int 21h ;вызов сервиса DOS для установки адреса mov ax,3528h ;получим адрес системного обработчика int28h int 21h ;вызов сервиса DOS для получения адреса mov word ptr old_28h,bx ;сохраним смещение системного обработчика int28h mov word ptr old_28h+2,es ;сохраним сегмент системного обработчика int28h mov ax,2528h ;установим мой обработчик int28h mov dx,offset new_28h ;адрес моего обработчика int28h int 21h ;вызов сервиса DOS для установки адреса mov ah,34h int 21h mov word ptr dos_addr,bx ;пытаемся получить адрес флага занятости ДОС mov word ptr dos_addr+2,es mov ax,3100h ;оставим нашу прогу резидентной в памяти mov dx,(endres+10fh)/16 ;число параграфов для оставления int 21h ;вызов сервиса DOS для оставления проги в памяти main_ endp text ends end main_ |
|
|
Дата: Дек 11, 2002 09:20:59 Хорошо, я посмотрю. На первый взгляд бросается в глаза тот факт, что ds перед вызовом функции удаления неопределен в смысле адресации имени файла ... |
|
|
Дата: Дек 11, 2002 13:06:51 В обработчике int28, во-первых, при вызове функций 40 и 41 должен быть определён DS=CS, во-вторых, my_flag и dos_addr надо либо адресовать через CS, либо опять-таки установить DS=CS Что-то я не понимаю смысла последовательности: pushf sti popf на работу программы это влиять, конечно, не должно, но по-моему в результате здесь вообще ничего не меняется. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.081 |