- •Системное программное обеспечение
- •Общие сведения о резидентных программах
- •Общие сведения о резидентных программах
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
Защита резидентной программы от повторной установки
LAST_BLK: ;не последний ли это блок? CMP BYTE PTR ES:[0],'Z'
JZ SET_UP
; адрес заголовка следующего блока
NEXT:
MOV DX,ES:[3] MOV BX,ES
АDD BX,DX
INC BX MOV ES,BX JMP START
SET_UP: ...
Выгрузка резидентной программы из памяти
В DOS нет средств выгрузки резидентных программ. Единственный предусмотренный для этого механизм - переза грузка компьютера. Практически, однако, большинство резидентных программных продуктов имеют встроенные средства выгрузки.
Чтобы выгрузить резидентную программу из памяти, необходимо сделать три вещи:
1)закрыть открытые программой файлы и устройства
2)восстановить все перехваченные векторы прерываний
3)освободить всю занятую программой память
Выгрузка резидентной программы из памяти
Трудность может вызвать второй шаг, так как после данного резидента могли быть загружены другие программы, перехватившие те же прерывания. Если в такой ситуации восстановить вектор прерывания в значение, которое он имел до загрузки данного резидента, программы, загруженные позже, не будут получать управление. Более того, они не будут получать управление только по тем прерываниям, которые у них совпали с прерываниями, перехваченными выгружаемой программой, в то время как другие векторы прерываний будут все еще указывать на их обработчики, что почти наверняка приведет к ошибкам. Поэтому, если хоть один вектор прерывания не указывает на используемый обработчик, выгружать резидентную программу нельзя. Хорошая программа перед очисткой памяти и восстановлением векторов должна по крайней мере предупредить об изменившихся векторах и предложить пользователю выбор.
Выгрузка резидентной программы из памяти
Идеальным случаем было бы отслеживание всех изменений векторов вместе с причинами этих изменений. Проблему контроля изменениий векторов можно решить, отслеживая функции для работы с памятю 48Н, 49Н и 4АН прерывания 21Н и проверяя, не были направлены в освобождаемую область какие-либо векторы.
Формат функции 48Н прерывания 21Н: АХ – номер функции, т.е. 48Н
ВХ – запрошенное количество памяти в параграфах Функция распределяет блок памяти длиной ВХ параграфов,
возвращая сегментный адрес этого блока в АХ (блок начинается с АХ:0000). Если распределение неудачно, то устанавливается флаг CF, в АХ возвращается код ошибки, а ВХ содержит максимальный размер доступной для распределения памяти в параграфах.
Выгрузка резидентной программы из памяти
Формат функции 49Н прерывания 21Н: АХ – номер функции, т.е. 49Н
ES – сегментный адрес освобождаемого блока памяти Функция освобождает блок памяти, начинающийся с адреса
ES:0000.
Формат функции 4АН прерывания 21Н: АХ – номер функции, т.е. 4АН
ES – сегментный адрес распределенного блока памяти ВХ – желаемый размер блока памяти в параграфах
Изменяет размер существующего блока памяти. Если перераспределение неудачно, то устанавливается флаг CF, в АХ возвращается код ошибки, а ВХ содержит максимальный размер доступной для распределения памяти в параграфах.
Выгрузка резидентной программы из памяти
Если же программа все-таки выгружается, то это можно сделать с помощью уже рассмотренного выше мультиплексного прерывания 2Fh. Если встроенный в резидентную программу обработчик этого прерывания, анализируя номер подфункции (содержимое регистра AL), обнаруживает, что этот номер соответствует команде выгрузки, он реализует все действия, необходимые для выгрузки программы из памяти.
Вызов прерывания 2Fh, реализующий выгрузку конкретной резидентной программы, можно выполнить в специально созданной выгружающей программе. Практически всегда в качестве выгружающей используют саму резидентную программу, точнее, ее вторую копию, которая, если ее запустить в определенным режиме, не только не пытается остаться в памяти, но, наоборот, выгружает из памяти свою первую копию.
Выгрузка резидентной программы из памяти
Пусть, подфункция 00h прерывания 2Fh в приведенном ниже примере служит для проверки на наличие в памяти, а подфункция 01h - для выгрузки.
Выгрузка резидентной программы из памяти
Резидентный обработчик прерывания 2Fh прежде всего проверяет номер функции, поступивший в регистре АН. Если этот номер отличается от C8h, управление передается следующему обработчику по цепочке.
Далее анализируется содержимое регистра AL. Если AL=00h, осуществляется переход на метку iamhere, где в регистр AL засыла ется код FFh наличия в памяти первого экземпляра данной программы, после чего командой iret управление возвращается в вызывающую программу.
Если AL=01h осуществляется переход на метку uninst для выполнения действий по выгрузке программы. При любом другом номере подфункции управление передается следующему обработчику по цепочке.
Выгрузка резидентной программы из памяти
По метке uninst осуществляется сохранение используемых далее регистров, и функцией DOS 25h восстанавливается из ячеек old_08h и old_2Fh исходное содержимое соответствующих векторов.
Далее из ячейки со смещением 2Ch относительно начала PSP в ES загружается адрес окружения программы. При загрузке программы MS DOS, кроме программных сегментов, создает для нее еще и сегмент окружения. Сегмент окружения содержит ASCIIZ- строки, задающие значения некоторых глобальных переменных, эти значения могут устанавливаться командой MS DOS SET, они доступны командным файлам и - через PSP – программам.
Сегментный адрес освобождаемого блока памяти - единственный параметр, требуемый для выполнения функции DOS 49h (размер освобождаемого блока DOS известен, он хранится в
Выгрузка резидентной программы из памяти
Далее освобождается блок памяти с самой программой. Сегментный адрес этого блока (адрес PSP) находится, естественно, в CS. Наконец, командой iret управление передастся в программу, вызвавшую прерывание 2Fh.
Для того, чтобы удалить из памяти резидентную программу, достаточно в какой-то программе вызвать прерывание 2Fh с функцией, присвоенной нашей программе, и подфункцией выгрузки 01h. Проще всего создать для этого специальную выгружающую программу:
