Консультация № 17501
25.02.2005, 22:14
0.00 руб.
0 2 2
Здраствуйте. У меня следующая проблема. Я написал такую програмку. Но при запуске, скажем, какой либо программы с СD, или с дискетки, защищенной от записи, DOS страшно ругается. (Ошибка записи: повторить, отменить, игнорировать). Как этого избежать?
Да и еще одно: как при запуске программы она может определить полностью свою длинну, окромя:
mov plen, offset endpr-offset progenrpoint
А как программа при запуске может узнать свое имя полностю с адресом.
Да, а как организовать поик необходимого файла?
Например: File.ext а вдруг он в ДОСе как FILE.EXT, file.ext? Я имею в виду проблемы с регистром.
Заранее вам благодарен.
Ну и в конце отвечу на один вопрос Калашникову.
Ваша программы, котороя дописывается в конец сом файлов с некоторыми сом будет работать некорректно потому, что они имеют структуру ехе программ. Даже command.com в WinMe имеет в начале MZ и длинну что-то около 84 кб? Вообще как такое может быть? А прога format.com Win2000 вообще под DOSом запустить нелзя!:
«This program cannot be run in DOS mode.»!!!

Приложение:
286assume cs:code, ds:codecode segment org 100hpep: jmp execute int21h macro pushf call dword ptr cs:[olint] endm inmemory db ‘Программа была уже запущена$‘,10,13 olint dd ? herz db 03h fhand db 0ffHtint:oit: ;--------------Сигнал программе при повторном ее запуске-------------- cmp ax, 0EFEEh ; jne isex ;Если в ах не 0ЕFЕЕh, то на выход push dx ; push cs ;set ds register pop ds ;as cs register mov ah, 09 ;09h function lea dx, inmemory ;adress of data int21h ; pop ds ; mov ax, 7890h ; iret ;-------------------------------------------------------------------isex: cmp ax, 4B00h jne quinterrupt pusha pushf mov ah, 3Dh mov al, 2 ;Open file int21h mov fhand, ax mov bx, ax mov ah, 42h ;Seek file mov al, 2 mov cx, 0 mov dx, 0 int21h mov ah, 40h ;Write in file mov bx, fHand mov cx, 1 mov dx, offset herz push ds push cs pop ds int21h pop ds mov ah, 3Eh ;Close file mov bx, fhand int21h popf popaquinterrupt: jmp dword ptr cs:[olint]; Тут начинается нерезидентная часть программы, неаобходимая для посаки ее в памятьexecute: mov ax, 0EFEEh int 21h cmp ax, 7890h jne setvector mov ax, 4C00h int 21hsetvector: cli push ax xor ax, ax mov es,ax mov ax, word ptr es:[0084h] mov word ptr olint,ax mov ax, word ptr es:[0086h] mov word ptr [olint+2], ax mov ax, offset tint mov word ptr es:[0084h], ax mov ax, cs mov word ptr es:[0086h], ax pop ax sti pushf mov ah, 09h mov dx, offset tx call dword ptr cs:[olint]retResident: lea dx, execute int 27h tx db "21h прерывание перехвачено...",10,13,‘$‘code endsend pep

Обсуждение

давно
Советник
419
1011
26.02.2005, 01:18
общий
это ответ
Здравствуйте, Nieh!
Обрабатывай ошибки правильно, посмотри 59h функцию.
Поиск - есть расширенные функции для работы с длинными именами файлов. Вот там доступен и регистр, и длина.
Неизвестный
26.02.2005, 14:59
общий
это ответ
Здравствуйте, Nieh!
при запуске, скажем, какой либо программы с СD, или с дискетки, защищенной от записи, DOS страшно ругается. (Ошибка записи: повторить, отменить, игнорировать). Как этого избежать?
надо написать обработчик Int 24h. Этот обработчик должен устанавливать собственную
реакцию на критическую ошибку.Нормальный обработчик INT 24H - это код, который выдает сообщение:
Abort, Retry, Ignore? _
чтобы этого избежать надо вернуть управление прерванной програм-
ме,поместив предварительно в регистр AL код " 3 ":
new_24h: mov al,3
iret

Да, а как организовать поик необходимого файла?
Например: File.ext а вдруг он в ДОСе как FILE.EXT, file.ext? Я имею в виду проблемы с регистром.
для ДОСа не имеет значения регистр. Но если ты работаешь напрямую с диском (допустим через int 13 или порты) приведи имя файла к верхнему регистру просто обнулив пятый бит в символах имени.
command.com в WinMe имеет в начале MZ и длинну что-то около 84 кб?
Ты сам ответил:
они имеют структуру ехе программ.Они являются exe прграммами. А расширение com оставлено для совместимости.Format.com из win2000 вообще является PE(portable executable) файлом.
А как программа при запуске может узнать свое имя полностю с адресом
Смотри DTA .
как при запуске программы она может определить полностью свою длинну
Ну например открыть себя как файл и вызвать
mov ax,4202h
int 21h
это тебе вернет длину файла в DX:AX.
Форма ответа