SysFn70/ru

From KolibriOS wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Функция 70 - работа с файловой системой с поддержкой длинных имён.

Параметры:

  • eax = 70
  • ebx = указатель на информационную структуру

Возвращаемое значение:

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

Общий формат информационной структуры:

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

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

Можно указать кодировку строки, поместив в её начале байт со значениями:

  • 1 = cp866
  • 2 = UTF-16LE
  • 3 = UTF-8

иначе будет использоваться кодировка cp866. В абсолютном пути можно поместить этот байт после '/' или добавить дополнительный '/' перед ним. Также, можно использовать сисфункцию 80.

Формат абсолютного пути:

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

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

  • RD/1 = рамдиск
  • 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
  • CD0/1, CD1/1, CD2/1, CD3/1 = аналогично для cd
  • SYS - системная папка (является ключом, не зависит от кодировки), второй ключ может быть установлен сисфункцией 30.3.

Примеры:

  • '/sys/example.asm',0
  • '/rd/1/example.asm',0
  • '/HD0/1/folder/file.txt',0
  • '/hd2/2/pics/tanzania.bmp',0
  • 2,'/',0,'sys','/',0,'F',0,'I',0,'L',0,'E',0,0,0

Для 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: старший dword позиции
  • +12 = +0xC: dword: сколько байт читать
  • +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
  • +20 = +0x14: путь, правила формирования имён указаны в общем описании

Возвращаемое значение:

  • eax = 0 - успешно, иначе код ошибки файловой системы
  • ebx = число прочитанных байт

Замечания:

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

Константы для регистров:

eax - SF_FILE (70)
[ebx] - SSF_READ_FILE (0)

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

Параметры:

  • eax = 70 - номер функции
  • ebx = указатель на информационную структуру

Формат информационной структуры:

  • +0: dword: 1 = номер подфункции
  • +4: dword: индекс начального блока (считая с 0)
  • +8: dword: в какой кодировке возвращать имена:
0 = по умолчанию
1 = cp866
2 = UTF-16LE
3 = UTF-8
  • +12 = +0xC: dword: сколько блоков читать
  • +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
  • +20 = +0x14: путь, правила формирования имён указаны в общем описании

Возвращаемое значение:

  • eax = 0 - успешно, иначе код ошибки файловой системы
  • ebx = число файлов, информация о которых была записана в буфер

Структура буфера:

  • заголовок (32 байта)
  • блок с информацией о файле 1
  • блок с информацией о файле 2
  • ...

Структура заголовка:

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

Структура блока данных входа каталога (БДВК):

  • +0: dword: атрибуты файла:
    • бит 0 (маска 1): файл только для чтения
    • бит 1 (маска 2): файл является скрытым
    • бит 2 (маска 4): файл является системным
    • бит 3 (маска 8): это метка тома (возвращается только подфункцией 5)
    • бит 4 (маска 0x10): это папка
    • бит 5 (маска 0x20): файл не архивировался - многие программы архивации имеют опцию, по которой архивируются только файлы с установленным этим битом, после чего этот бит сбрасывается - это может быть полезно для автоматического создания backup-архивов, ибо при записи бит обычно устанавливается (не в Kolibri, правда)
  • +4: byte: кодировка имени, соответствует полю +8 информационной структуры
  • +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: имя, размер в cp866 составляет 264 байта, иначе - 520 байт

Формат времени:

  • +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

Замечания:

  • Если БДВК содержит имя в cp866, то длина БДВК составляет 304 байта, иначе - 560 байт.
  • Строка имени заканчивается нулём, дальнейшие данные содержат мусор.
  • Если файлы в папке кончились раньше, чем было прочитано запрошенное количество, то функция прочитает, сколько сможет, после чего вернёт eax=6 (EOF).
  • Любая папка на диске, кроме корневой, содержит два специальных входа "." и "..", идентифицирующих соответственно саму папку и родительскую папку.
  • Функция позволяет также читать виртуальные папки "/", "/rd", "/fd", "/hd[n]", при этом атрибуты подпапок полагаются равными 0x10, а времена и даты обнулены. Альтернативный способ получения информации об оборудовании - подфункция 11 функции 18.

Константы для регистров:

eax - SF_FILE (70)
[ebx] - SSF_READ_FOLDER (1)

Подфункция 2 - создание/перезапись файла с поддержкой длинных имён.

Параметры:

  • eax = 70 - номер функции
  • ebx = указатель на информационную структуру

Формат информационной структуры:

  • +0: dword: 2 = номер подфункции
  • +4: dword: 0 (зарезервировано)
  • +8: dword: 0 (зарезервировано)
  • +12 = +0xC: dword: сколько байт писать
  • +16 = +0x10: dword: указатель на данные
  • +20 = +0x14: путь, правила формирования имён указаны в общем описании

Возвращаемое значение:

  • eax = 0 - успешно, иначе код ошибки файловой системы
  • ebx = число записанных байт (возможно, 0)

Замечания:

  • Если файл с таким именем не существовал, он создаётся; если существовал, то перезаписывается.
  • Если свободного места на диске недостаточно, то функция запишет, сколько сможет, после чего вернёт код ошибки 8.
  • Функция не поддерживается для CD (вернётся код ошибки 2).

Константы для регистров:

eax - SF_FILE (70)
[ebx] - SSF_CREATE_FILE (2)

Подфункция 3 - запись в существующий файл с поддержкой длинных имён.

Параметры:

  • eax = 70 - номер функции
  • ebx = указатель на информационную структуру

Формат информационной структуры:

  • +0: dword: 3 = номер подфункции
  • +4: dword: позиция в файле (в байтах)
  • +8: dword: старший dword позиции (должен быть 0 для FAT)
  • +12 = +0xC: dword: сколько байт писать
  • +16 = +0x10: dword: указатель на данные
  • +20 = +0x14: путь, правила формирования имён указаны в общем описании

Возвращаемое значение:

  • eax = 0 - успешно, иначе код ошибки файловой системы
  • ebx = число записанных байт (возможно, 0)

Замечания:

  • Файл должен уже существовать, иначе вернётся eax=5.
  • Единственным результатом записи 0 байт является установка в атрибутах файла даты/времени модификации и доступа в текущую.
  • Если начальная и/или конечная позиция выходит за пределы файла (за исключением предыдущего случая), файл расширяется до необходимого размера нулевыми символами.
  • Функция не поддерживается для CD (вернётся код ошибки 2).

Константы для регистров:

eax - SF_FILE (70)
[ebx] - SSF_WRITE_FILE (3)

Подфункция 4 - установка размера файла.

Параметры:

  • eax = 70 - номер функции
  • ebx = указатель на информационную структуру

Формат информационной структуры:

  • +0: dword: 4 = номер подфункции
  • +4: dword: младший dword нового размера файла
  • +8: dword: старший dword нового размера файла (должен быть 0 для FAT)
  • +12 = +0xC: dword: 0 (зарезервировано)
  • +16 = +0x10: dword: 0 (зарезервировано)
  • +20 = +0x14: путь, правила формирования имён указаны в общем описании

Возвращаемое значение:

  • eax = 0 - успешно, иначе код ошибки файловой системы
  • ebx разрушается

Замечания:

  • Если новый размер файла меньше старого, файл усекается. Если новый размер больше старого, файл расширяется нулевыми символами. Если новый размер равен старому, единственным результатом вызова является установка даты/времени модификации и доступа в текущие.
  • Если свободного места на диске недостаточно для расширения файла, то функция расширит насколько возможно, после чего вернёт код ошибки 8.
  • Функция не поддерживается для CD (вернётся код ошибки 2).

Константы для регистров:

eax - SF_FILE (70)
[ebx] - SSF_SET_END (4)

Подфункция 5 - получение информации о файле/папке.

Параметры:

  • eax = 70 - номер функции
  • ebx = указатель на информационную структуру

Формат информационной структуры:

  • +0: dword: 5 = номер подфункции
  • +4: dword: 0 (зарезервировано)
  • +8: dword: 0 или флаги (для корневого каталога)
  • +12 = +0xC: dword: 0 (зарезервировано)
  • +16 = +0x10: dword: указатель на буфер, куда будут записаны данные (40 байт)
  • +20 = +0x14: путь, правила формирования имён указаны в общем описании

Возвращаемое значение:

  • eax = 0 - успешно, иначе код ошибки файловой системы
  • ebx разрушается

Информация о файле возвращается в формате БДВК (блока данных входа каталога), указанном в описании подфункции 1, но без имени файла, за исключением корневого каталога.

Замечания:

  • Для корневого каталога возвращается размер раздела, а при указании кодировки (не ноль), также его имя.
  • Для устройства возвращается только размер.

Константы для регистров:

eax - SF_FILE (70)
[ebx] - SSF_GET_INFO (5)

Подфункция 6 - установка атрибутов файла/папки.

Параметры:

  • eax = 70 - номер функции
  • ebx = указатель на информационную структуру

Формат информационной структуры:

  • +0: dword: 6 = номер подфункции
  • +4: dword: 0 (зарезервировано)
  • +8: dword: 0 (зарезервировано)
  • +12 = +0xC: dword: 0 (зарезервировано)
  • +16 = +0x10: dword: указатель на буфер с атрибутами (32 байта)
  • +20 = +0x14: путь, правила формирования имён указаны в общем описании

Возвращаемое значение:

  • eax = 0 - успешно, иначе код ошибки файловой системы
  • ebx разрушается

Атрибуты файла - первые 32 байта в БДВК (блоке данных входа каталога), формат которого указан в описании подфункции 1 (то есть без имени и размера файла). Атрибут файл/папка/метка тома (биты 3,4 в dword'е +0) не меняется. Байт +4 (формат имени) игнорируется.

Замечания:

  • Функция не поддерживает виртуальные папки типа /, /rd и корневые папки типа /rd/1.
  • Функция не поддерживается для CD (вернётся код ошибки 2).

Константы для регистров:

eax - SF_FILE (70)
[ebx] - SSF_SET_INFO (6)

Подфункция 7 - запуск программы.

Параметры:

  • eax = 70 - номер функции
  • ebx = указатель на информационную структуру

Формат информационной структуры:

  • +0: dword: 7 = номер подфункции
  • +4: dword: поле флагов:
    • бит 0: запустить процесс как отлаживаемый
    • остальные биты зарезервированы и должны быть установлены в 0
  • +8: dword: 0 или указатель на ASCIIZ-строку с параметрами
  • +12 = +0xC: dword: 0 (зарезервировано)
  • +16 = +0x10: dword: 0 (зарезервировано)
  • +20 = +0x14: путь, правила формирования имён указаны в общем описании

Возвращаемое значение:

  • eax > 0 - программа загружена, eax содержит PID
  • eax < 0 - произошла ошибка, -eax содержит код ошибки файловой системы
  • ebx разрушается

Замечания:

  • Командная строка должна заканчиваться символом с кодом 0 (ASCIIZ-строка); учитываются либо все символы до завершающего нуля включительно, либо первые 256 символов, в зависимости от того, что меньше.
  • Если процесс запускается как отлаживаемый, он создаётся в замороженном состоянии; для запуска используйте подфункцию 5 функции 69.

Константы для регистров:

eax - SF_FILE (70)
[ebx] - SSF_START_APP (7)

Подфункция 8 - удаление файла/папки.

Параметры:

  • eax = 70 - номер функции
  • ebx = указатель на информационную структуру

Формат информационной структуры:

  • +0: dword: 8 = номер подфункции
  • +4: dword: 0 (зарезервировано)
  • +8: dword: 0 (зарезервировано)
  • +12 = +0xC: dword: 0 (зарезервировано)
  • +16 = +0x10: dword: 0 (зарезервировано)
  • +20 = +0x14: путь, правила формирования имён указаны в общем описании

Возвращаемое значение:

  • eax = 0 - успешно, иначе код ошибки файловой системы
  • ebx разрушается

Замечания:

  • Функция не поддерживается для CD (вернётся код ошибки 2).
  • Можно удалять только пустые папки (попытка удаления непустой папки приведёт к ошибке с кодом 10, "доступ запрещён").

Константы для регистров:

eax - SF_FILE (70)
[ebx] - SSF_DELETE (8)

Подфункция 9 - создание папки.

Параметры:

  • eax = 70 - номер функции
  • ebx = указатель на информационную структуру

Формат информационной структуры:

  • +0: dword: 9 = номер подфункции
  • +4: dword: 0 (зарезервировано)
  • +8: dword: 0 (зарезервировано)
  • +12 = +0xC: dword: 0 (зарезервировано)
  • +16 = +0x10: dword: 0 (зарезервировано)
  • +20 = +0x14: путь, правила формирования имён указаны в общем описании

Возвращаемое значение:

  • eax = 0 - успешно, иначе код ошибки файловой системы
  • ebx разрушается

Замечания:

  • Функция не поддерживается для CD (вернётся код ошибки 2).
  • Родительская папка должна уже существовать.
  • Если папка уже существует, функция завершится успешно (eax=0).

Константы для регистров:

eax - SF_FILE (70)
[ebx] - SSF_CREATE_FOLDER (9)