masm
.model medium
.stack 400h
.data
;Всякие данные и область хранения адреса оригинального обработчика
oldHandler dw 0
.code
jmp main
;-------------------------Functions----------------------------
;--------------------------------------------------------------
main:
;Сохранение адреса начала сегмента данных
assume ds:@data,es:@data
mov ax, @data ;сохраняем адрес сегмента данных
mov ds, ax ;в регистр ds
mov es, ax ;и в регистр es
xor ax, ax ;очищаем регистр ax
jmp initial
;************Резидентная часть******************
_treaterInt:
;-----------------------Инициализация----------------------------------
pushf ;сохраняем флаги
;Создание отклика
cmp ax, 1987h
jne _symbol
mov ax, 7891h
iret
;-------------------------Код резидента--------------------------------
;-----------C использованием вышеописанных функций-----------------
popf ;восстанавливаем флаги
;Возвращаем управление оригинальному обработчику
; jmp dword ptr cs:[ oldHandler ]
iret ;выходим из прерывания
_residentEnd:
;*******************************************************
;*****************Нерезедентная часть**********************
initial:
;Проверяем, присутствует ли резидент в памяти
mov ax, 1987h
int 13h ;Посылаем резиденту запрос
cmp ax, 7891h
jne _upload
;Резидент уже загружен
mov dx, offset message_resident_exists
mov ah, 09h
int 21h
jmp _end
_upload:
;Загружаем резидента
mov dx, offset message_resident_upload
mov ah, 09h
int 21h
;Скопируем адрес оригинального разработчика в переменную oldHandler (13h)
mov ax, 3513h
int 21h
mov word ptr oldHandler, bx
mov word ptr oldHandler + 2, es
;Установим на обработчик
mov ax, 2513h
mov dx, seg _treaterInt
mov ds, dx
mov dx, offset _treaterInt
int 21h
;Создаём резидента
mov dx, offset _residentEnd
int 27h
int 13h
;-----------------Завершение приложения------------------------
;Выход из программы
_end:
mov ax, 4c00h
int 21h
;******************************************************
end main
Создание резидента
Не мог бы кто-нибудь поделиться примером написания резидента с проверкой на наличие копии себя в памяти? А то мои попытки пока так и не увенчались успехом - программа виснет при вызове переназначенной вектор-функции...
P.S. А вобще почитай Зубкова, очень подробно все описано.
Цитата: Lone Wolf
Программа "Гарячии клавиши в ДОС" на комбинации клавиш вешаются некоторые команды(например LALT+D - dir), также в правом верхнем углу выводятся часы. Полностью правильно работает в ДОС и 98 винде, в 2к и ХР - возникают разнообразные глюки...
P.S. А вобще почитай Зубкова, очень подробно все описано.
P.S. А вобще почитай Зубкова, очень подробно все описано.
И будет глючить в 2к и ХР... Для этих осей другая идеология есть... Если кто помнит появление линейки 2000 M$ предупреждал о не совместимости.
Хорошо что вобще работает.... большинство програм вобще не пашут, так-как НТ не разрешает с портами работать. А тут глюки, большей часту с отображением часов возникают
"Assembler. Язык неограниченных возможностей" - Вы про эту книгу говорили?
в таких системах резидентности в чистом его проявлении быть не может, можно предложить перехват API функции в качестве замены этому методу, но это лишь отдалённое напоминание резидентности,
написание драйверов тоже не может бьть названо резидентностью, поскольку все драйвера по-определению и так всегда находяться в памяти во всех процессах и будут там находиться пока им это не надоест
Код:
Но ничего работает :) Подскажите, пожалуста, в чём моя ошибка.
На сколько я понимаю - 27ое прерывание оставит в памяти программу вплоть до указанного смещения, т.е. использование описанных мною функций вполне законно. Однако, резидент не создаётся - при повторном запуске программы проверка на отклик опять даёт отрицательный результат. При третьем запуске получаю ошибку ntvdm :)
2. 13ое - прерывание разве не апаратное? контроллеру сообщать не надо?
3. 27-ое кажется завершает сом программу, а не ехе.
4. переменная oldHandler -должна быть двойным словом.
5. почему cs:oldHandler, если она описана в сегменте данных?
6. А чем тебе не подходит предложеный мной приммер. Кстати, мультиплексорное прерывание - это стандарт используеммый в ДОС при написсании резидентов.
7. Читай Зубков "Ассемблер для DOS, Windows и Unix"
8. Вот еще два приммера из Зубкова, с подробными комментариями
P.S. Напиши мне в личку свое мыло вышлю Зубкова
Нет, это сервис BIOS
ЗАБУДЬ!
Цитата: ahilles
этот пример будет работать только под DOS, в Windows этот резидент работать не будет, даже если будет работать, то отдачи от него никакой не будет, потому что у каждого процесса своя память, и резидент будет умирать после смерти процесса ntvdm
ЗАБУДЬ!
ЗАБУДЬ!
А где ты видел, что-бы задача стояла, ввиде написания резидента под Виндовс? Это обычная учебная лаба по Асму. ОС - ДОС
Плюс ко всему такой интересный вопрос - я запускаю cmd оболочку и создаю там резидента, закрываю её. В теории после её закрытия резидент должен остаться в памяти, и обращение к нему будет возможно при повторных запусках cmd оболочки. Однако на практике ничего не работает. В чём причина?
Цитата: efferson
Плюс ко всему такой интересный вопрос - я запускаю cmd оболочку и создаю там резидента, закрываю её. В теории после её закрытия резидент должен остаться в памяти, и обращение к нему будет возможно при повторных запусках cmd оболочки. Однако на практике ничего не работает. В чём причина?
Если бы так было, то мелкомягкие бы были совсем плохой фирмой. cmd - это по сути виртуальная машина, со своим адресным пространством. Когда cmd закрывается, то память отведенная ей автоматически освобождается. Даже если там и висит прога, то толку от нее 0.
Цитата: alibabaich
cmd - это по сути виртуальная машина, со своим адресным пространством.
cmd.exe - приложение Win32, ничего общего с DOS, кроме внешности, не имеет. А command.com в XP - всего лишь точка входа в ntvdm, как говорили выше.