ZXNet эхоконференция «code.zx»


тема: Обрубаем файлам "хвост"



от: Ivan Roshin
кому: All
дата: 20 Jul 2002
Hello, All!

═══════════════════ del_tail.1 ══════════════════

(c) Иван Рощин, Москва

Fido : 2:5020/689.53
ZXNet : 500:95/462.53
E-mail: asder_ffc@softhome.net
WWW : http://www.ivr.da.ru

Обрубаем файлам "хвост"
═══════════════════════

("Радиомир. Ваш компьютер" 4/2002)

В [1] рассказывалось о проблеме, связанной с использованием
текстового редактора Microsoft Word. Hапомню: речь шла о том,
что в определенных случаях в сохраненном текстовом файле
остаются фрагменты текста, удаленные при редактировании, причем
автор текста может об этом и не подозревать. А получатель,
прочитавший этот файл, может узнать информацию, которая для него
вовсе не предназначалась.
Подобная проблема актуальна и для многих текстовых
редакторов на ZX Spectrum, хотя причина ее возникновения и не
такая, как в MS Word. Дело вот в чем: для хранения на диске
файла, независимо от его длины, выделяется целое число секторов.
Таким образом, остаток последнего сектора ("хвост") файла может
содержать информацию, к этому файлу не относящуюся. Когда мы
сохраняем текст в редакторе, на диск просто записывается целое
число секторов с начала текстового буфера. И если длина текста
не кратна 256 байтам, в остатке последнего сектора будет то, что
находилось в текстовом буфере после фактического конца текста.
Загрузив файл в текстовый редактор, мы эту информацию не увидим
(потому что в каталоге указывается точная длина файла), но при
просмотре содержимого последнего сектора с помощью какого-либо
дискового редактора ее можно прочесть.
А что находится в буфере после конца текста? Это может быть
и остаток предыдущего загруженного в редактор файла (ведь перед
загрузкой нового файла буфер не обнуляется - зачем выполнять
лишнюю работу?), и фрагменты текста, удаленные при
редактировании. А если буфер не очищается при запуске редактора,
там может остаться то, что было помещено туда при работе
предыдущей программы. Даже если этой программой был обычный
"boot", в памяти может остаться каталог диска, с которого был
запущен редактор. Понятно, что делать эту информацию
общедоступной не хотелось бы.
Однако при операциях копирования файла, пересылки его в
форматах hobeta, scl, (и, разумеется, в файлах - образах диска:
trd, fdi, td0), а также при упаковке файлов с помощью архиватора
HRIP остаток последнего сектора также участвует в операции.
Таким образом, нежелательная информация может быть
распространена вместе с самим файлом, и доступ к ней может
получить множество людей.
Если бы область памяти после конца текста обнулялась перед
записью файла, проблема была бы полностью решена. Именно это я
и посоветую создателям редакторов. А что делать простым
пользователям?
Выход есть - воспользоваться специальной программой,
обнуляющей "хвост" указанного файла. Вот ее текст:

SECTOR EQU #C000 ;#100 байт
CATALOG EQU #C100 ;#800 байт
FILE_LIST EQU #C900 ;#800 байт

ORG #8000

;Инициализация:

LD A,(23611) ;системные
OR %00001100 ;переменные
LD (23611),A ;обработчика
XOR A ;клавиатуры
LD (23658),A
LD A,(23562)
PUSH AF
LD A,1
LD (23562),A

BEGIN XOR A ;CLS
OUT (254),A
LD HL,#4000
LD (HL),L
LD DE,#4001
LD BC,#17FF
LDIR
LD HL,#5800
LD (HL),7
LD DE,#5801
LD BC,#2FF
LDIR

;Читаем каталог и определяем его
;контрольную сумму:

CALL READ_CAT

;Формируем список файлов:

CALL MAKE_LIST

;Выбор файла:

SELECT LD A,(ALL_FILES)
AND A ;если нет
JR Z,SELECT_NF ;файлов...

XOR A
LD (FIRST),A
LD (NUM_F),A
CALL PRINT_LIST

SELECT_1 CALL CURSOR_ON

WAIT_K CALL GETSYM
CP "q"
JR Z,SEL_UP
CP 11
JR Z,SEL_UP
CP "a"
JR Z,SEL_DN
CP 10
JR Z,SEL_DN
CP 13
JR Z,WORK_FILE
CP 7
JP Z,EXIT
CP "r"
JR Z,BEGIN
JR WAIT_K

════════════════════════════════════════════════

С уважением, Иван Рощин.

от: Ivan Roshin
кому: All
дата: 20 Jul 2002
Hello, All!

═══════════════════ del_tail.1 ══════════════════

(c) Иван Рощин, Москва

Fido : 2:5020/689.53
ZXNet : 500:95/462.53
E-mail: asder_ffc@softhome.net
WWW : http://www.ivr.da.ru

Обрубаем файлам "хвост"
═══════════════════════

("Радиомир. Ваш компьютер" 4/2002)

В [1] рассказывалось о проблеме, связанной с использованием
текстового редактора Microsoft Word. Напомню: речь шла о том,
что в определенных случаях в сохраненном текстовом файле
остаются фрагменты текста, удаленные при редактировании, причем
автор текста может об этом и не подозревать. А получатель,
прочитавший этот файл, может узнать информацию, которая для него
вовсе не предназначалась.
Подобная проблема актуальна и для многих текстовых
редакторов на ZX Spectrum, хотя причина ее возникновения и не
такая, как в MS Word. Дело вот в чем: для хранения на диске
файла, независимо от его длины, выделяется целое число секторов.
Таким образом, остаток последнего сектора ("хвост") файла может
содержать информацию, к этому файлу не относящуюся. Когда мы
сохраняем текст в редакторе, на диск просто записывается целое
число секторов с начала текстового буфера. И если длина текста
не кратна 256 байтам, в остатке последнего сектора будет то, что
находилось в текстовом буфере после фактического конца текста.
Загрузив файл в текстовый редактор, мы эту информацию не увидим
(потому что в каталоге указывается точная длина файла), но при
просмотре содержимого последнего сектора с помощью какого-либо
дискового редактора ее можно прочесть.
А что находится в буфере после конца текста? Это может быть
и остаток предыдущего загруженного в редактор файла (ведь перед
загрузкой нового файла буфер не обнуляется - зачем выполнять
лишнюю работу?), и фрагменты текста, удаленные при
редактировании. А если буфер не очищается при запуске редактора,
там может остаться то, что было помещено туда при работе
предыдущей программы. Даже если этой программой был обычный
"boot", в памяти может остаться каталог диска, с которого был
запущен редактор. Понятно, что делать эту информацию
общедоступной не хотелось бы.
Однако при операциях копирования файла, пересылки его в
форматах hobeta, scl, (и, разумеется, в файлах - образах диска:
trd, fdi, td0), а также при упаковке файлов с помощью архиватора
HRIP остаток последнего сектора также участвует в операции.
Таким образом, нежелательная информация может быть
распространена вместе с самим файлом, и доступ к ней может
получить множество людей.
Если бы область памяти после конца текста обнулялась перед
записью файла, проблема была бы полностью решена. Именно это я
и посоветую создателям редакторов. А что делать простым
пользователям?
Выход есть - воспользоваться специальной программой,
обнуляющей "хвост" указанного файла. Вот ее текст:

SECTOR EQU #C000 ;#100 байт
CATALOG EQU #C100 ;#800 байт
FILE_LIST EQU #C900 ;#800 байт

ORG #8000

;Инициализация:

LD A,(23611) ;системные
OR %00001100 ;переменные
LD (23611),A ;обработчика
XOR A ;клавиатуры
LD (23658),A
LD A,(23562)
PUSH AF
LD A,1
LD (23562),A

BEGIN XOR A ;CLS
OUT (254),A
LD HL,#4000
LD (HL),L
LD DE,#4001
LD BC,#17FF
LDIR
LD HL,#5800
LD (HL),7
LD DE,#5801
LD BC,#2FF
LDIR

;Читаем каталог и определяем его
;контрольную сумму:

CALL READ_CAT

;Формируем список файлов:

CALL MAKE_LIST

;Выбор файла:

SELECT LD A,(ALL_FILES)
AND A ;если нет
JR Z,SELECT_NF ;файлов...

XOR A
LD (FIRST),A
LD (NUM_F),A
CALL PRINT_LIST

SELECT_1 CALL CURSOR_ON

WAIT_K CALL GETSYM
CP "q"
JR Z,SEL_UP
CP 11
JR Z,SEL_UP
CP "a"
JR Z,SEL_DN
CP 10
JR Z,SEL_DN
CP 13
JR Z,WORK_FILE
CP 7
JP Z,EXIT
CP "r"
JR Z,BEGIN
JR WAIT_K

════════════════════════════════════════════════

С уважением, Иван Рощин.

от: Ivan Roshin
кому: All
дата: 20 Jul 2002
Hello, All!

═══════════════════ del_tail.2 ══════════════════

;"Вверх":

SEL_UP LD A,(NUM_F)
AND A
JR Z,WAIT_K

CALL CURSOR_OFF

LD HL,NUM_F
DEC (HL)
LD A,(FIRST)
SUB (HL)
JR C,SELECT_1
JR Z,SELECT_1

LD HL,FIRST
DEC (HL)
CALL PRINT_LIST
JR SELECT_1

;"Вниз":

SEL_DN LD A,(NUM_F)
INC A
LD HL,ALL_FILES
CP (HL)
JR Z,WAIT_K

CALL CURSOR_OFF

LD HL,NUM_F
INC (HL)

LD A,(FIRST)
ADD A,17
SUB (HL)
JR NC,SELECT_1

LD HL,FIRST
INC (HL)
CALL PRINT_LIST
JR SELECT_1

;Если на диске нет файлов, ждем нажатия
;"R" или "EDIT":

SELECT_NF CALL GETSYM
CP 7
JP Z,EXIT
CP "r"
JP Z,BEGIN
JR SELECT_NF

;Обработка файла.

WORK_FILE LD A,(NUM_F)
LD H,0
LD L,A
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL ;*16
LD DE,FILE_LIST
ADD HL,DE
PUSH HL
POP IX

;Проверка, можно ли обрабатывать файл:

LD A,(IX+8) ;это Бейсик?
CP "B"
JP Z,WAIT_K

LD A,(IX+11) ;младший байт
AND A ;длины = 0?
LD (USED),A
JP Z,WAIT_K

LD A,(IX+12) ;длина в сект.
INC A ;соответствует
CP (IX+13) ;длине
JP NZ,WAIT_K ;в байтах?

;Определяем трек-секторный адрес
;последнего сектора файла:

LD D,0
DEC A
LD B,A
AND 15
ADD A,(IX+14)
BIT 4,A
RES 4,A
LD E,A ;сектор
JR Z,WORK_1
INC D

WORK_1 LD A,B
RRCA
RRCA
RRCA
RRCA
AND 15
ADD A,(IX+15)
ADD A,D
LD D,A ;трек

LD (DISK_ADR),DE

;Проверяем по контрольной сумме
;каталога: вдруг в дисководе уже другой
;диск? Если так, перечитываем каталог.

LD HL,(SUM)
PUSH HL
CALL READ_CAT
LD HL,(SUM)
POP DE
AND A
SBC HL,DE
JP NZ,BEGIN

════════════════════════════════════════════════

С уважением, Иван Рощин.

от: Ivan Roshin
кому: All
дата: 20 Jul 2002
Hello, All!

═══════════════════ del_tail.3 ══════════════════

;Обнуляем неиспользуемое пространство
;в последнем секторе файла:

LD DE,0
DISK_ADR EQU $-2
LD HL,SECTOR
LD B,1
LD C,5
PUSH DE
PUSH HL
CALL #3D13

LD H,SECTOR/256
LD L,0
USED EQU $-1

WORK_2 LD (HL),0
INC L
JR NZ,WORK_2

POP HL
POP DE
LD B,1
LD C,6
CALL #3D13

;После обработки - снова на выбор файла:

JP WAIT_K

;Выход из программы:

EXIT LD HL,#2758
EXX
POP AF ;восст. период
LD (23562),A ;автоповтора
RET

;---------------------------------------
;Переменные:

SUM DS 2 ;контрольная сумма
ALL_FILES DS 1 ;кол-во файлов
FIRST DS 1 ;N верхнего файла
NUM_F DS 1 ;N выбранного файла

;---------------------------------------
;Процедура READ_CAT читает каталог диска
;и вычисляет его контрольную сумму.

READ_CAT LD C,0 ;сброс
CALL #3D13 ;контроллера

LD C,#18 ;настройка
CALL #3D13 ;на диск

LD B,8 ;чтение
LD DE,0 ;восьми
LD HL,CATALOG ;секторов
LD C,5 ;каталога
CALL #3D13

;Вычисление контрольной суммы:

LD IX,CATALOG ;адр. начала
LD BC,#800 ;счетчик
LD HL,0 ;нач. сумма
LD D,0

CALC_SUM LD E,(IX) ;прибавляем
ADD HL,DE ;очередной байт
INC IX
DEC BC
LD A,B
OR C
JR NZ,CALC_SUM

LD (SUM),HL
RET

;---------------------------------------
;Процедура MAKE_LIST формирует список
;файлов и подсчитывает их количество.

MAKE_LIST LD HL,CATALOG
LD DE,FILE_LIST
LD IX,#8000

;XH - счетчик элементов каталога (128),
;XL - счетчик файлов.

MAKE_M1 LD A,(HL) ;файлы
AND A ;закончились?
JR Z,MAKE_M4

DEC A ;удаленный
JR Z,MAKE_M2 ;файл?

LD BC,16 ;переносим
LDIR ;описатель
INC XL ;увел. кол-во
JR MAKE_M3

MAKE_M2 LD BC,16
ADD HL,BC

MAKE_M3 DEC XH ;счетчик
JR NZ,MAKE_M1

MAKE_M4 LD A,XL
LD (ALL_FILES),A
RET

════════════════════════════════════════════════

С уважением, Иван Рощин.

от: Ivan Roshin
кому: All
дата: 20 Jul 2002
Hello, All!

═══════════════════ del_tail.4 ══════════════════

;---------------------------------------
;Процедуры для изображения курсора:
;CURSOR_ON - нарисовать,
;CURSOR_OFF - стереть.

CURSOR_ON LD B,%00111000
JR CURSOR_1

CURSOR_OFF LD B,%00000111

CURSOR_1 LD A,(NUM_F)
LD HL,FIRST
SUB (HL)
ADD A,4
LD E,A
LD D,1
CALL GET_A_A
LD (HL),B
LD D,H
LD E,L
INC DE
LD BC,11
LDIR
RET

;---------------------------------------
;Процедура PRINT_LIST выводит на экран
;имена файлов, начиная с FIRST, пока не
;будет выведено 18 имен или пока не
;кончатся файлы.

PRINT_LIST LD XH,0 ;счетчик

LD DE,FILE_LIST
LD H,0
LD A,(FIRST)
LD L,A
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL ;*16
ADD HL,DE

;HL указывает на имя файла.

NEXT_OT LD B,8
LD D,2
LD A,XH
ADD A,4
LD E,A

PUSH HL
LOOP_P2 LD A,(HL)
INC HL
CALL PRINT_SYM
INC D
DJNZ LOOP_P2
LD A,(HL)
INC D
CALL PRINT_SYM
POP HL

LD A,(FIRST)
ADD A,XH
LD B,A
LD A,(ALL_FILES)
DEC A
CP B
RET Z

INC XH
LD A,XH
CP 18
RET Z

LD DE,16
ADD HL,DE
JR NEXT_OT

;---------------------------------------
;Процедура PRINT_SYM печатает на экране
;один символ (без атрибутов).
;
;Вход: A - код символа,
; D - координата X,
; E - координата Y.
;
;Выход: регистры не изменены.

PRINT_SYM PUSH BC
PUSH DE
PUSH HL
PUSH AF

LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL ;*8
LD BC,#3C00
ADD HL,BC

PUSH HL
CALL GET_A_S
POP DE

LD B,8
LOOP_PR_S LD A,(DE)
LD (HL),A
INC DE
INC H
DJNZ LOOP_PR_S

POP AF
POP HL
POP DE
POP BC

RET

════════════════════════════════════════════════

С уважением, Иван Рощин.

от: Ivan Roshin
кому: All
дата: 20 Jul 2002
Hello, All!

═══════════════════ del_tail.5 ══════════════════

;---------------------------------------
;Процедура GET_A_S рассчитывает адрес
;на экране.
;
;Вход: D - X, E - Y.
;Выход: HL - адрес.

GET_A_S LD A,E
AND #18
OR #40
LD H,A
LD A,E
AND 7
RRA
RRA
RRA
RRA
ADD A,D
LD L,A
RET

;---------------------------------------
;Процедура GET_A_A рассчитывает адрес
;в области атрибутов.
;
;Вход: D - X, E - Y.
;Выход: HL - адрес.

GET_A_A LD A,E
RRA
RRA
RRA
AND 3
OR #58
LD H,A
LD A,E
AND 7
RRA
RRA
RRA
RRA
ADD A,D
LD L,A
RET

;---------------------------------------
;Процедура GETSYM ждет нажатия клавиши.

GETSYM XOR A
LD (23560),A
GET_1 LD A,(23560)
AND A
JR Z,GET_1
RET

После компиляции сохраните объектный код, например, под
именем del_tail и напишите простейший Бейсик-загрузчик:

10 CLEAR 32767: RANDOMIZE USR 15619: REM: LOAD "del_tail"
CODE
20 RANDOMIZE USR 32768
30 RANDOMIZE USR 15616

Пользоваться программой очень просто. После запуска
выводится каталог диска, выбрать нужный файл можно с помощью
клавиш "Q", "A" и курсорных; "ENTER" - начать обработку файла,
"R" - перечитать каталог, "EDIT" - выйти в TR-DOS.
Перед тем, как начать обработку выбранного файла, программа
проверяет: не был ли заменен диск с момента чтения каталога?
Если да, то просто перечитывается каталог.
Есть и еще одна проверка: в случае, если выбран Бейсик-файл,
или длина файла в байтах не соответствует длине в секторах, или
длина в байтах равна целому числу секторов, обработка файла не
производится.
Программу можно использовать не только для обработки
текстовых файлов. Hо хочу предупредить, чтобы вы были уверены в
формате обрабатываемых файлов: бывает, что "хвост" файла
содержит какие-либо нужные данные.
Программу можно усовершенствовать: добавить выбор дисковода,
возможность обработки сразу нескольких помеченных файлов,
обнуление неиспользуемых секторов диска и информации о стертых
файлах в каталоге диска...


Литература
──────────

1. "Слово - не воробей". "Радиомир. Ваш компьютер" 10/2001,
стр. 36.

════════════════════════════════════════════════

С уважением, Иван Рощин.

от: Ivan Roshin
кому: All
дата: 20 Jul 2002
Hello, All!

═══════════════════ del_tail.5 ══════════════════

;---------------------------------------
;Процедура GET_A_S рассчитывает адрес
;на экране.
;
;Вход: D - X, E - Y.
;Выход: HL - адрес.

GET_A_S LD A,E
AND #18
OR #40
LD H,A
LD A,E
AND 7
RRA
RRA
RRA
RRA
ADD A,D
LD L,A
RET

;---------------------------------------
;Процедура GET_A_A рассчитывает адрес
;в области атрибутов.
;
;Вход: D - X, E - Y.
;Выход: HL - адрес.

GET_A_A LD A,E
RRA
RRA
RRA
AND 3
OR #58
LD H,A
LD A,E
AND 7
RRA
RRA
RRA
RRA
ADD A,D
LD L,A
RET

;---------------------------------------
;Процедура GETSYM ждет нажатия клавиши.

GETSYM XOR A
LD (23560),A
GET_1 LD A,(23560)
AND A
JR Z,GET_1
RET

После компиляции сохраните объектный код, например, под
именем del_tail и напишите простейший Бейсик-загрузчик:

10 CLEAR 32767: RANDOMIZE USR 15619: REM: LOAD "del_tail"
CODE
20 RANDOMIZE USR 32768
30 RANDOMIZE USR 15616

Пользоваться программой очень просто. После запуска
выводится каталог диска, выбрать нужный файл можно с помощью
клавиш "Q", "A" и курсорных; "ENTER" - начать обработку файла,
"R" - перечитать каталог, "EDIT" - выйти в TR-DOS.
Перед тем, как начать обработку выбранного файла, программа
проверяет: не был ли заменен диск с момента чтения каталога?
Если да, то просто перечитывается каталог.
Есть и еще одна проверка: в случае, если выбран Бейсик-файл,
или длина файла в байтах не соответствует длине в секторах, или
длина в байтах равна целому числу секторов, обработка файла не
производится.
Программу можно использовать не только для обработки
текстовых файлов. Но хочу предупредить, чтобы вы были уверены в
формате обрабатываемых файлов: бывает, что "хвост" файла
содержит какие-либо нужные данные.
Программу можно усовершенствовать: добавить выбор дисковода,
возможность обработки сразу нескольких помеченных файлов,
обнуление неиспользуемых секторов диска и информации о стертых
файлах в каталоге диска...


Литература
──────────

1. "Слово - не воробей". "Радиомир. Ваш компьютер" 10/2001,
стр. 36.

════════════════════════════════════════════════

С уважением, Иван Рощин.




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Глас божий - полный список тем интервью с zxpress.ru со Спектрумистами для более быстрого поиска.
Новости - надо ещё декомпилировать все изменения в TR-DOS 6.05E...
Семь и 1/2 - Особенности национального рулеза 2 или упорядоченное движение электронов.
Народное творчество - FUCK # 01 от Сергея Штурма.
Gaме station - Недавно я прошел игру KING`S BOUNTY... Поэтому, даю вам описание "что, где и как проходить".

В этот день...   3 мая