Как отловить программу вызвавшею определенное прерывание?
Зарание благодарен.
когда выполняется инструкция int в стеке сохраняются : регистр флагов, CS,IP
1. Сохраняем старый вектор прерывания
2. Заменяем его вектором который указывает на твой код
а) в твоём коде ты извлекаешь из стека значения CS,IP сохраняешь их где тебе нужно(это и будет адрес программы в памяти), и заталкиваешь обратно в стек.
б) Заталкиваешь в стек текущий регистр флагов
в) Делаешь call по старому(см 1) вектору прерыания.
И вуа-ля...
Для того чтобы узнать месторасположения программы на диске, я думаю существуют спец функции DOS, ну или не существуют.:D
в досе у каждой программы есть PSP (префикс программого сегмента) . в нём по адресу +80h находится командная строка .
Цитата: koderAlex
укажите операционную систему .
ОС - DOS.
Цитата: logree
когда выполняется инструкция int в стеке сохраняются : регистр флагов, CS,IP
1. Сохраняем старый вектор прерывания
2. Заменяем его вектором который указывает на твой код
а) в твоём коде ты извлекаешь из стека значения CS,IP сохраняешь их где тебе нужно(это и будет адрес программы в памяти), и заталкиваешь обратно в стек.
б) Заталкиваешь в стек текущий регистр флагов
в) Делаешь call по старому(см 1) вектору прерыания.
И вуа-ля...
Для того чтобы узнать месторасположения программы на диске, я думаю существуют спец функции DOS, ну или не существуют.:D
после срабатывания инструкции Int в CS, IP будет адрес какой-то команды программы, которая вызвала прерывание. Это понятно.
А как распознать эту программу? Написать нужно универсальную программу для процессоров 8086 и старше.
Спец. функций DOS под мою задачу вроде бы нет?
Сегмент ты знаешь... программа начинается со смещения 100h... про расположение на диске тебе отписал koderAlex. По-моему всё? Что ты подразумеваешь под
Цитата:
как распознать эту программу?
?
Кстати, если прерывание вызвано драйвером, к которому обращается запущенная в данный момент программа, как это считать?
В DOS одна программа может вызывать другую, отдавая ей управление на время. Ну и "Плюс драйвера и резиденты". Со смещения 100h начинаются только com-программы. У exe-программ может быть множество сегментов. Однако память под отдельную программу фрагментируется редко. DOS при запуске программы выделяет для нее один непрерывный блок, перед которым присутствует структура Memory Control Block (вроде бы размером 16 байт), содержащая сигнатуру, идентификатор процесса-владельца и линк на соседний (или соседние) MCB. В PSP программы есть линк на копию блока переменных среды окружения для данного процесса, в конце которого хранится полное имя исполняемого файла, т.е. включая диск и путь. Это чисто из моих воспоминаний про счастливое детство. Это настолько старо, что и либы для DOS я уже давно не храню. Если очень надо, могу попробовать вспомнить что-то и более подробно. Смысл в том, что сначала из сегмента:смещения получаешь линейный адрес, потом определяешь владельца MCB, потом ищешь тот блок, принадлежащий тому же владельцу, где находится PSP, оттуда выуживаешь блок переменных среды, а там уже полное имя экзэшника.
Цитата: Phantom-84
Смысл в том, что сначала из сегмента:смещения получаешь линейный адрес, потом определяешь владельца MCB, потом ищешь тот блок, принадлежащий тому же владельцу, где находится PSP, оттуда выуживаешь блок переменных среды, а там уже полное имя экзэшника.
Спасибо! пойду пробовать...