ограма повинна завершитися без залишення в пам'яті. Ці дії виконуються за міткою installed. Якщо повернуто інше значення, ініціалізація триває (для надійності варто було перевірити, чи повернуто саме 0). Зберігається старе вміст вектора 2Fh, встановлюється наш обробник цього переривання, після чого виконуються всі дії по встановленню, передбачені в старому варіанті програми динамічного дампа. При переході на мітку installed на екран виводиться повідомлення про неможливість повторної установки і виконується функція завершення 4Сh з кодом повернення 01h. Останнє, звичайно, має символічний характер, оскільки цей код надалі не аналізується. h2> 2.3. Вивантаження резидентної програми з пам'яті
Слід помітити, що в DOS відсутні кошти вивантаження резидентних програм. Єдиний передбачений для цього механізм - Перезавантаження комп'ютера. Практично, однак, більшість резидентних
програмних продуктів мають вбудовані засоби вивантаження. Зазвичай вивантаження резидентної програми здійснюється відповідною командою, яка подається з клавіатури і сприйманої резидентної програмою. Для цього резидентна програма повинна перехоплювати переривання, що надходять з клавіатури, і "виловлювати" команди ви-Грузьке. Інший, боже простий спосіб полягає у запуску деякої програми, яка за допомогою, наприклад, мультиплексного переривання 2Fh передає резидентної програмі команду вивантаження. Найчастіше в якості "вивантажуються" використовують саму резидентну програму, точніше, її другу копію, яка, якщо її запустити в певному режимі, не тільки не намагається залишитися в пам'яті, але, навпаки, вивантажує з пам'яті свою першу копію.
Вивантаження резидентної програми з пам'яті можна здійснити різними способами. Найбільш простий - звільнити блоки пам'яті, які займає програмою (власне програмою та її оточенням) за допомогою функції DOS 49h. Інший, більш складний - використовувати в вивантажуються програмі функцію завершення 4Ch, змусивши її завершити НЕ саму вивантажують, а резидентну програму, та ще після цього повернути управління в вивантажують. У будь-якому випадку перед звільненням пам'яті необхідно відновити всі вектори переривань, перехоплені резидентну програму. Слід підкреслити, що відновлення векторів представляє в загальному випадку значну і іноді навіть нерозв'язну проблему. По-перше, старе вміст вектора, яке зберігається десь у полях даних резидентної програми, неможливо витягнути "зовні", з іншої програми, так як немає ніяких способів визначити, де саме його сховала резидентна програма в процесі ініціалізації. Тому вивантаження резидентної програми легше здійснити з неї самої, ніж з іншої програми. По-друге, навіть якщо вивантаження здійснює сама резидентна програма, вона може правильно відновити старе вміст вектора лише в тому випадку, якщо цей вектор НЕ був пізніше перехоплений інший резидентну програму. Якщо ж це сталося, в таблиці векторів знаходиться вже адреса не вивантажується, а ...