Консультация № 37606
15.03.2006, 20:06
0.00 руб.
0 1 1
Есть программа l1.exe, которая должна читать таблицу открытых файлов. Но она не читает, т.к. то файл не найден, то не открыт. Подскажите где ошибка?

Приложение:
.MODEL SMALL.STACK 100H.DATAfname db ‘l1.exe‘, 0 ; Имя файлаfndname db ‘L1 EXE‘ ; Имя файла, как оно записано в СТФhandle dw 0 ; Номер дескриптора открытого файлаmes1 db ‘ Программа успешно завершена !!!$‘,10,13mes2 db ‘ Файл не открылся !!!$‘,10,13mes3 db ‘ Файл не найден !!!$‘,10,13next_blk dd 0.CODE mov ax, @data mov ds, ax ; Открытие файла; Откроем файл, чтобы он попал в таблицу mov ah, 3dh mov al, 0 mov dx, offset fname int 21h mov handle, ax jnc go1 jmp notopen;Получим доступ к системной таблице файлов СТФgo1: mov ah, 52h int 21h mov di, es:[bx+4] mov ax, es:[bx+6] mov es, ax;Сохраним адрес следующей таблицыnext: mov ax, es:[di] mov word ptr next_blk, ax mov ax, es:[di+2] mov word ptr next_blk+2, ax;Обрабатываем таблицы файлов по очереди;и организуем поиск имени нашего файла в текущей таблице mov cx, es:[di+4] add di, 6cmpfile: lea si, fndname call compname je found add di, 59 loop cmpfile cmp word ptr next_blk, 0ffffh jne go2 jmp nofound;Настроим ES:DI на следующую таблицуgo2: mov di, word ptr next_blk mov ax, word ptr next_blk+2 mov es, ax jmp next;Нашли блок с нашим именемfound: add di, 11 mov ax, es:[di] ;в ax<-номер первого кластера;Теперь можем распечатать содержимое элементов СТФ нашего файла ; . . . . . . . . . . . . . . . . . . . . . . . . . lea dx, mes1 jmp prnt;завершение программыnofound: lea dx, mes3 jmp prntnotopen: lea dx, mes2prnt: mov ah, 9 int 21h jmp outprogoutprog: mov ah, 0 int 16h mov ax, 4c00h int 21h;п/п сравнения именcompname: push cx push di add di, 32 mov cx,11 cld repe cmpsb pop di pop cx ret END

Обсуждение

давно
Посетитель
7438
7205
15.03.2006, 23:13
общий
это ответ
Здравствуйте, Иванов Михаил Викторович!
Что интересно, ошибки-то и нет(Разве что, не указана точка входа, но это не в счет!)
Дело в том, что список открытых файлов, получаемый из "списка списков",
получаемый, в свою очередь, по 52 функции является
недокументированным. Так что вполне возможно, что Винда
просто не формирует всю информацию...
Надо пробывать под чистым ДОС-ом :)
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа