Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Бит 7: файл не наследуется порождаемыми процессами




DS:DX = адрес ASCIZ-строки с полным именем файла

CL = маска атрибутов файлов

Вывод:

CF = 0 и АХ = идентификатор файла, если не произошла ошибка.

CF = 1 и АХ = код ошибки (02h — файл не найден, 03h — путь не найден, 04h — слишком много открытых файлов, 05h — доступ запрещен, 0Ch — неправильный режим доступа)

 

Пример:

LEA DX,PATH; сегменте данных путь: С:\ПУТЬ\ИМЯФАЙЛА, 0;

; если краткое имя, то берется текущий каталог

MOV AL,2; открыть для чтения и записи, если 0 для чтения,

; 1 – для записи

MOV АН,3DН; функция открытия файла

INT 21H; открываем файл

JC ERRO; ошибка, если поднят флаг СF, в АХ код ошибки,

; если ошибки нет, то в АХ описатель файла для

; будущей работы следует его сохранить

При этом обязательно будет ошибка, если такого файла не существует (в указанном каталоге).


Создание файла с усечением существующего до нулевой длины.

Функция DOS 3Ch — Создать файл

Ввод:

Ah = 3Ch

СХ = атрибут файла

Бит 7: файл можно открывать разным процессам в Novell Netware

бит 6: не используется

бит 5: архивный бит (1, если файл не сохранялся)

бит 4: каталог (должен быть 0 для функции 3Ch)

бит 3: метка тома (игнорируется функцией 3Ch)

бит 2: системный файл

бит 1: скрытый файл

бит 0: файл только для чтения

 

Вывод:

DS:DX = адрес ASCIZ-строки с полным именем файла (ASCIZ-строка ASCII-символов, оканчивающаяся нулем).

CF = 0 и АХ = идентификатор файла, если не произошла ошибка

CF = 1 и АХ = 03h, если путь не найден

CF = 1 и АХ = 04h, если слишком много открытых файлов

CF = 1 и АХ = 05h, если доступ запрещен

 

Если файл уже существует, функция 3Ch все равно открывает его, присваивая ему нулевую длину. Чтобы этого не произошло, следует пользоваться функцией 5Bh.

Функция 5ВН создаёт файл, но если файл уже существует, содержимое его не уничтожается, а взводится флаг ошибки СF.

Пример:

LEA DX,PATH; в сегменте данных путь: С:\ПУТЬ\ИМЯФАЙЛА, 0

; если краткое имя, то берется текущий каталог

MOV СХ,0; создать только для чтения, если 0 - для чтения, 1 –

; для записи

MOV АН,3СН; функция создания файла

INT 21h; открываем файл

JC ERRO; ошибка, если поднят флаг СF, в АХ код ошибки,

; если ошибки нет, то в АХ описатель файла, для

; будущей работы следует его сохранить


Пример 10.1. Создание файла и запись в него строки 'Файл номер 1'.

; В сегменте данных

.data

bufout db 'Файл номер 1'; Данные для записи в файл

buflen=$-bufout; строка длиной в 12 байт

handle dw 0; Ячейка для дескриптора

fname db 'MYFILE.txt',0;Имя файла в формате ASCIIZ

 

;В сегменте команд создадим файл

.code

mov АН,3Ch; Функция создания файла

mov CX, 0; Без атрибутов

mov DX, offset fname; Адрес имени файла

int 21h

mov handle,AX; Сохраним дескриптор файла

; Запишем в файл данные (в данном

; примере – текстовую строку)

mov AH,40h; Функция записи в файл

mov BX,handle; Дескриптор

mov CX,buflen; Число записываемых байтов

mov DX,offset bufout; Адрес данных

int 21h

; Закроем файл

mov АН,3Eh; Функция закрытия файла

mov BX,handle; Дескриптор

int 2lh


Функция WinAPI для создания файла

HANDLE CreateFile(

CLPCTSTR lpFileName, (1)

DWORD dwDesiredAccess, (2)

DWORD dwShareMode, (3)

LPSECURITY_ATTRIBUTES IpSecurityAttributes, (4)

DWORD dwCreationDistribution, (5)

DWORD dwFlagsAndAttributes, (6)

HANDLE hTemplateFile); (7)

1) lpFileName — указатель на ASCIIZ-строку с именем (путем) открываемого или создаваемого файла;

2) dwDesiredAccess — тип доступа к файлу:

* GENERIC_READ = 80000000h - доступ для чтения;

* GENERIC_WRITE = 40000000h - доступ для записи;

* GENERIC_READ+GENERIC_WRITE = 0C0000000h - доступ для чтения-записи;

3) DwShareMode — режим разделения файлов между разными процессами, данный параметр может принимать значения:

* 0 — монополизация доступа к файлу;

* FILE_SHARE_READ = 00000001h — другие процессы могут открыть файл, но только для чтения, запись в файл монополизирована процессом, открывшим файл;

* FILE_SHARE_WRITE = 00000002h — другие процессы могут открыть файл, но только для записи, чтение в файл монополизировано процессом, открывшим файл;

* FILE_SHARE_READ+FILE_SHARE_WRITE = 00000003h - другие процессы могут открывать файл для чтения-записи;

4) IpSecurityAttributes — указатель на структуру SecurityAttributes, определяющую защиту связанного с файлом объекта ядра, при отсутствии защиты заносится NULL;

5) dwCreationDistribution — определяет действия для случаев, когда файл существует или не существует. Данный параметр может принимать значения:

* CREATE_NEW= 1 — создать новый файл, если файл не существует; если файл существует, то функция завершается формированием ошибки;

* CREATE_ALWAYS=2 — создать новый файл, если файл не существует; если он существует, то заменить новым;

* ОPEN_EXISTING=3 — открыть файл, если он существует; если файл не существует, то формируется ошибка;

* ОPEN_ALWAYS=4 — открыть файл при его существовании и создать его если файла нет;

* TRUNCATE_EXISTING=5 — открыть файл с усечением его до нулевой длины; если файл не существует, то формируется ошибка;

6) DwFlagsAndAttributes — флаги и атрибуты; этот параметр используется для задания характеристик создаваемого файла:

* FILE_ATTRIBUTE_READ0NLY=0000000lh - файл только для чтения;

* FILE_ATTRIBUTE_HIDDEN=00000002h - скрытый файл;

* FILE_ATTRIBUTE_SYSTEM=00000004h - системный файл;

* FILE_ATrRIBUTE_DIRECTORY=000000l0h - каталог;

* FILE ATTRIBUTE ARCHIVE=00000020h - архивный файл;

* FILE_ATTRIBUTE_N0RMAL=00000080h - обычный файл для чтения-записи (этот атрибут нельзя комбинировать с другими);

* FILE_ATTRIBUTE_TEMPORARY=00000l00h - создается временный файл (преимущество этого файла в том, что система стремится не записывать этот файл на диск, а работать с ним в памяти; этот атрибут выгодно комбинировать с флагом FILE_FLAG_DELETE_ON_CLOSE, тогда после закрытия файла в программе он будет удален, не оставив следов на диске, иначе программе придется «подчищать» за собой содержимое диска);

* FILE_FLAG_WRITE_THRОUGH=80000000h - не использовать промежуточное кэширование при записи на диск, а все изменения записывать прямо на диск;

* FILE_FLAG_NO_BUFFERING=20000000h - не использовать средства буферизации операционной системы;

* FILE_FLAG_RANDOM_ACCESS=10000000h - прямой доступ к файлу (установка этого флага или флага FILE_FLAG_SEQUENTIAL_SCAN позволяет оптимизировать системе процесс кэширования);

* FILE_FLAG_SEQUENTIAL_SCAN=08000000h - последовательный доступ к файлу;

* FILE_FLAG_DELETE_0N_CL0SE=04000000h - удалить файл после его закрытия;

* FILE_FLAG_OVERLAPPED=40000000h - асинхронный доступ к файлу (синхронность означает то, что программа, вызвавшая функцию для доступа к файлу, приостанавливается до тех пор, пока не закончит работу функция ввода-вывода);

7) hTemplateFile — дескриптор другого существующего и предварительно открытого файла. Параметр используется только при создании нового файла. Новый файл создается с теми же значениями атрибутов и флагов, что и у файла, дескриптор которого указан в параметре hTemplateFile.

 

При удачном завершении функция возвращает в регистре ЕАХ дескриптор нового файла. В случае неудачи функция возвращает в регистре ЕАХ значение NULL.


Пример 1:

.code

mov eax,offset filename

mov fname,eax

push 00000000h; Создаём новый файл с новыми параметрами

push 00000080h; создаём обычный файл для чтения-записи

push 00000003h; открываем файл, если он существует; если файл

; не существует, то формируется ошибка;

push 00000000h; нет защиты при создании файла

push 00000001h; другие процессы могут открыть файл, но только

; для чтения,

push 0C0000000h; тип доступа к файлу - доступ для чтения-записи;

push fname; путь к открываемому или создаваемому файлу;

call CreateFileA

cmp eax,FFFFFFFFh

je exit

.data

filename db 'data.txt',0

 

Пример 2:

.code

mov eax,offset filename

mov fname,eax

push 0h; hTemplateFile = NULL

push 80h; Attributes = NORMAL

push 3h; Mode = OPEN_EXISTING

push 0h; pSecurity = NULL

push 3h; ShareMode = FILE_SHARE_RW

push 3h; Access = READ

push fname; 'data.txt'

call CreateFileA

push eax

.data

filename db 'data.txt',0

 

После выполнения функции в ЕАХ будет расположен хендл открытого файла. В случае ошибки ЕАХ будет равен FFFFFFFFh = -1. После вызова функции можно сохранить хендл файла в стек для дальнейшей работы.


Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...