зуватися програма. Останніми рядками секції ініціалізації викликається функція DOS 31h, яка виконує завершення програми із залишенням в пам'яті її резидентної частини.
Якщо програму запустити з клавіатури повторно, в пам'ять буде завантажена і залишиться резидентної її друга копія. Це погано не тільки тому, що даремно витрачається пам'ять, більш неприємним є вторинний перехоплення тих же векторів. Якщо резидентна програма після її активізації не звертався до старому вмісту перехоплених нею векторів, то друга копія повністю позбавить першу працездатності, і тоді повторна завантаження призведе тільки до витрачанню пам'яті. Якщо, проте, як це зазвичай і має місце, резидентна програма в процесі своєї роботи передасть управління старому обробникові перехопленого нею переривання, то нова копія резидентної програми, що зберегла в процесі ініціалізації адресу першої копії в якості вмісту перехоплюваних вектора, буде при кожній активізації викликати і першу копію. В результаті резидентна програма буде фактично виконуватися при кожному виклику двічі. У багатьох випадках таке повторне виконання порушить правильну роботу програми. Тому обов'язковим елементом будь резидентної програми є процедура захисту її від повторного завантаження, або, як кажуть, установки.
Найбільш поширеним методом захисту резидентної програми від повторної установки є використання переривання 2Fh, спеціально призначеного для зв'язку з резидентними програмами. При виклику цього переривання в регістрі АН задається номер функції (від 00h до FFh), а в регістрі AL - номер підфункції (у тому ж діапазоні). 00h - 7Fh зарезервовано для DOS/Windows 0B8h - 0BFh зарезервовано для мережевих функцій 0C0h - 0FFh відводиться для програм. p> Для того, щоб резидентна програма могла відгукнутися на виклик переривання int 2Fh, в ній повинен матися обробник цього переривання. Фактично всі резидентні програми, як системні, так і прикладні, мають такі обробники, через які здійснюється не тільки перевірка на повторну установку, але і взагалі зв'язок з резидентну програму: зміна режиму її роботи або одержання від неї в транзитну програму якихось параметрів. Завдання дії, яке належить виконати оброблювачу переривання 2Fh конкретної резидентної програми, здійснюється за допомогою номера підфункції, помещаемого перед викликом переривання в регістр AL
Таким чином, обробник переривання 2Fh резидентної програми повинен, насамперед, перевірити номер функції в регістрі АН; при виявленні "своєї" функції обробник аналізує вміст регістра AL і виконує витребувані дії, після чого командою iret передасть управління викликала його програмі. Якщо, проте, обробник виявив в регістрі АН "чужу" функцію, він повинен командою jmp CS: old_2fh передати управління по ланцюжку того оброблювачу, адреса якого був раніше у векторі 2Fh. В результаті виклик int 2Fh з будь-якої програми буде проходити по ланцюжку через всі завантажені резидентні програми, поки не досягне "с...