retf ;Передаем управление программе ; Процедуры;
GetExeName PROC NEAR
; Анализируем окружение ДОС, выделяем ; имя программы и копируем его в буфер NameFE
Процедура GetExeName отыскивает имя программы в окружении ДОС и переносит его в переменную NameFE. Если имя выделить не удалось (не найдены два последовательных нуля в буфере длиной 1000 байт или количество переменных в расширенной части равно 0)i фаг не может определить местоположение и имя защищаемой файла — в этом случае он просто завершает свою работу и без каких-либо сообщений передает управление защищаемой программе. Таким образом, непременным условием работоспособности фага является использование версии ДОС 3.0 и выше. Фактически все, что делает процедура GetExeName, реализуется единственной строкой на Турбо Паскале:
NameFE := PararnStr (0);
Полезно взглянуть на реализацию GetExeName, чтобы лишний раз оценить преимущества использования современных языков программирования высокого уровня.
mov es,PSP ES = PSP
mov es,es:[2Ch] ES - сегмент окружения ; Ищем начало дополнительнык параметров
mov сх,1000 Ищем в буфере
длиной 1000 байт
mov Ьх,-1 Начинаем с первого байта SEARCH:
inc bx Текущий байт
mov ax,es:[bx] Текущее слово
стр ах, 0 Ищем два нуля
jz EndSearch Переходим, если нашли
loop Search Повторяем для следующего байта
jmp Exit He найдено имя - выходим! ; Переносим имя файла endSEARCH:
add bx,2 Смещение количества параметров
mov ax,es:[bx] Получаем количество параметров
crop ax,0 Есть параметры?
je Exit Нет, выходим
add Ьх, 2 Начало имени
lea di,NameFE Индекс копии
mov сх,0 Готовим счетчик длины LAB1:
mov ah,es:[bx] Очередной символ
mov [di],ah Переносим его
inc bx Наращиваем указатели
inc di
inc сх и счетчик
cmp ah,О
jnz Labi Повторяем до символа О
add сх,-4 СХ - длина имени без расширения и нуля
mov LName,cx
ret
ReadHead PROC NEAR
; Открываем ЕХЕ-файл, читаем из него заголовок