Ru/api/kernel: Difference between revisions

From KolibriOS wiki
Jump to navigation Jump to search
Line 1,070: Line 1,070:
== Функция 70 - работа с файловой системой с поддержкой длинных имён. ==
== Функция 70 - работа с файловой системой с поддержкой длинных имён. ==


Параметры:
SysFn70/ru
  * eax = 70
  * ebx = указатель на информационную структуру
Возвращаемое значение:
  * eax = 0 - успешно; иначе код ошибки файловой системы
  * в зависимости от подфункции может возвращаться значение и
    в других регистрах
Общий формат информационной структуры:
  * +0: dword: номер подфункции
  * +4: dword: смещение в файле
  * +8: dword: старший dword смещения (должен быть 0) или поле флагов
  * +12 = +0xC: dword: размер
  * +16 = +0x10: dword: указатель на данные
  * +20 = +0x14: n db: ASCIIZ-строка с именем файла
    или
  * +20 = +0x14: db 0
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
Уточнения - в документации на соответствующую подфункцию.
Имя файла нечувствительно к регистру букв. Русские буквы должны быть
записаны в кодировке cp866 (DOS).
Формат имени файла:
/base/number/dir1/dir2/.../dirn/file,
где /base/number идентифицирует устройство, на котором ищется файл:
одно из
  * /RD/1 = /RAMDISK/1 для доступа к рамдиску
  * /FD/1 = /FLOPPYDISK/1 для доступа к первому флоппи-дисководу,
    /FD/2 = /FLOPPYDISK/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)
  * /CD0/1, /CD1/1, /CD2/1, /CD3/1 для доступа соответственно
    к CD на IDE0 (Primary Master), IDE1 (Primary Slave),
    IDE2 (Secondary Master), IDE3 (Secondary Slave)
  * /SYS - определяет системную папку; при обычной загрузке системы
    с дискеты эквивалентно /RD/1
Примеры:
  * '/rd/1/kernel.asm',0
  * '/HD0/1/kernel.asm',0
  * '/hd0/2/menuet/pics/tanzania.bmp',0
  * '/hd0/1/Program files/NameOfProgram/SomeFile.SomeExtension',0
  * '/sys/MySuperApp.ini',0
Доступные подфункции:
  * подфункция 0 - чтение файла
  * подфункция 1 - чтение папки
  * подфункция 2 - создание/перезапись файла
  * подфункция 3 - запись в существующий файл
  * подфункция 4 - установка размера файла
  * подфункция 5 - получение атрибутов файла/папки
  * подфункция 6 - установка атрибутов файла/папки
  * подфункция 7 - запуск программы
  * подфункция 8 - удаление файла/папки
  * подфункция 9 - создание папки
Для CD-приводов в связи с аппаратными ограничениями доступны
только подфункции 0,1,5 и 7, вызов других подфункций завершится
ошибкой с кодом 2.
При первом обращении подфункций 0,1,5,7 к устройствам ATAPI
(CD и DVD) производится блокировка ручного управления механизмом
лотка. Это связано с кэшированием данных, полученных от привода.
Разблокировка осуществляется при обращении подфункции 4 функции 24
к соответствующему устройству.
 
 
=== Подфункция 0 - чтение файла с поддержкой длинных имён. ===
 
Параметры:
  * eax = 70 - номер функции
  * ebx = указатель на информационную структуру
Формат информационной структуры:
  * +0: dword: 0 = номер подфункции
  * +4: dword: позиция в файле (в байтах)
  * +8: dword: 0 (зарезервировано под старший dword позиции)
  * +12 = +0xC: dword: сколько байт читать
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
    общем описании
    или
  * +20 = +0x14: db 0
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
Возвращаемое значение:
  * eax = 0 - успешно, иначе код ошибки файловой системы
  * ebx = число прочитанных байт или
    -1=0xffffffff, если файл не найден
Замечания:
  * Если файл кончился раньше, чем был прочитан последний запрошенный
    блок, то функция прочитает, сколько сможет, после чего вернёт
    eax=6 (EOF).
  * Функция не позволяет читать папки
    (вернётся eax=10, access denied).
 
 
=== Подфункция 1 - чтение папки с поддержкой длинных имён. ===
 
Параметры:
  * eax = 70 - номер функции
  * ebx = указатель на информационную структуру
Формат информационной структуры:
  * +0: dword: 1 = номер подфункции
  * +4: dword: индекс начального блока (считая с 0)
  * +8: dword: поле флагов:
    * бит 0 (маска 1): в каком формате возвращать имена,
      0=ANSI, 1=UNICODE
    * прочие биты зарезервированы и должны быть установлены в 0
      для будущей совместимости
  * +12 = +0xC: dword: сколько блоков читать
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны
    данные, размер буфера должен быть не меньше 32 + [+12]*560 байт
  * +20 = +0x14: ASCIIZ-имя папки, правила формирования имён указаны в
    общем описании
    или
  * +20 = +0x14: db 0
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
Возвращаемое значение:
  * eax = 0 - успешно, иначе код ошибки файловой системы
  * ebx = число файлов, информация о которых была записана в буфер,
    или -1=0xffffffff, если папка не найдена
Структура буфера:
  * +0: 32*byte: заголовок
  * +32 = +0x20: n1*byte: блок с информацией о файле 1
  * +32+n1: n2*byte: блок с информацией о файле 2
  * ...
Структура заголовка:
  * +0: dword: версия структуры (текущая версия = 1)
  * +4: dword: количество размещённых блоков; не больше, чем запрошено
    в поле +12 информационной структуры; может быть меньше,
    если в папке кончились файлы (то же самое, что и в ebx)
  * +8: dword: общее число файлов в папке
  * +12 = +0xC: 20*byte: зарезервировано (нули)
Структура блока данных входа каталога (БДВК):
  * +0: dword: атрибуты файла:
    * бит 0 (маска 1): файл только для чтения
    * бит 1 (маска 2): файл является скрытым
    * бит 2 (маска 4): файл является системным
    * бит 3 (маска 8): это не файл, а метка тома
      (на заданном разделе встречается не более одного раза и
      только в корневой папке)
    * бит 4 (маска 0x10): это папка
    * бит 5 (маска 0x20): файл не архивировался - многие программы
      архивации имеют опцию, по которой архивируются только файлы
      с установленным этим битом, после чего этот бит сбрасывается -
      это может быть полезно для автоматического создания
      backup-архивов, ибо при записи бит обычно устанавливается
      (не в Kolibri, правда)
  * +4: byte: тип данных имени:
    (совпадает с битом 0 флагов информационной структуры)
    * 0 = ASCII = 1-байтное представление каждого символа
    * 1 = UNICODE = 2-байтное представление каждого символа
  * +5: 3*byte: зарезервировано (нули)
  * +8: 4*byte: время создания файла
  * +12 = +0xC: 4*byte: дата создания файла
  * +16 = +0x10: 4*byte: время последнего доступа (чтение или запись)
  * +20 = +0x14: 4*byte: дата последнего доступа
  * +24 = +0x18: 4*byte: время последней модификации
  * +28 = +0x1C: 4*byte: дата последней модификации
  * +32 = +0x20: qword: размер файла в байтах (до 16777216 Тб)
  * +40 = +0x28: имя
    * для формата ASCII: максимальная длина имени 263 символа
      (263 байта), байт после имени имеет значение 0
    * для формата UNICODE: максимальная длина имени 259 символов
      (518 байт), два байта после имени имеют значение 0
Формат времени:
  * +0: byte: секунды
  * +1: byte: минуты
  * +2: byte: часы
  * +3: byte: зарезервировано (0)
  * например, 23.59.59 записывается как (в hex) 3B 3B 17 00
Формат даты:
  * +0: byte: день
  * +1: byte: месяц
  * +2: word: год
  * например, 25.11.1979 записывается как (в hex) 19 0B BB 07
Замечания:
  * Если в БДВК присутствует имя в ASCII, то длина БДВК составляет
    304 байта, если в UNICODE - 560 байт. Значение длины выравнено
    на целое кратное 16 байт
    (для ускорения обработки в кэш-памяти CPU).
  * Первый символ после имени нулевой (ASCIIZ-строка). Дальнейшие
    данные содержат мусор.
  * Если файлы в папке кончились раньше, чем было прочитано
    запрошенное количество, то функция прочитает, сколько сможет,
    после чего вернёт eax=6 (EOF).
  * Любая папка на диске, кроме корневой, содержит два специальных
    входа "." и "..", идентифицирующих соответственно саму папку и
    родительскую папку.
  * Функция позволяет также читать виртуальные папки "/", "/rd",
    "/fd", "/hd[n]", при этом атрибуты подпапок полагаются равными
    0x10, а времена и даты обнулены. Альтернативный способ получения
    информации об оборудовании - подфункция 11 функции 18.
 
 
=== Подфункция 2 - создание/перезапись файла с поддержкой длинных имён. ===
 
Параметры:
  * eax = 70 - номер функции
  * ebx = указатель на информационную структуру
Формат информационной структуры:
  * +0: dword: 2 = номер подфункции
  * +4: dword: 0 (зарезервировано)
  * +8: dword: 0 (зарезервировано)
  * +12 = +0xC: dword: сколько байт писать
  * +16 = +0x10: dword: указатель на данные
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
    общем описании
    или
  * +20 = +0x14: db 0
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
Возвращаемое значение: