LpFileName — указатель на ASCIIZ-строку с именем (путем) открываемого или создаваемого файла;
HANDLE hTemplateFile); (7)
DWORD dwFlagsAndAttributes, (6)
DWORD dwCreationDistribution, (5)
LPSECURITY_ATTRIBUTES IpSecurityAttributes, (4)
DWORD dwShareMode, (3)
DWORD dwDesiredAccess, (2)
CLPCTSTR lpFileName, (1)
HANDLE CreateFile(
Функция WinAPI для создания файла
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_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. После вызова функции можно сохранить хендл файла в стек для дальнейшей работы.