Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2010, 15:12   #1
vamp8
 
Регистрация: 04.06.2010
Сообщений: 3
По умолчанию Перехват создания файла DOS

Здравствуйте. Написала программку, которая при попытке создать файл вставляет вместо первых 2х символов названия символы "MY". Например, файл: привет.txt
она создает: MYивет.txt
Но она у меня не работает, или я ее не правильно запускаю, хз. Компилится без проблем. Можете подсказать, что не так?
Код:
	.model tiny
;.stack 100h
;.386
	.data
myname	db	"MY",0	;строка для замены первых двух букв файла
newname db 12 dup(0)			;измененное имя
dta	db	21 dup (0)           ; поля для DTA
dtaname	db	13 dup (0)           ;имя файла

	.code
	org 2Ch
envseg		dw	?	;Сегментный адрес копии окружения DOS
	org 80h
cmd_len		db	?	;Длинна командной строки
cmd_line	db	?	;начало командной строки
	org 100h		;COM программа
start:
old_int21h:
	jmp	short initialize	;эта команда занимает 2 байта, так что вместе с ним получим old_int21h dd ?
		dw	0
int21h_handler proc far		;обработчик прерывания 21h
	pushf					;сохраняем флаги
	cmp ah,3Ch				;если вызвали функцию 3Ch (создать файл)
	je	fn3Ch				;начать обработчик
	;cmp ah,716Ch			;если вызвали функцию 716Ch (создать файл с длинным именем)
	;je	fn3Ch				;начать обработчик
	jmp	short	not_fn3Ch	;иначе - вернуть управление предыдущему обработчику
fn3Ch:
	push	ax				;сохранить модифицируемые регистры
	push	bx				;
	mov		bx,dx
	cmp	byte ptr	ds:[bx+1],':'	;если втрой символ ASCIZ строки, переданной int 21h, двоеточие - первый должен быть именем диска
	je full_spec
	mov ah,19h					;иначе функция DOS 19h - оперделить текущий диск
	int 21h
	add al, 'A'					;преобразовать номер диска к заглавной букве
	jmp short compare			;перейти к сравнению
full_spec:
	mov	al,byte ptr [bx]		;AL=имя диска из аски з строки
	and al,11011111b			;преобразовать к заглавной букве
compare:
; устанавливаем адрес DTA     
	mov	ah, 1ah
	lea	dx, dta
	int 	21h
	;mov offset dtaname,dx
	;xor ah,ah
	;lea di,ds[bx+3]
	;mov al,00h
	;mov cx,13
	;repne scasb

	;cmp al,byte ptr cs:cmd_line[1]	;если диски
	;je access_denied				;совпадают  - запретить доступ
	;pop bx							;иначе восстановить регистры
	;pop ax
not_fn3Ch:
	popf							;и флаги
	jmp dword ptr cs:old_int21h		;и передать управление предыдущему обработчику int 21h
access_denied:
	pop		bx							;восстановит регистры
	pop		ax
	popf
	push	bp
	mov		bp,sp
	or	word ptr [bp+6],1			;установить флаг переноса (бит 0) врегистре флагов, который поместила команда int в стек перед адресом возврата
	pop	bp
	mov ax,5						;возвратить код ошибки доступ запрещен
	iret							;вернуться в программу
int21h_handler	endp

initialize proc near
	cmp	byte ptr cmd_len,3			;проверить размер командной строки (должно быть 3 -пробел, диск, двоеточие)
	jne not_install
	cmp byte ptr cmd_line[2],':'	;проверить 3й символ командной строки, должно быть двоеточие
	jne not_install
	mov al,cmd_line[1]
	and al,11011111b				;преобразовать второй символ командной строки к заглавной букве
	cmp al,'A'						;проверить, что это не больше A и не меньше Z
	jne not_install					;если хоть одно из этих условий не выполняется - выдать информацию о программе и выйти
	cmp al,'Z'						;иначе начать процедуру инициализации
	jne not_install
	
	mov ax,3521h					;AH=35h, AL - номер прерывания
	int 21h							;получить адрес обработчика int 21h
	mov word ptr old_int21h,bx		;и поместить его в old_int21h
	mov word ptr old_int21h+2,es
	
	mov ax,2521h					;AH=25h, AL - номер прерывания
	mov dx,offset int21h_handler	;DS:DX - адрес нашего обработчика
	int 21h							;установить обработчик int 21h
	
	mov ah,49h						;
	mov es,word ptr envseg			;ES= сегментный адрес блока с нашей копией окружения DOS
	int 21h							;освободить память из под окружения
	mov dx,offset initialize		;DX - адрес первого байта за концом резидентной части проги
	int 27h							;завершить выполнение оставшись резидентом
	
not_install:
	mov ah,9
	mov dx,offset usage				;DS:DX= адрес строки с инфой об использовании проги
	int 21h							;вывод строки на экран
	ret								;норм завершение проги
;текст который выдает прога при запуске с неправильной командной строкой
usage	db "Использование: tsr.com D:", 0Dh,0Ah
		db "запрещает удаление на диске D:", 0Dh,0Ah
		db "$"

initialize endp
	end start
	

end
vamp8 вне форума Ответить с цитированием
Старый 04.06.2010, 22:35   #2
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

если в пути диска нет, то ничего вызывать не нужно просто замени два символа
не использовать внутри прерывание 21h
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Старый 08.06.2010, 13:01   #3
vamp8
 
Регистрация: 04.06.2010
Сообщений: 3
По умолчанию

я переделала, но по ходу она криво возвращает права прерыванию, подскажите что не так?
Код:
model	tiny
	.code
	.186
	org	100h
begin:		
	jmp	init
;данные о старом векторе
old_vec21	label	dword
old_21o 	dw	?
old_21s 	dw	?
;контролируемая строка
check_name	db	'check.txt',0
check_size	equ	$-check_name
control_message db	'illegal file name : $'

;наш обработчик
new_vec21:
	cmp	ah,3Ch
	jz	isInterupt
	jmp	cs:old_vec21

;наша функция
isInterupt:
	pusha
	push	ds
	;востанавливаем наш сегмент памяти
	push	cs
	pop	ds
	;выводим сообщение
	mov        bx,dx
    mov        byte ptr ds:[bx+3],'M' ; 
	mov        byte ptr ds:[bx+4],'Y' 
	call	cs:old_vec21
	;выходим из прерывания
	pop	ds
	mov	bp,sp
	mov	ax,[bp+20]
	or	ax,1
	mov	[bp+20],ax
	popa
	iret
;инициализация
init:
mov	ax,3521h
	int	21h
;запоминаем старый вектор
	mov	old_21o,bx
	mov	old_21s,es
;контролируем присутсвие
	mov	cx,check_size
	mov	si,107h
	mov	di,107h
	repe	cmpsb
	or	cx,cx
	jz	isStop
;сообщение о начале работы
isGo:	mov	ah,9
	mov	dx,offset dbMessageGo
	int	21h
;ставим свой вектор
	mov	ax,2521h
	mov	dx,offset new_vec21
	int	21h
;выходим
	mov	dx,offset init
	int	27h

dbMessageGo	db	'interupt set up$'
dbMessageNo	db	'Im here$'

;сообщаем о повторе
isStop: mov	ah,9
	mov	dx,offset dbMessageNo
	int	21h
	xor	ax,ax
	int	16h
	ret
	end	begin
vamp8 вне форума Ответить с цитированием
Старый 08.06.2010, 21:56   #4
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

Код:
isInterupt:
	pusha
	push	ds
	;востанавливаем наш сегмент памяти
	push	cs
	pop	ds
	;выводим сообщение
	mov        bx,dx
    mov        byte ptr ds:[bx+3],'M' ; 
	mov        byte ptr ds:[bx+4],'Y' 
	call	cs:old_vec21
	;выходим из прерывания
	pop	ds
	mov	bp,sp
	mov	ax,[bp+20]
	or	ax,1
	mov	[bp+20],ax
	popa	iret
в корне не верно
Код:
call	cs:old_vec21
должно быть как минимум так
Код:
pushf
call	cs:old_vec21
строка передаваемая тоже неверно делается, если хотите писать в чужую зачем менять сегмент? не завершена 0 может получится если имя файла 1 символ
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Старый 08.06.2010, 21:56   #5
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

Код:
isInterupt:
	pusha
	push	ds
	;востанавливаем наш сегмент памяти
	push	cs
	pop	ds
	;выводим сообщение
	mov        bx,dx
    mov        byte ptr ds:[bx+3],'M' ; 
	mov        byte ptr ds:[bx+4],'Y' 
	call	cs:old_vec21
	;выходим из прерывания
	pop	ds
	mov	bp,sp
	mov	ax,[bp+20]
	or	ax,1
	mov	[bp+20],ax
	popa	iret
в корне не верно
Код:
call	cs:old_vec21
должно быть как минимум так
Код:
pushf
call	cs:old_vec21
строка передаваемая тоже неверно делается, если хотите писать в чужую зачем менять сегмент? не завершена 0 может получится если имя файла 1 символ
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перехват имени копируемого файла..!!! MaXXX Win Api 0 02.04.2010 18:32
Сохранение файла в Dos кодировке mistx Microsoft Office Excel 5 04.12.2009 16:33
Перехват информации о тэгах проигрываемого файла из Windows Media Player DM_bite Мультимедиа в Delphi 3 14.10.2009 10:27
Поиск по дате создания файла kayman БД в Delphi 1 14.09.2007 14:54
Дата создания файла Шеллер Алексей Общие вопросы Delphi 2 03.03.2007 12:32