SysFn70/ru: Difference between revisions

From KolibriOS wiki
Jump to navigation Jump to search
No edit summary
 
(8 intermediate revisions by 2 users not shown)
Line 1: Line 1:
'''Функция 70''' - работа с файловой системой с поддержкой длинных имён.
''Параметры:''
''Параметры:''
 
:* eax = 70
* eax = 70
:* ebx = указатель на информационную структуру
* ebx = указатель на информационную структуру


''Возвращаемое значение:''
''Возвращаемое значение:''
:* eax = 0 - успешно; иначе код ошибки файловой системы
:* в зависимости от подфункции может возвращаться значение и в других регистрах


* eax = 0 - успешно; иначе код ошибки файловой системы
''Общий формат информационной структуры:''
* в зависимости от подфункции может возвращаться значение и в других регистрах
:* +0: dword: номер подфункции
:* +4: dword: смещение в файле или папке
:* +8: dword: старшая часть смещения или поле флагов
:* +12 = +0xC: dword: размер данных
:* +16 = +0x10: dword: указатель на данные
:* +20 = +0x14: ?: текстовая строка - путь к файлу, заканчивается нулём
:или
:* +20 = +0x14: byte: 0
:* +21 = +0x15: dword: указатель на строку


''Общий формат информационной структуры:''
Чувствительность к регистру букв зависит от файловой системы.
Если путь начинается не с '/', то он считается относительным.
Получить или установить текущую папку можно с помощью [[SysFn30/ru|сисфункции 30]].
'../' в пути означает подъём на одну папку относительно текущей.


* +0: dword: номер подфункции
Можно указать кодировку строки, поместив в её начале байт со значениями:
* +4: dword: смещение в файле
:* 1 = cp866
* +8: dword: старший dword смещения (должен быть 0) или поле флагов
:* 2 = UTF-16LE
* +12 = +0xC: dword: размер
:* 3 = UTF-8
* +16 = +0x10: dword: указатель на данные
иначе будет использоваться кодировка cp866. В абсолютном пути можно
* +20 = +0x14: n db: ASCIIZ-строка с именем файла или
поместить этот байт после '/' или добавить дополнительный '/' перед ним.
* +20 = +0x14: db 0
Также, можно использовать [[SysFn80/ru|сисфункцию 80]].
* +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла


Уточнения - в документации на соответствующую подфункцию.
Формат абсолютного пути:
Имя файла нечувствительно к регистру букв. Русские буквы должны быть
записаны в кодировке cp866 (DOS).
Формат имени файла:


''/base/number/dir1/dir2/.../dirn/file,''
''/base/number/dir1/dir2/.../dirn/file,''


где ''/base/number'' идентифицирует устройство, на котором ищется файл:
где ''base/number'' идентифицирует устройство, на котором ищется файл:
одно из


* '''/RD/1''' = '''/RAMDISK/1''' для доступа к рамдиску
:* '''RD/1''' = рамдиск
* '''/FD/1''' = '''/FLOPPYDISK/1''' для доступа к первому флоппи-дисководу, '''/FD/2''' = /'''FLOPPYDISK/2''' для второго флоппи-дисковода
:* '''FD/1''' = первый флоппи-дисковод, '''FD/2''' = второй флоппи-дисковод
* '''/HD0/x''', '''/HD1/x''', '''/HD2/x''', '''/HD3/x''' для доступа соответственно к жёстким дискам на IDE0 (Primary Master), IDE1 (Primary Slave), IDE2 (Secondary Master), IDE3 (Secondary Slave); x - номер раздела на выбранном винчестере, изменяется от 1 до 255 (на каждом из винчестеров нумерация начинается с 1)
:* '''HD0/x''', '''HD1/x''', '''HD2/x''', '''HD3/x''' = жёсткие диски соответственно на IDE0 (Primary Master), IDE1 (Primary Slave), IDE2 (Secondary Master), IDE3 (Secondary Slave); x - номер раздела на выбранном винчестере, начиная с 1
* '''/CD0/1, /CD1/1, /CD2/1, /CD3/1''' для доступа соответственно к CD на IDE0 (Primary Master), IDE1 (Primary Slave), IDE2 (Secondary Master), IDE3 (Secondary Slave)
:* '''CD0/1''', '''CD1/1''', '''CD2/1''', '''CD3/1''' = аналогично для cd
* '''/SYS''' - определяет системную папку; при обычной загрузке системы с дискеты эквивалентно '''/RD/1'''
:* '''SYS''' - системная папка (является ключом, не зависит от кодировки), второй ключ может быть установлен сисфункцией 30.3.


''Примеры:''
''Примеры:''
 
:* '/sys/example.asm',0
* '/rd/1/kernel.asm',0
:* '/rd/1/example.asm',0
* '/HD0/1/kernel.asm',0
:* '/HD0/1/folder/file.txt',0
* '/hd0/2/menuet/pics/tanzania.bmp',0
:* '/hd2/2/pics/tanzania.bmp',0
* '/hd0/1/Program files/NameOfProgram/SomeFile.SomeExtension',0
:* 2,'/',0,'sys','/',0,'F',0,'I',0,'L',0,'E',0,0,0
* '/sys/MySuperApp.ini',0
 
Также функция поддерживает относительные имена. Если путь начинается
не с '/', то он считается относительно текущей папки. Получить или
установить текущую папку можно с помощью сисфункции 30.


Для CD-приводов в связи с аппаратными ограничениями доступны
Для CD-приводов в связи с аппаратными ограничениями доступны
Line 54: Line 58:
(CD и DVD) производится блокировка ручного управления механизмом
(CD и DVD) производится блокировка ручного управления механизмом
лотка. Это связано с кэшированием данных, полученных от привода.
лотка. Это связано с кэшированием данных, полученных от привода.
Разблокировка осуществляется при обращении подфункции 4 функции 24
Разблокировка осуществляется при обращении подфункции 4 [[SysFn24/ru|функции 24]]
к соответствующему устройству.
к соответствующему устройству.


=== Подфункция 0 - чтение файла с поддержкой длинных имён. ===
=== Подфункция 0 - чтение файла с поддержкой длинных имён. ===


''Параметры:''
''Параметры:''
 
:* eax = 70 - номер функции
* eax = 70 - номер функции
:* ebx = указатель на информационную структуру
* ebx = указатель на информационную структуру


''Формат информационной структуры:''
''Формат информационной структуры:''
 
:* +0: dword: 0 = номер подфункции
* +0: dword: 0 = номер подфункции
:* +4: dword: позиция в файле (в байтах)
* +4: dword: позиция в файле (в байтах)
:* +8: dword: старший dword позиции
* +8: dword: 0 (зарезервировано под старший dword позиции)
:* +12 = +0xC: dword: сколько байт читать
* +12 = +0xC: dword: сколько байт читать
:* +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
* +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
:* +20 = +0x14: путь, правила формирования имён указаны в общем описании
* +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или
* +20 = +0x14: db 0
* +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла


''Возвращаемое значение:''
''Возвращаемое значение:''
 
:* eax = 0 - успешно, иначе код ошибки файловой системы
* eax = 0 - успешно, иначе код ошибки файловой системы
:* ebx = число прочитанных байт
* ebx = число прочитанных байт или -1=0xffffffff, если файл не найден


''Замечания:''
''Замечания:''
:* Если файл кончился раньше, чем был прочитан последний запрошенный блок, то функция прочитает, сколько сможет, после чего вернёт eax=6 (EOF).
:* Функция не позволяет читать папки (вернётся eax=10, access denied).


* Если файл кончился раньше, чем был прочитан последний запрошенный блок, то функция прочитает, сколько сможет, после чего вернёт eax=6 (EOF).
'''Константы для регистров:'''
* Функция не позволяет читать папки (вернётся eax=10, access denied).
::eax - SF_FILE (70)
::[ebx] - SSF_READ_FILE (0)


=== Подфункция 1 - чтение папки с поддержкой длинных имён. ===
=== Подфункция 1 - чтение папки с поддержкой длинных имён. ===


''Параметры:''
''Параметры:''
 
:* eax = 70 - номер функции
* eax = 70 - номер функции
:* ebx = указатель на информационную структуру
* ebx = указатель на информационную структуру


''Формат информационной структуры:''
''Формат информационной структуры:''
 
:* +0: dword: 1 = номер подфункции
* +0: dword: 1 = номер подфункции
:* +4: dword: индекс начального блока (считая с 0)
* +4: dword: индекс начального блока (считая с 0)
:* +8: dword: в какой кодировке возвращать имена:
* +8: dword: поле флагов:
:: 0 = по умолчанию
** бит 0 (маска 1): в каком формате возвращать имена, 0=ANSI, 1=UNICODE
:: 1 = cp866
** прочие биты зарезервированы и должны быть установлены в 0 для будущей совместимости
:: 2 = UTF-16LE
* +12 = +0xC: dword: сколько блоков читать
:: 3 = UTF-8
* +16 = +0x10: dword: указатель на буфер, куда будут записаны данные, размер буфера должен быть не меньше 32 + [+12]*560 байт
:* +12 = +0xC: dword: сколько блоков читать
* +20 = +0x14: ASCIIZ-имя папки, правила формирования имён указаны в общем описании или
:* +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
* +20 = +0x14: db 0
:* +20 = +0x14: путь, правила формирования имён указаны в общем описании
* +21 = +0x15: dd указатель на ASCIIZ-строку с именем папки


''Возвращаемое значение:''
''Возвращаемое значение:''
 
:* eax = 0 - успешно, иначе код ошибки файловой системы
* eax = 0 - успешно, иначе код ошибки файловой системы
:* ebx = число файлов, информация о которых была записана в буфер
* ebx = число файлов, информация о которых была записана в буфер, или -1=0xffffffff, если папка не найдена


''Структура буфера:''
''Структура буфера:''
 
:* заголовок (32 байта)
* +0: 32*byte: заголовок
:* блок с информацией о файле 1
* +32 = +0x20: n1*byte: блок с информацией о файле 1
:* блок с информацией о файле 2
* +32+n1: n2*byte: блок с информацией о файле 2
:* ...
* ...


''Структура заголовка:''
''Структура заголовка:''
 
:* +0: dword: версия структуры (текущая версия = 1)
* +0: dword: версия структуры (текущая версия = 1)
:* +4: dword: количество размещённых блоков; не больше, чем запрошено в поле +12 информационной структуры; может быть меньше, если в папке кончились файлы (то же самое, что и в ebx)
* +4: dword: количество размещённых блоков; не больше, чем запрошено в поле +12 информационной структуры; может быть меньше, если в папке кончились файлы (то же самое, что и в ebx)
:* +8: dword: общее число файлов в папке
* +8: dword: общее число файлов в папке
:* +12 = +0xC: 20*byte: зарезервировано (нули)
* +12 = +0xC: 20*byte: зарезервировано (нули)


''Структура блока данных входа каталога (БДВК):''
''Структура блока данных входа каталога (БДВК):''
 
:* +0: dword: атрибуты файла:
* +0: dword: атрибуты файла:
:** бит 0 (маска 1): файл только для чтения
** бит 0 (маска 1): файл только для чтения
:** бит 1 (маска 2): файл является скрытым
** бит 1 (маска 2): файл является скрытым
:** бит 2 (маска 4): файл является системным
** бит 2 (маска 4): файл является системным
:** бит 3 (маска 8): это метка тома (возвращается только подфункцией 5)
** бит 3 (маска 8): это не файл, а метка тома (на заданном разделе встречается не более одного раза и только в корневой папке)
:** бит 4 (маска 0x10): это папка
** бит 4 (маска 0x10): это папка
:** бит 5 (маска 0x20): файл не архивировался - многие программы архивации имеют опцию, по которой архивируются только файлы с установленным этим битом, после чего этот бит сбрасывается - это может быть полезно для автоматического создания backup-архивов, ибо при записи бит обычно устанавливается (не в Kolibri, правда)
** бит 5 (маска 0x20): файл не архивировался - многие программы архивации имеют опцию, по которой архивируются только файлы с установленным этим битом, после чего этот бит сбрасывается - это может быть полезно для автоматического создания backup-архивов, ибо при записи бит обычно устанавливаетс (не в Kolibri, правда)
:* +4: byte: кодировка имени, соответствует полю +8 информационной структуры
* +4: byte: тип данных имени: (совпадает с битом 0 флагов информационной структуры)
:* +5: 3*byte: зарезервировано (нули)
**0 = ASCII = 1-байтное представление каждого символа
:* +8: 4*byte: время создания файла