Здравствуйте. Необходимо написать резидент, запрещающий удаление файлов определённого расширения. Программа должна быть написана под DOS 16 бит. Я предполагал это делать так - пишется свой собственный обработчик прерываний 21h, в нём проверяется нужная функция (41h - удаление файлов). Если не наша, уход в старый обработчик. Так вот, почему-то при удалении файла через DOS (cmd.exe, command.com, DosBox, FAR, VC - всё пробовал), файлы всё равно удаляются, а функция 41h не отлавливается. Вот код обработчика, немного недописанный.
| Код | new_21h proc
cmp AH, 41h ;функция удаления je work ;работаем по нашей функции cmp AX, 7141h ;функция удаления файла с длинным именем je work jmp exit_21h ;иначе уход в старый обработчик без возврата work: call clear push AX push BX push CX push DI push SI push DS push ES push CS pop ES mov SI, DX ;адрес имени удаляемого файла search_null: ;перемещение на конец строки mov AL, [SI] inc SI cmp AL, 0h jne search_null sub SI, 2h ;в SI содержится адрес последнего символа имени файла mov BX, SI ;копируем SI в BX - понадобится при поиске mov AX, offset CS:extensions ;адрес extensions add AX, ex_len ;длина std ;флаг DF = 1 - движение назад search_string: dec AX ;на первой итерации AX и DI содержат адрес последнего символа в extensions mov DI, AX ;на последующих - продвижение на 1 символ назад cmp DI, offset CS:extensions + 1 ;дошли до второго символа, а совпадений не найдено je delete_file ;файл можно удалять mov CX, 3h ;ожидаемая длина расширения repe cmpsb ;сравниваем содержимое SI - имя файла и DI - блокируемые расширения mov SI, BX ;возвращаем SI в предыдущее состояние cmp CX, 0h ;найдено совпадение je found jmp search_string found: not_delete_file: pop ES pop DS pop SI pop DI pop CX pop BX pop AX push BP mov BP, SP ;BP <- SP ;[bp+0] bp ;[bp+2] ip ;[bp+4] cs ;[bp+6] flags or [BP+6], 1h ;ставим CF=1 - запрет доступа (бит 0) pop BP mov AX, 5h ;код ошибки - доступ запрещён iret delete_file: pop ES pop DS pop SI pop DI pop CX pop BX pop AX exit_21h: jmp DWPTR CS:[old_21h] new_21h endp
|
Процедура clear - очистка экрана, добавлена для отладки. Теоретически, при удалении файла должна вызываться функция 41h, программа идёт на метку work, очищает экран и работает. Но этого не происходит. Процедура clear точно работоспособна. Обработчик установлен верно. |