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

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.ASSEMBLER —› резидент

. 1 . 2 . >>

Посл.отвђт Сообщен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
на работу программы это влиять, конечно, не должно, но по-моему в результате здесь вообще ничего не меняется.

. 1 . 2 . >>


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