Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Создание резидента

4.9K
21 апреля 2007 года
efferson
57 / / 08.12.2005
Не мог бы кто-нибудь поделиться примером написания резидента с проверкой на наличие копии себя в памяти? А то мои попытки пока так и не увенчались успехом - программа виснет при вызове переназначенной вектор-функции...
274
21 апреля 2007 года
Lone Wolf
1.3K / / 26.11.2006
Программа "Гарячии клавиши в ДОС" на комбинации клавиш вешаются некоторые команды(например LALT+D - dir), также в правом верхнем углу выводятся часы. Полностью правильно работает в ДОС и 98 винде, в 2к и ХР - возникают разнообразные глюки...

P.S. А вобще почитай Зубкова, очень подробно все описано.
492
21 апреля 2007 года
alibabaich
238 / / 08.07.2004
Цитата: Lone Wolf
Программа "Гарячии клавиши в ДОС" на комбинации клавиш вешаются некоторые команды(например LALT+D - dir), также в правом верхнем углу выводятся часы. Полностью правильно работает в ДОС и 98 винде, в 2к и ХР - возникают разнообразные глюки...

P.S. А вобще почитай Зубкова, очень подробно все описано.


И будет глючить в 2к и ХР... Для этих осей другая идеология есть... Если кто помнит появление линейки 2000 M$ предупреждал о не совместимости.

274
22 апреля 2007 года
Lone Wolf
1.3K / / 26.11.2006
Хорошо что вобще работает.... большинство програм вобще не пашут, так-как НТ не разрешает с портами работать. А тут глюки, большей часту с отображением часов возникают
4.9K
22 апреля 2007 года
efferson
57 / / 08.12.2005
"Assembler. Язык неограниченных возможностей" - Вы про эту книгу говорили?
261
22 апреля 2007 года
ahilles
1.5K / / 03.11.2005
тот подход который был в DOS вообще не пашет на Windwos NT!
в таких системах резидентности в чистом его проявлении быть не может, можно предложить перехват API функции в качестве замены этому методу, но это лишь отдалённое напоминание резидентности,
написание драйверов тоже не может бьть названо резидентностью, поскольку все драйвера по-определению и так всегда находяться в памяти во всех процессах и будут там находиться пока им это не надоест
4.9K
22 апреля 2007 года
efferson
57 / / 08.12.2005
Вобщем почитал умную книжку, сделал всё как там написано - получилось нечто вроде:
Код:
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


Но ничего работает :) Подскажите, пожалуста, в чём моя ошибка.
На сколько я понимаю - 27ое прерывание оставит в памяти программу вплоть до указанного смещения, т.е. использование описанных мною функций вполне законно. Однако, резидент не создаётся - при повторном запуске программы проверка на отклик опять даёт отрицательный результат. При третьем запуске получаю ошибку ntvdm :)
274
23 апреля 2007 года
Lone Wolf
1.3K / / 26.11.2006
1. зачем ты в обработчике сохраняеш флаги? они сохраняются автоматически при вызове, прерывания. По этому при выполнении ирет-а, при обработке твоего запроса. будет происхродить сбой, потому что в стэке находятся (флаги,флаги,адресс возврата).
2. 13ое - прерывание разве не апаратное? контроллеру сообщать не надо?
3. 27-ое кажется завершает сом программу, а не ехе.
4. переменная oldHandler -должна быть двойным словом.
5. почему cs:oldHandler, если она описана в сегменте данных?
6. А чем тебе не подходит предложеный мной приммер. Кстати, мультиплексорное прерывание - это стандарт используеммый в ДОС при написсании резидентов.
7. Читай Зубков "Ассемблер для DOS, Windows и Unix"
8. Вот еще два приммера из Зубкова, с подробными комментариями

P.S. Напиши мне в личку свое мыло вышлю Зубкова
334
23 апреля 2007 года
HexEdit
809 / / 27.07.2006
[quote=Lone Wolf]13ое - прерывание разве не апаратное? контроллеру сообщать не надо?[/quote]
Нет, это сервис BIOS
261
23 апреля 2007 года
ahilles
1.5K / / 03.11.2005
этот пример будет работать только под DOS, в Windows этот резидент работать не будет, даже если будет работать, то отдачи от него никакой не будет, потому что у каждого процесса своя память, и резидент будет умирать после смерти процесса ntvdm
ЗАБУДЬ!
274
23 апреля 2007 года
Lone Wolf
1.3K / / 26.11.2006
Цитата: ahilles
этот пример будет работать только под DOS, в Windows этот резидент работать не будет, даже если будет работать, то отдачи от него никакой не будет, потому что у каждого процесса своя память, и резидент будет умирать после смерти процесса ntvdm
ЗАБУДЬ!


А где ты видел, что-бы задача стояла, ввиде написания резидента под Виндовс? Это обычная учебная лаба по Асму. ОС - ДОС

4.9K
24 апреля 2007 года
efferson
57 / / 08.12.2005
Хм... моя проблема решилась путём переделки программы под .com файл (с моделью памяти tiny) - .exe'шник c моделью памяти medium запустить резидентом так и не удалось... :) В чём суть? Проблема в XP?

Плюс ко всему такой интересный вопрос - я запускаю cmd оболочку и создаю там резидента, закрываю её. В теории после её закрытия резидент должен остаться в памяти, и обращение к нему будет возможно при повторных запусках cmd оболочки. Однако на практике ничего не работает. В чём причина?
492
24 апреля 2007 года
alibabaich
238 / / 08.07.2004
Цитата: efferson

Плюс ко всему такой интересный вопрос - я запускаю cmd оболочку и создаю там резидента, закрываю её. В теории после её закрытия резидент должен остаться в памяти, и обращение к нему будет возможно при повторных запусках cmd оболочки. Однако на практике ничего не работает. В чём причина?


Если бы так было, то мелкомягкие бы были совсем плохой фирмой. cmd - это по сути виртуальная машина, со своим адресным пространством. Когда cmd закрывается, то память отведенная ей автоматически освобождается. Даже если там и висит прога, то толку от нее 0.

10
24 апреля 2007 года
Freeman
3.2K / / 06.03.2004
Цитата: alibabaich
cmd - это по сути виртуальная машина, со своим адресным пространством.


cmd.exe - приложение Win32, ничего общего с DOS, кроме внешности, не имеет. А command.com в XP - всего лишь точка входа в ntvdm, как говорили выше.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог