Выпуск № 1230 от 24.06.2009, 21:35
Администратор рассылки: Лысков Игорь Витальевич, Модератор
В рассылке: подписчиков - 424, экспертов - 60
В номере: вопросов - 1, ответов - 2
Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке: оценить выпуск >>
Вопрос № 169622: Здравствуйте уважаемые эксперты!!! Подскажите пожалуйста как выгрузить резидентную программу, перехватывающую прерывания, если после нее загружена еще резидентная программа перехватывающая это прерывание, с сохранением порядка прерываний!!!...
Вопрос № 169622:
Здравствуйте уважаемые эксперты!!! Подскажите пожалуйста как выгрузить резидентную программу, перехватывающую прерывания, если после нее загружена еще резидентная программа перехватывающая это прерывание, с сохранением порядка прерываний!!!
Отвечает Лысков Игорь Витальевич, Модератор :
Здравствуйте, Cergey. Так понимаю, исходного текста этих программ нет...Ну и ладно. Надо понимать, что при установке нового обработчика любого прерывания адрес старого обычно сохраняют и делают переход на старый обработчик в случае неудовлетворению некому условию (причем есть несколько способов перехода на старый вектор) Перед тем, как выгрузить предыдущий резидент, надо исключить отработчики всех векторов, находящиеся в нем, из каждой цепочки отработки прерываний. Теперь о том, как
это реализовать... Могу предложить следующий путь решения этой задачи. 1) Дизассемблируем обе программы, чтобы найти, во-первых, какие прерывания перехвачены, во-вторых, где хранится адрес предыдущего обработчика. 2) Пишем программу, в которой: а) пробегая по всем блокам управления памятью MCB, находим сегменты, в которых "сидят" оба резиденты. б) считываем по ранее найденным по листингу предыдущего резидента адресам векторы прерываний до предыд
ущего резидента и если эти прерывания используются в последнем резиденте, то вписываем значение вектора в нужное место (как адрес предыдущего обработчика), если не используются, то просто устанавливаем на этот адрес обработчик. в) освобождаем блоки памяти (окружение, саму программу), занятые предыдущим резидентом... Возможные другие блоки выделенной памяти этим резидентом (это бывает очень редко, но проверить надо) легко обнаружить, например, в последовательности MCB или в листинге.
Если
что не понятно, то милости просим в мини-форум. Украина, Кировоград ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru
Я так понимаю, что выгрузить нужно свой резидент, когда после него загружено еще что-то на этом же прерывании, правильно? В общем, предлагаю следующий метод.
Начало вашей программы выглядит так:
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 (Россия) |
Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке: оценить выпуск >>
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.