                  Уважаемый редактор!

   Вашему вниманию предлагается модифицированная версия популярной
утилиты RELEASE, предназначенной для выгрузки из памяти резидентных
программ. (Я очень извиняюсь, но не помню, кто ее написал, поскольку
программа уже многократно переделывалась, подвергаясь "англификации",
"русификации" и прочим косметическим операциям, в результате фамилия
автора была безвозвратно утеряна).
   Я надеюсь, что усовершенствованная утилита удовлетворит изысканным
вкусам пользователей, поскольку изменения касались нескольких серьезных
недостатков оригинальной программы.

   Если Вы найдете нужным, опубликуйте листинг утилиты, но заранее
прошу прощения у Вас и уважаемых читателей Софтпанорамы за неприглядный
вид и отсутствие нормальных комментариев, поскольку дизассемблирование
и переделка была осуществлены на скорую руку, когда терпение автора,
получившего от RELEASE "Divide overflow" с вываливанием из редактора,
истощилось.



             Основные отличия исправленной версии RELEASE

   1) Отслеживание "горячей клавиши" ведется не по INT 16h, а по INT 09h,
благодаря чему утилита активируется намного надежнее, в частности, из
COMMAND.COM версий DOS 4.xx и 5.00.

  2) Активация диалоговой части производится только из текстовых 80-
колоночных режимов без переключения видеорежимов.

  3) Утилита теперь контролирует операцию AH=49h int 21h (освободить
блок памяти), благодаря чему не конфликтует с TSR-программами, которые
выгружаются собственными встроенными средствами (Side Kick, NCache,
Frieze и т.д.).

  4) Новый RELEASE защищает свою служебную информацию, хранящуюся после
TSR, контрольной суммой, благодаря чему корректно обрабатываются те
случаи, когда какая-либо программа выполняет своппинг области памяти,
в которой находилась TSR и использует эту область для своих целей
(например, Side Kick 2.0). В этом случае вместо имени выдается текст
"destroyed" и выгрузка из памяти запрещается до окончания своппинга.

  5) Добавлено сохранение/восстановление адреса таблицы SAVE PTR
(двойное слово по 40h:0A8h). Убавлены некоторые, на мой взгляд,
экзотические проверки (например, на запуск/выгрузку Share). Все
равно существуют программы, которые нельзя выгружать из памяти,
и на каждую не напроверяешься.

  6) Исправлен алгоритм подсчета размера занимаемой программой
памяти: учитываются все блоки памяти, занимаемые TSR.

  7) Ликвидирован режим запуска без диалоговой части (последняя
занимает теперь около 1 Кб против 1.8 в старой версии). Суммарный
размер резидентной части, несмотря на все дополнения, уменьшен на
0.5 Кб.

  8) Имеется возможность настроить RELEASE на другую комбинацию
клавиш для активации (запуск с опцией /S[etup]). Несколько изменен
вид командной строки.

  9) И, наконец, утилита (надеюсь) перестала вываливаться по "Divide
overflow" и выводить на экран всякий мусор при всяком удобном случае.




   А теперь, для любопытных пользователей и программистов, общее
описание (на пальцах)

                  Алгоритма работы утилиты RELEASE

   1) Утилита отслеживает функцию DOS AH=4Bh (запуск, загрузка оверлея и
т. д.) и перед исполнением этой функции запоминает в своем рабочем буфере
все вектора прерываний и имя стартовавшей программы. Таким образом, в этом
буфере всегда содержится копия той конфигурации векторов, которая имела
место перед запуском последней программы.

   2) Утилита также перехватывает операции "завершиться и стать резидентно"
(функция AH=31h int 21h и int 27h) и по запросу на такое завершение
сравнивает новую конфигурацию векторов прерываний со старой, существовавшей
до запуска последней программы. В конце завершившейся с установкой
резидентно (TSR-) задачи утилита размещает свою служебную информацию:
адрес PSP, имя, количество, номера и старые адреса изменившихся векторов.
Для этого размер памяти, оставляемый TSR-программе, несколько увеличивается.

   3) Если по из командной строки или в диалоге с пользователем поступает
запрос на выгрузку TSR-программы, то утилита восстанавливает измененные
вектора прерываний и освобождает занимаемую TSR-программой память.


  Донецк, 17 марта 1992                             С. Балтер
