#include <dos.h>
#define INTR 0x21
#pragma check_stack( off )
#pragma check_pointer( off )
void interrupt far ( *oldint)(...);
void interrupt far newint(...)
{
if(_AH == 0x41)
{
//Что здесь должно быть??
}
_chain_intr( oldint );
}
int main(void);
int main(void)
{
unsigned size;
char _far *newstack;
char _far *tsrbottm;
_asm mov WORD PTR newstack[0], sp
_asm mov WORD PTR newstack[2], ss
FP_SEG(tsrbottm) = _psp;
FP_OFF(tsrbottm) = 0;
size = ((newstack - tsrbottm) >> 4) + 1;
oldint = getvect(INTR);
setvect(INTR, newint);
keep(0, size);
return 0;
}
Резидентная программа
Решил написать програмку под DOS, которая бы перехватывала удаление файлов из системы(т.е. чтобы эта функция не срабатывала).
Отследить удаление файлов мне удается, но вот как удаление запретить не могу понять.
Кто знает подскажите что делать надо, а то ни как не могу разобраться.
Код:
Ну, что никто не знает??:(
переименуй файл или сделай копию, а потом по таймеру верни обратно.
Почему бы просто не вернуть ошибку(FLAGS.CF=1 и в ax код ошибки(что-то вроде access denied)).
Решил написать програмку под DOS, которая бы перехватывала удаление файлов из системы(т.е. чтобы эта функция не срабатывала).
Отследить удаление файлов мне удается, но вот как удаление запретить не могу понять.
Кто знает подскажите что делать надо, а то ни как не могу разобраться.
[/QUOTE]
Зубков. "Ассемблер для DOS, WINDOWS и UNIX"
Цитата:
5.9.1. Пассивная резидентная программа
В качестве первой резидентной программы рассмотрим именно пассивный резидент, который будет активироваться при попытке программ вызывать INT 21h и запрещать удаление файлов с указанного диска.
Спасибо разобрался. У меня теперь другой вопрос возник: как можно отследить,что удаляется файл, ну скажем расположенный по адрессу C:\filename.txt(т.е. я хочу сделать, чтобы только при попытке удалить этот файл срабатывал мой обработчик)
если пишешь под DOS, как ты сказал, то можно перехватывать прерывание и смотреть какой файл удаляется. Ну а если под win32, то есть такая штука как ивенты
в том-то все и дело, что незнаю где смотреть и как оно будет выглядеть(мне бы примерчик)
AH = 41h
[color=red]DS : DX -> ASCIZ filename (no wildcards)[/color]
CL = attribute mask for deletion (server call only, see notes)
Return: CF clear if successful
AX destroyed (DOS 3.3) AL seems to be drive of deleted file
CF set on error
AX = error code (02h,03h,05h)
Код:
char near *filename="C:\\file.txt";
int s;
-------------------------------------
void interrupt far newint(...)
{
if(_AH == 0x41)
{
_asm mov dx,filename
if(_DX==(unsigned)filename)
{
++s;
}
else
_chain_intr(oldint);
}
else
_chain_intr(oldhandler);
}
int s;
-------------------------------------
void interrupt far newint(...)
{
if(_AH == 0x41)
{
_asm mov dx,filename
if(_DX==(unsigned)filename)
{
++s;
}
else
_chain_intr(oldint);
}
else
_chain_intr(oldhandler);
}
естественно никакой файл не удаляется
а когда я убираю строку <asm mov dx,filename>, то ,как мне кажется, всё должно работать так как надо, но файл всеравно удаляется.
В чем тут может быть дело??
[email]snaiper8787@mail.ru[/email] or [email]sn-2@mail.ru[/email]
естественно никакой файл не удаляется
а когда я убираю строку <asm mov dx,filename>, то ,как мне кажется, всё должно работать так как надо, но файл всеравно удаляется.
В чем тут может быть дело??[/QUOTE]
ну так отдебаж и посмотри... ты то хоть адрес прерывания на свой меняешь?
Кстати что за компилятор такой что такие конструкции понимает? это уже даже не очень и ассемблер
без коментариев...
[QUOTE=Deeoni$]
Кстати что за компилятор такой что такие конструкции понимает? это уже даже не очень и ассемблер
[/QUOTE]
уже исправил, дело не в этом это просто опечатка
Вопрос остается открытым
Продизасмь код обработчика и выложи его здесь, может что-нибудь и проясниться.
ну отдебаж код, если не вызываешь реальное прерывание, то ничего происходить не должно