Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

_Ayl_
Статус: 7-й класс
Рейтинг: 537
∙ повысить рейтинг >>
AMV007
Статус: 3-й класс
Рейтинг: 141
∙ повысить рейтинг >>
Дмитрий Бобровников
Статус: 2-й класс
Рейтинг: 77
∙ повысить рейтинг >>

∙ / КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler (Ассемблер)

Выпуск № 1230 от 24.06.2009, 21:35
Администратор рассылки: Лысков Игорь Витальевич, Модератор
В рассылке: подписчиков - 424, экспертов - 60
В номере: вопросов - 1, ответов - 2

Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке:
оценить выпуск >>

Вопрос № 169622: Здравствуйте уважаемые эксперты!!! Подскажите пожалуйста как выгрузить резидентную программу, перехватывающую прерывания, если после нее загружена еще резидентная программа перехватывающая это прерывание, с сохранением порядка прерываний!!!...



Вопрос № 169622:

Здравствуйте уважаемые эксперты!!!
Подскажите пожалуйста как выгрузить резидентную программу, перехватывающую прерывания, если после нее загружена еще резидентная программа перехватывающая это прерывание, с сохранением порядка прерываний!!!

Отправлен: 19.06.2009, 21:20
Вопрос задал: Cergey, Посетитель
Всего ответов: 2
Страница вопроса >>


Отвечает Лысков Игорь Витальевич, Модератор :
Здравствуйте, Cergey.
Так понимаю, исходного текста этих программ нет...Ну и ладно.
Надо понимать, что при установке нового обработчика любого прерывания
адрес старого обычно сохраняют и делают переход на старый обработчик в случае
неудовлетворению некому условию (причем есть несколько способов перехода на старый вектор)
Перед тем, как выгрузить предыдущий резидент, надо исключить отработчики всех векторов,
находящиеся в нем, из каждой цепочки отработки прерываний.
Теперь о том, как это реализовать...
Могу предложить следующий путь решения этой задачи.
1) Дизассемблируем обе программы, чтобы найти, во-первых, какие прерывания перехвачены,
во-вторых, где хранится адрес предыдущего обработчика.
2) Пишем программу, в которой:
а) пробегая по всем блокам управления памятью MCB, находим сегменты, в которых "сидят" оба резиденты.
б) считываем по ранее найденным по листингу предыдущего резидента адресам векторы прерываний до предыд ущего резидента
и если эти прерывания используются в последнем резиденте, то вписываем значение вектора в нужное место (как адрес предыдущего обработчика),
если не используются, то просто устанавливаем на этот адрес обработчик.
в) освобождаем блоки памяти (окружение, саму программу), занятые предыдущим резидентом...
Возможные другие блоки выделенной памяти этим резидентом (это бывает очень редко, но проверить надо)
легко обнаружить, например, в последовательности MCB или в листинге.

Если что не понятно, то милости просим в мини-форум.
Украина, Кировоград
ICQ # 234137952
Mail.ru-агент: igorlyskov@mail.ru

-----
Удачи!

Ответ отправил: Лысков Игорь Витальевич, Модератор
Ответ отправлен: 19.06.2009, 23:04

Оценка ответа: 4
Комментарий к оценке:
Спасибо конечно, но только я ничего не понял.

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 251220 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Отвечает _Ayl_, 7-й класс :
    Здравствуйте, Cergey.

    Я так понимаю, что выгрузить нужно свой резидент, когда после него загружено еще что-то на этом же прерывании, правильно?
    В общем, предлагаю следующий метод.

    Начало вашей программы выглядит так:

    jmp install

    inter_21 proc far
    ...

    Причем в качестве адреса обработчика прерывания вы прописываете адрес inter_21.
    Это абсолютно правильное решение, но выгрузка резидента затруднена, особенно если будет перехвачено несколько прерываний. Точнее, проблема не в самой выгрузке, а в количестве занятой резидентом памяти после выгрузки. Грубо говоря, вам придется оставить занятым весь блок, отведенный под резидента.
    При перехвате одного прерывания проблем нет.
    ПРи выгрузке вы помещаете по адресу inter_21 5 байт: код команды дальнего перехода 0eah, за которыми помещаете адрес обработчика 21-го прерывания на момент инсталляции вашей программы. В результате, когда резидент, установленный после вашего, произведет вызов &q uot;оригинального обработчика", управление будет передано на этот кусок, и прозрачно передано дальше.
    Соответственно, при выгрузке вам нужно будет оставить занятыми только эти 5 байт (а реально получится 1 блок памяти).
    Теперь как быть в случае перехвата нескольких прерываний.
    Собственно, все тоже самое.
    После выгрузки у вас в памяти должен остаться блок, в котором будут прописаны дальние переходы на старые вектора.
    В программе это будет выглядеть примерно так, как показано в приложении.
    При выгрузке вы помещаете в соответствующие ячейки адреса старых векторов, после чего оставляете в памяти только этот блок.

    Приложение:

    Ответ отправил: _Ayl_, 7-й класс
    Ответ отправлен: 20.06.2009, 14:45

    Оценка ответа: 5
    Комментарий к оценке:
    _Ayl_, СПАСИБО большое. С меня конечно рейтинг и "Спасибо" через Мой кошелёк!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 251245 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!



    Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке:
    оценить выпуск >>

    подать вопрос экспертам этой рассылки >>

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров >>

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.3 от 20.06.2009

    В избранное