Difference between revisions of "SysFn70/ru"

From KolibriOS wiki
Jump to navigation Jump to search
(Created page with 'Параметры: * eax = 70 * ebx = указатель на информационную структуру Возвращаемое значение: * eax = 0 - усп...')
 
 
(25 intermediate revisions by 5 users not shown)
Line 1: Line 1:
Параметры:
+
'''Функция 70''' - работа с файловой системой с поддержкой длинных имён.
  * eax = 70
+
 
  * ebx = указатель на информационную структуру
+
''Параметры:''
Возвращаемое значение:
+
:* eax = 70
  * eax = 0 - успешно; иначе код ошибки файловой системы
+
:* ebx = указатель на информационную структуру
  * в зависимости от подфункции может возвращаться значение и
+
 
    в других регистрах
+
''Возвращаемое значение:''
Общий формат информационной структуры:
+
:* eax = 0 - успешно; иначе код ошибки файловой системы
  * +0: dword: номер подфункции
+
:* в зависимости от подфункции может возвращаться значение и в других регистрах
  * +4: dword: смещение в файле
+
 
  * +8: dword: старший dword смещения (должен быть 0) или поле флагов
+
''Общий формат информационной структуры:''
  * +12 = +0xC: dword: размер
+
:* +0: dword: номер подфункции
  * +16 = +0x10: dword: указатель на данные
+
:* +4: dword: смещение в файле или папке
  * +20 = +0x14: n db: ASCIIZ-строка с именем файла
+
:* +8: dword: старшая часть смещения или поле флагов
    или
+
:* +12 = +0xC: dword: размер данных
  * +20 = +0x14: db 0
+
:* +16 = +0x10: dword: указатель на данные
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
+
:* +20 = +0x14: ?: текстовая строка - путь к файлу, заканчивается нулём
Уточнения - в документации на соответствующую подфункцию.
+
:или
Имя файла нечувствительно к регистру букв. Русские буквы должны быть
+
:* +20 = +0x14: byte: 0
записаны в кодировке cp866 (DOS).
+
:* +21 = +0x15: dword: указатель на строку
Формат имени файла:
+
 
/base/number/dir1/dir2/.../dirn/file,
+
Чувствительность к регистру букв зависит от файловой системы.
где /base/number идентифицирует устройство, на котором ищется файл:
+
Если путь начинается не с '/', то он считается относительным.
одно из
+
Получить или установить текущую папку можно с помощью [[SysFn30/ru|сисфункции 30]].
  * /RD/1 = /RAMDISK/1 для доступа к рамдиску
+
'../' в пути означает подъём на одну папку относительно текущей.
  * /FD/1 = /FLOPPYDISK/1 для доступа к первому флоппи-дисководу,
+
 
    /FD/2 = /FLOPPYDISK/2 для второго флоппи-дисковода
+
Можно указать кодировку строки, поместив в её начале байт со значениями:
  * /HD0/x, /HD1/x, /HD2/x, /HD3/x для доступа соответственно
+
:* 1 = cp866
    к жёстким дискам на IDE0 (Primary Master), IDE1 (Primary Slave),
+
:* 2 = UTF-16LE
    IDE2 (Secondary Master), IDE3 (Secondary Slave);
+
:* 3 = UTF-8
    x - номер раздела на выбранном винчестере, изменяется от 1 до 255
+
иначе будет использоваться кодировка cp866. В абсолютном пути можно
    (на каждом из винчестеров нумерация начинается с 1)
+
поместить этот байт после '/' или добавить дополнительный '/' перед ним.
  * /CD0/1, /CD1/1, /CD2/1, /CD3/1 для доступа соответственно
+
Также, можно использовать [[SysFn80/ru|сисфункцию 80]].
    к CD на IDE0 (Primary Master), IDE1 (Primary Slave),
+
 
    IDE2 (Secondary Master), IDE3 (Secondary Slave)
+
Формат абсолютного пути:
  * /SYS - определяет системную папку; при обычной загрузке системы
+
 
    с дискеты эквивалентно /RD/1
+
''/base/number/dir1/dir2/.../dirn/file,''
Примеры:
+
 
  * '/rd/1/kernel.asm',0
+
где ''base/number'' идентифицирует устройство, на котором ищется файл:
  * '/HD0/1/kernel.asm',0
+
 
  * '/hd0/2/menuet/pics/tanzania.bmp',0
+
:* '''RD/1''' = рамдиск
  * '/hd0/1/Program files/NameOfProgram/SomeFile.SomeExtension',0
+
:* '''FD/1''' = первый флоппи-дисковод, '''FD/2''' = второй флоппи-дисковод
  * '/sys/MySuperApp.ini',0
+
:* '''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
  * подфункция 0 - чтение файла
+
:* '''SYS''' - системная папка (является ключом, не зависит от кодировки), второй ключ может быть установлен сисфункцией 30.3.
  * подфункция 1 - чтение папки
+
 
  * подфункция 2 - создание/перезапись файла
+
''Примеры:''
  * подфункция 3 - запись в существующий файл
+
:* '/sys/example.asm',0
  * подфункция 4 - установка размера файла
+
:* '/rd/1/example.asm',0
  * подфункция 5 - получение атрибутов файла/папки
+
:* '/HD0/1/folder/file.txt',0
  * подфункция 6 - установка атрибутов файла/папки
+
:* '/hd2/2/pics/tanzania.bmp',0
  * подфункция 7 - запуск программы
+
:* 2,'/',0,'sys','/',0,'F',0,'I',0,'L',0,'E',0,0,0
  * подфункция 8 - удаление файла/папки
+
 
  * подфункция 9 - создание папки
 
 
Для CD-приводов в связи с аппаратными ограничениями доступны
 
Для CD-приводов в связи с аппаратными ограничениями доступны
 
только подфункции 0,1,5 и 7, вызов других подфункций завершится
 
только подфункции 0,1,5 и 7, вызов других подфункций завершится
Line 59: Line 58:
 
(CD и DVD) производится блокировка ручного управления механизмом
 
(CD и DVD) производится блокировка ручного управления механизмом
 
лотка. Это связано с кэшированием данных, полученных от привода.
 
лотка. Это связано с кэшированием данных, полученных от привода.
Разблокировка осуществляется при обращении подфункции 4 функции 24
+
Разблокировка осуществляется при обращении подфункции 4 [[SysFn24/ru|функции 24]]
 
к соответствующему устройству.
 
к соответствующему устройству.
  
 +
=== Подфункция 0 - чтение файла с поддержкой длинных имён. ===
  
=== Подфункция 0 - чтение файла с поддержкой длинных имён. ===
+
''Параметры:''
 +
:* eax = 70 - номер функции
 +
:* ebx = указатель на информационную структуру
 +
 
 +
''Формат информационной структуры:''
 +
:* +0: dword: 0 = номер подфункции
 +
:* +4: dword: позиция в файле (в байтах)
 +
:* +8: dword: старший dword позиции
 +
:* +12 = +0xC: dword: сколько байт читать
 +
:* +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
 +
:* +20 = +0x14: путь, правила формирования имён указаны в общем описании
 +
 
 +
''Возвращаемое значение:''
 +
:* eax = 0 - успешно, иначе код ошибки файловой системы
 +
:* ebx = число прочитанных байт
  
Параметры:
+
''Замечания:''
  * eax = 70 - номер функции
+
:* Если файл кончился раньше, чем был прочитан последний запрошенный блок, то функция прочитает, сколько сможет, после чего вернёт eax=6 (EOF).
  * ebx = указатель на информационную структуру
+
:* Функция не позволяет читать папки (вернётся eax=10, access denied).
Формат информационной структуры:
 
  * +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).
 
  
 +
'''Константы для регистров:'''
 +
::eax - SF_FILE (70)
 +
::[ebx] - SSF_READ_FILE (0)
  
 
=== Подфункция 1 - чтение папки с поддержкой длинных имён. ===
 
=== Подфункция 1 - чтение папки с поддержкой длинных имён. ===
  
Параметры:
+
''Параметры:''
  * eax = 70 - номер функции
+
:* eax = 70 - номер функции
  * ebx = указатель на информационную структуру
+
:* ebx = указатель на информационную структуру
Формат информационной структуры:
+
 
  * +0: dword: 1 = номер подфункции
+
''Формат информационной структуры:''
  * +4: dword: индекс начального блока (считая с 0)
+
:* +0: dword: 1 = номер подфункции
  * +8: dword: поле флагов:
+
:* +4: dword: индекс начального блока (считая с 0)
    * бит 0 (маска 1): в каком формате возвращать имена,
+
:* +8: dword: в какой кодировке возвращать имена:
      0=ANSI, 1=UNICODE
+
:: 0 = по умолчанию
    * прочие биты зарезервированы и должны быть установлены в 0
+
:: 1 = cp866
      для будущей совместимости
+
:: 2 = UTF-16LE
  * +12 = +0xC: dword: сколько блоков читать
+
:: 3 = UTF-8
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны
+
:* +12 = +0xC: dword: сколько блоков читать
    данные, размер буфера должен быть не меньше 32 + [+12]*560 байт
+
:* +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
  * +20 = +0x14: ASCIIZ-имя папки, правила формирования имён указаны в
+
:* +20 = +0x14: путь, правила формирования имён указаны в общем описании
    общем описании
+
 
    или
+
''Возвращаемое значение:''
  * +20 = +0x14: db 0
+
:* eax = 0 - успешно, иначе код ошибки файловой системы
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
+
:* ebx = число файлов, информация о которых была записана в буфер
Возвращаемое значение:
+
 
  * eax = 0 - успешно, иначе код ошибки файловой системы
+
''Структура буфера:''
  * ebx = число файлов, информация о которых была записана в буфер,
+
:* заголовок (32 байта)
    или -1=0xffffffff, если папка не найдена
+
:* блок с информацией о файле 1
Структура буфера:
+
:* блок с информацией о файле 2
  * +0: 32*byte: заголовок
+
:* ...
  * +32 = +0x20: n1*byte: блок с информацией о файле 1
+
 
  * +32+n1: n2*byte: блок с информацией о файле 2
+
''Структура заголовка:''
  * ...
+
:* +0: dword: версия структуры (текущая версия = 1)
Структура заголовка:
+
:* +4: dword: количество размещённых блоков; не больше, чем запрошено в поле +12 информационной структуры; может быть меньше, если в папке кончились файлы (то же самое, что и в ebx)
  * +0: dword: версия структуры (текущая версия = 1)
+
:* +8: dword: общее число файлов в папке
  * +4: dword: количество размещённых блоков; не больше, чем запрошено
+
:* +12 = +0xC: 20*byte: зарезервировано (нули)
    в поле +12 информационной структуры; может быть меньше,
+
 
    если в папке кончились файлы (то же самое, что и в ebx)
+
''Структура блока данных входа каталога (БДВК):''
  * +8: dword: общее число файлов в папке
+
:* +0: dword: атрибуты файла:
  * +12 = +0xC: 20*byte: зарезервировано (нули)
+
:** бит 0 (маска 1): файл только для чтения
Структура блока данных входа каталога (БДВК):
+
:** бит 1 (маска 2): файл является скрытым
  * +0: dword: атрибуты файла:
+
:** бит 2 (маска 4): файл является системным
    * бит 0 (маска 1): файл только для чтения
+
:** бит 3 (маска 8): это метка тома (возвращается только подфункцией 5)
    * бит 1 (маска 2): файл является скрытым
+
:** бит 4 (маска 0x10): это папка
    * бит 2 (маска 4): файл является системным
+
:** бит 5 (маска 0x20): файл не архивировался - многие программы архивации имеют опцию, по которой архивируются только файлы с установленным этим битом, после чего этот бит сбрасывается - это может быть полезно для автоматического создания backup-архивов, ибо при записи бит обычно устанавливается (не в Kolibri, правда)
    * бит 3 (маска 8): это не файл, а метка тома
+
:* +4: byte: кодировка имени, соответствует полю +8 информационной структуры
      (на заданном разделе встречается не более одного раза и
+
:* +5: 3*byte: зарезервировано (нули)
      только в корневой папке)
+
:* +8: 4*byte: время создания файла
    * бит 4 (маска 0x10): это папка
+
:* +12 = +0xC: 4*byte: дата создания файла
    * бит 5 (маска 0x20): файл не архивировался - многие программы
+
:* +16 = +0x10: 4*byte: время последнего доступа (чтение или запись)
      архивации имеют опцию, по которой архивируются только файлы
+
:* +20 = +0x14: 4*byte: дата последнего доступа
      с установленным этим битом, после чего этот бит сбрасывается -
+
:* +24 = +0x18: 4*byte: время последней модификации
      это может быть полезно для автоматического создания
+
:* +28 = +0x1C: 4*byte: дата последней модификации
      backup-архивов, ибо при записи бит обычно устанавливается
+
:* +32 = +0x20: qword: размер файла в байтах (до 16777216 Тб)
      (не в Kolibri, правда)
+
:* +40 = +0x28: имя, размер в cp866 составляет 264 байта, иначе - 520 байт
  * +4: byte: тип данных имени:
+
 
    (совпадает с битом 0 флагов информационной структуры)
+
''Формат времени:''
    * 0 = ASCII = 1-байтное представление каждого символа
+
:* +0: byte: секунды
    * 1 = UNICODE = 2-байтное представление каждого символа
+
:* +1: byte: минуты
  * +5: 3*byte: зарезервировано (нули)
+
:* +2: byte: часы
  * +8: 4*byte: время создания файла
+
:* +3: byte: зарезервировано (0)
  * +12 = +0xC: 4*byte: дата создания файла
+
:* например, 23.59.59 записывается как (в hex) 3B 3B 17 00
  * +16 = +0x10: 4*byte: время последнего доступа (чтение или запись)
+
 
  * +20 = +0x14: 4*byte: дата последнего доступа
+
''Формат даты:''
  * +24 = +0x18: 4*byte: время последней модификации
+
:* +0: byte: день
  * +28 = +0x1C: 4*byte: дата последней модификации
+
:* +1: byte: месяц
  * +32 = +0x20: qword: размер файла в байтах (до 16777216 Тб)
+
:* +2: word: год
  * +40 = +0x28: имя
+
:* например, 25.11.1979 записывается как (в hex) 19 0B BB 07
    * для формата ASCII: максимальная длина имени 263 символа
+
 
      (263 байта), байт после имени имеет значение 0
+
''Замечания:''
    * для формата UNICODE: максимальная длина имени 259 символов
+
:* Если БДВК содержит имя в cp866, то длина БДВК составляет 304 байта, иначе - 560 байт.
      (518 байт), два байта после имени имеют значение 0
+
:* Строка имени заканчивается нулём, дальнейшие данные содержат мусор.
Формат времени:
+
:* Если файлы в папке кончились раньше, чем было прочитано запрошенное количество, то функция прочитает, сколько сможет, после чего вернёт eax=6 (EOF).
  * +0: byte: секунды
+
:* Любая папка на диске, кроме корневой, содержит два специальных входа "." и "..", идентифицирующих соответственно саму папку и родительскую папку.
  * +1: byte: минуты
+
:* Функция позволяет также читать виртуальные папки "/", "/rd", "/fd", "/hd[n]", при этом атрибуты подпапок полагаются равными 0x10, а времена и даты обнулены. Альтернативный способ получения информации об оборудовании - подфункция 11 [[SysFn18/ru|функции 18]].
  * +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.
 
  
 +
'''Константы для регистров:'''
 +
::eax - SF_FILE (70)
 +
::[ebx] - SSF_READ_FOLDER (1)
  
 
=== Подфункция 2 - создание/перезапись файла с поддержкой длинных имён. ===
 
=== Подфункция 2 - создание/перезапись файла с поддержкой длинных имён. ===
  
Параметры:
+
''Параметры:''
  * eax = 70 - номер функции
+
:* eax = 70 - номер функции
  * ebx = указатель на информационную структуру
+
:* ebx = указатель на информационную структуру
Формат информационной структуры:
+
 
  * +0: dword: 2 = номер подфункции
+
''Формат информационной структуры:''
  * +4: dword: 0 (зарезервировано)
+
:* +0: dword: 2 = номер подфункции
  * +8: dword: 0 (зарезервировано)
+
:* +4: dword: 0 (зарезервировано)
  * +12 = +0xC: dword: сколько байт писать
+
:* +8: dword: 0 (зарезервировано)
  * +16 = +0x10: dword: указатель на данные
+
:* +12 = +0xC: dword: сколько байт писать
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
+
:* +16 = +0x10: dword: указатель на данные
    общем описании
+
:* +20 = +0x14: путь, правила формирования имён указаны в общем описании
    или
+
 
  * +20 = +0x14: db 0
+
''Возвращаемое значение:''
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
+
:* eax = 0 - успешно, иначе код ошибки файловой системы
Возвращаемое значение:
+
:* ebx = число записанных байт (возможно, 0)
  * eax = 0 - успешно, иначе код ошибки файловой системы
+
 
  * ebx = число записанных байт (возможно, 0)
+
''Замечания:''
Замечания:
+
:* Если файл с таким именем не существовал, он создаётся; если существовал, то перезаписывается.
  * Если файл с таким именем не существовал, он создаётся; если
+
:* Если свободного места на диске недостаточно, то функция запишет, сколько сможет, после чего вернёт код ошибки 8.
    существовал, то перезаписывается.
+
:* Функция не поддерживается для CD (вернётся код ошибки 2).
  * Если свободного места на диске недостаточно, то функция запишет,
 
    сколько сможет, после чего вернёт код ошибки 8.
 
  * Функция не поддерживается для CD (вернётся код ошибки 2).
 
  
 +
'''Константы для регистров:'''
 +
::eax - SF_FILE (70)
 +
::[ebx] - SSF_CREATE_FILE (2)
  
 
=== Подфункция 3 - запись в существующий файл с поддержкой длинных имён. ===
 
=== Подфункция 3 - запись в существующий файл с поддержкой длинных имён. ===
  
Параметры:
+
''Параметры:''
  * eax = 70 - номер функции
+
:* eax = 70 - номер функции
  * ebx = указатель на информационную структуру
+
:* ebx = указатель на информационную структуру
Формат информационной структуры:
+
 
  * +0: dword: 3 = номер подфункции
+
''Формат информационной структуры:''
  * +4: dword: позиция в файле (в байтах)
+
:* +0: dword: 3 = номер подфункции
  * +8: dword: старший dword позиции (должен быть 0 для FAT)
+
:* +4: dword: позиция в файле (в байтах)
  * +12 = +0xC: dword: сколько байт писать
+
:* +8: dword: старший dword позиции (должен быть 0 для FAT)
  * +16 = +0x10: dword: указатель на данные
+
:* +12 = +0xC: dword: сколько байт писать
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
+
:* +16 = +0x10: dword: указатель на данные
    общем описании
+
:* +20 = +0x14: путь, правила формирования имён указаны в общем описании
    или
+
 
  * +20 = +0x14: db 0
+
''Возвращаемое значение:''
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
+
:* eax = 0 - успешно, иначе код ошибки файловой системы
Возвращаемое значение:
+
:* ebx = число записанных байт (возможно, 0)
  * eax = 0 - успешно, иначе код ошибки файловой системы
+
 
  * ebx = число записанных байт (возможно, 0)
+
''Замечания:''
Замечания:
+
:* Файл должен уже существовать, иначе вернётся eax=5.
  * Файл должен уже существовать, иначе вернётся eax=5.
+
:* Единственным результатом записи 0 байт является установка в атрибутах файла даты/времени модификации и доступа в текущую.
  * Единственным результатом записи 0 байт является установка в
+
:* Если начальная и/или конечная позиция выходит за пределы файла (за исключением предыдущего случая), файл расширяется до необходимого размера нулевыми символами.
    атрибутах файла даты/времени модификации и доступа в текущую.
+
:* Функция не поддерживается для CD (вернётся код ошибки 2).
  * Если начальная и/или конечная позиция выходит за пределы файла
 
    (за исключением предыдущего случая), файл расширяется до
 
    необходимого размера нулевыми символами.
 
  * Функция не поддерживается для CD (вернётся код ошибки 2).
 
  
 +
'''Константы для регистров:'''
 +
::eax - SF_FILE (70)
 +
::[ebx] - SSF_WRITE_FILE (3)
  
 
=== Подфункция 4 - установка размера файла. ===
 
=== Подфункция 4 - установка размера файла. ===
  
Параметры:
+
''Параметры:''
  * eax = 70 - номер функции
+
:* eax = 70 - номер функции
  * ebx = указатель на информационную структуру
+
:* ebx = указатель на информационную структуру
Формат информационной структуры:
+
 
  * +0: dword: 4 = номер подфункции
+
''Формат информационной структуры:''
  * +4: dword: младший dword нового размера файла
+
:* +0: dword: 4 = номер подфункции
  * +8: dword: старший dword нового размера файла
+
:* +4: dword: младший dword нового размера файла
                  (должен быть 0 для FAT)
+
:* +8: dword: старший dword нового размера файла (должен быть 0 для FAT)
  * +12 = +0xC: dword: 0 (зарезервировано)
+
:* +12 = +0xC: dword: 0 (зарезервировано)
  * +16 = +0x10: dword: 0 (зарезервировано)
+
:* +16 = +0x10: dword: 0 (зарезервировано)
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
+
:* +20 = +0x14: путь, правила формирования имён указаны в общем описании
    общем описании
+
 
    или
+
''Возвращаемое значение:''
  * +20 = +0x14: db 0
+
:* eax = 0 - успешно, иначе код ошибки файловой системы
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
+
:* ebx разрушается
Возвращаемое значение:
+
 
  * eax = 0 - успешно, иначе код ошибки файловой системы
+
''Замечания:''
  * ebx разрушается
+
:* Если новый размер файла меньше старого, файл усекается. Если новый размер больше старого, файл расширяется нулевыми символами. Если новый размер равен старому, единственным результатом вызова является установка даты/времени модификации и доступа в текущие.
Замечания:
+
:* Если свободного места на диске недостаточно для расширения файла, то функция расширит насколько возможно, после чего вернёт код ошибки 8.
  * Если новый размер файла меньше старого, файл усекается. Если
+
:* Функция не поддерживается для CD (вернётся код ошибки 2).
    новый размер больше старого, файл расширяется нулевыми символами.
 
    Если новый размер равен старому, единственным результатом вызова
 
    является установка даты/времени модификации и доступа в текущие.
 
  * Если свободного места на диске недостаточно для расширения файла,
 
    то функция расширит насколько возможно, после чего вернёт
 
    код ошибки 8.
 
  * Функция не поддерживается для CD (вернётся код ошибки 2).
 
  
 +
'''Константы для регистров:'''
 +
::eax - SF_FILE (70)
 +
::[ebx] - SSF_SET_END (4)
  
 
=== Подфункция 5 - получение информации о файле/папке. ===
 
=== Подфункция 5 - получение информации о файле/папке. ===
  
Параметры:
+
''Параметры'':
  * eax = 70 - номер функции
+
:* eax = 70 - номер функции
  * ebx = указатель на информационную структуру
+
:* ebx = указатель на информационную структуру
Формат информационной структуры:
+
 
  * +0: dword: 5 = номер подфункции
+
''Формат информационной структуры:''
  * +4: dword: 0 (зарезервировано)
+
:* +0: dword: 5 = номер подфункции
  * +8: dword: 0 (зарезервировано)
+
:* +4: dword: 0 (зарезервировано)
  * +12 = +0xC: dword: 0 (зарезервировано)
+
:* +8: dword: 0 или флаги (для корневого каталога)
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
+
:* +12 = +0xC: dword: 0 (зарезервировано)
                        (40 байт)
+
:* +16 = +0x10: dword: указатель на буфер, куда будут записаны данные (40 байт)
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
+
:* +20 = +0x14: путь, правила формирования имён указаны в общем описании
    общем описании
+
 
    или
+
''Возвращаемое значение:''
  * +20 = +0x14: db 0
+
:* eax = 0 - успешно, иначе код ошибки файловой системы
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
+
:* ebx разрушается
Возвращаемое значение:
+
 
  * eax = 0 - успешно, иначе код ошибки файловой системы
 
  * ebx разрушается
 
 
Информация о файле возвращается в формате БДВК
 
Информация о файле возвращается в формате БДВК
 
(блока данных входа каталога), указанном в описании
 
(блока данных входа каталога), указанном в описании
подфункции 1, но без имени файла
+
подфункции 1, но без имени файла, за исключением корневого каталога.
(то есть первые 40 = 0x28 байт).
+
 
Замечания:
+
''Замечания:''
  * Функция не поддерживает виртуальные папки типа /, /rd и
+
:* Для корневого каталога возвращается размер раздела, а при указании кодировки (не ноль), также его имя.
    корневые папки типа /rd/1.
+
:* Для устройства возвращается только размер.
  
 +
'''Константы для регистров:'''
 +
::eax - SF_FILE (70)
 +
::[ebx] - SSF_GET_INFO (5)
  
 
=== Подфункция 6 - установка атрибутов файла/папки. ===
 
=== Подфункция 6 - установка атрибутов файла/папки. ===
  
Параметры:
+
''Параметры:''
  * eax = 70 - номер функции
+
:* eax = 70 - номер функции
  * ebx = указатель на информационную структуру
+
:* ebx = указатель на информационную структуру
Формат информационной структуры:
+
 
  * +0: dword: 6 = номер подфункции
+
''Формат информационной структуры:''
  * +4: dword: 0 (зарезервировано)
+
:* +0: dword: 6 = номер подфункции
  * +8: dword: 0 (зарезервировано)
+
:* +4: dword: 0 (зарезервировано)
  * +12 = +0xC: dword: 0 (зарезервировано)
+
:* +8: dword: 0 (зарезервировано)
  * +16 = +0x10: dword: указатель на буфер с атрибутами (32 байта)
+
:* +12 = +0xC: dword: 0 (зарезервировано)
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
+
:* +16 = +0x10: dword: указатель на буфер с атрибутами (32 байта)
    общем описании
+
:* +20 = +0x14: путь, правила формирования имён указаны в общем описании
    или
+
 
  * +20 = +0x14: db 0
+
''Возвращаемое значение:''
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
+
:* eax = 0 - успешно, иначе код ошибки файловой системы
Возвращаемое значение:
+
:* ebx разрушается
  * eax = 0 - успешно, иначе код ошибки файловой системы
+
 
  * ebx разрушается
 
 
Атрибуты файла - первые 32 байта в БДВК (блоке данных входа каталога),
 
Атрибуты файла - первые 32 байта в БДВК (блоке данных входа каталога),
 
формат которого указан в описании подфункции 1
 
формат которого указан в описании подфункции 1
Line 330: Line 299:
 
(биты 3,4 в dword'е +0) не меняется.
 
(биты 3,4 в dword'е +0) не меняется.
 
Байт +4 (формат имени) игнорируется.
 
Байт +4 (формат имени) игнорируется.
Замечания:
 
  * Функция не поддерживает виртуальные папки типа /, /rd и
 
    корневые папки типа /rd/1.
 
  * Функция не поддерживается для CD (вернётся код ошибки 2).
 
  
 +
''Замечания:''
 +
:* Функция не поддерживает виртуальные папки типа /, /rd и корневые папки типа /rd/1.
 +
:* Функция не поддерживается для CD (вернётся код ошибки 2).
 +
 +
'''Константы для регистров:'''
 +
::eax - SF_FILE (70)
 +
::[ebx] - SSF_SET_INFO (6)
  
 
=== Подфункция 7 - запуск программы. ===
 
=== Подфункция 7 - запуск программы. ===
  
Параметры:
+
''Параметры:''
  * eax = 70 - номер функции
+
:* eax = 70 - номер функции
  * ebx = указатель на информационную структуру
+
:* ebx = указатель на информационную структуру
Формат информационной структуры:
+
 
  * +0: dword: 7 = номер подфункции
+
''Формат информационной структуры:''
  * +4: dword: поле флагов:
+
:* +0: dword: 7 = номер подфункции
    * бит 0: запустить процесс как отлаживаемый
+
:* +4: dword: поле флагов:
    * остальные биты зарезервированы и должны быть установлены в 0
+
:** бит 0: запустить процесс как отлаживаемый
  * +8: dword: 0 или указатель на ASCIIZ-строку с параметрами
+
:** остальные биты зарезервированы и должны быть установлены в 0
  * +12 = +0xC: dword: 0 (зарезервировано)
+
:* +8: dword: 0 или указатель на ASCIIZ-строку с параметрами
  * +16 = +0x10: dword: 0 (зарезервировано)
+
:* +12 = +0xC: dword: 0 (зарезервировано)
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
+
:* +16 = +0x10: dword: 0 (зарезервировано)
    общем описании
+
:* +20 = +0x14: путь, правила формирования имён указаны в общем описании
    или
+
 
  * +20 = +0x14: db 0
+
''Возвращаемое значение:''
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
+
:* eax > 0 - программа загружена, eax содержит PID
Возвращаемое значение:
+
:* eax < 0 - произошла ошибка, -eax содержит код ошибки файловой системы
  * eax > 0 - программа загружена, eax содержит PID
+
:* ebx разрушается
  * eax < 0 - произошла ошибка, -eax содержит
+
 
    код ошибки файловой системы
 
  * ebx разрушается
 
 
Замечания:
 
Замечания:
  * Командная строка должна заканчиваться символом с кодом 0
+
:* Командная строка должна заканчиваться символом с кодом 0 (ASCIIZ-строка); учитываются либо все символы до завершающего нуля включительно, либо первые 256 символов, в зависимости от того, что меньше.
    (ASCIIZ-строка); учитываются либо все символы до завершающего нуля
+
:* Если процесс запускается как отлаживаемый, он создаётся в замороженном состоянии; для запуска используйте подфункцию 5 [[SysFn69/ru|функции 69]].
    включительно, либо первые 256 символов, в зависимости от того,
 
    что меньше.
 
  * Если процесс запускается как отлаживаемый, он создаётся
 
    в замороженном состоянии; для запуска используйте
 
    подфункцию 5 функции 69.
 
  
 +
'''Константы для регистров:'''
 +
::eax - SF_FILE (70)
 +
::[ebx] - SSF_START_APP (7)
  
 
=== Подфункция 8 - удаление файла/папки. ===
 
=== Подфункция 8 - удаление файла/папки. ===
  
Параметры:
+
''Параметры:''
  * eax = 70 - номер функции
+
:* eax = 70 - номер функции
  * ebx = указатель на информационную структуру
+
:* ebx = указатель на информационную структуру
Формат информационной структуры:
+
 
  * +0: dword: 8 = номер подфункции
+
''Формат информационной структуры:''
  * +4: dword: 0 (зарезервировано)
+
:* +0: dword: 8 = номер подфункции
  * +8: dword: 0 (зарезервировано)
+
:* +4: dword: 0 (зарезервировано)
  * +12 = +0xC: dword: 0 (зарезервировано)
+
:* +8: dword: 0 (зарезервировано)
  * +16 = +0x10: dword: 0 (зарезервировано)
+
:* +12 = +0xC: dword: 0 (зарезервировано)
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
+
:* +16 = +0x10: dword: 0 (зарезервировано)
    общем описании
+
:* +20 = +0x14: путь, правила формирования имён указаны в общем описании
    или
+
 
  * +20 = +0x14: db 0
+
''Возвращаемое значение:''
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
+
:* eax = 0 - успешно, иначе код ошибки файловой системы
Возвращаемое значение:
+
:* ebx разрушается
  * eax = 0 - успешно, иначе код ошибки файловой системы
+
 
  * ebx разрушается
+
''Замечания:''
Замечания:
+
:* Функция не поддерживается для CD (вернётся код ошибки 2).
  * Функция не поддерживается для CD (вернётся код ошибки 2).
+
:* Можно удалять только пустые папки (попытка удаления непустой папки приведёт к ошибке с кодом 10, "доступ запрещён").
  * Можно удалять только пустые папки (попытка удаления непустой папки
 
    приведёт к ошибке с кодом 10, "доступ запрещён").
 
  
 +
'''Константы для регистров:'''
 +
::eax - SF_FILE (70)
 +
::[ebx] - SSF_DELETE (8)
  
 
=== Подфункция 9 - создание папки. ===
 
=== Подфункция 9 - создание папки. ===
  
Параметры:
+
''Параметры:''
  * eax = 70 - номер функции
+
:* eax = 70 - номер функции
  * ebx = указатель на информационную структуру
+
:* ebx = указатель на информационную структуру
Формат информационной структуры:
+
 
  * +0: dword: 9 = номер подфункции
+
''Формат информационной структуры:''
  * +4: dword: 0 (зарезервировано)
+
:* +0: dword: 9 = номер подфункции
  * +8: dword: 0 (зарезервировано)
+
:* +4: dword: 0 (зарезервировано)
  * +12 = +0xC: dword: 0 (зарезервировано)
+
:* +8: dword: 0 (зарезервировано)
  * +16 = +0x10: dword: 0 (зарезервировано)
+
:* +12 = +0xC: dword: 0 (зарезервировано)
  * +20 = +0x14: ASCIIZ-имя папки, правила формирования имён указаны в
+
:* +16 = +0x10: dword: 0 (зарезервировано)
    общем описании
+
:* +20 = +0x14: путь, правила формирования имён указаны в общем описании
    или
+
 
  * +20 = +0x14: db 0
+
''Возвращаемое значение:''
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем папки
+
:* eax = 0 - успешно, иначе код ошибки файловой системы
Возвращаемое значение:
+
:* ebx разрушается
  * eax = 0 - успешно, иначе код ошибки файловой системы
 
  * ebx разрушается
 
Замечания:
 
  * Функция не поддерживается для CD (вернётся код ошибки 2).
 
  * Родительская папка должна уже существовать.
 
  * Если папка уже существует, функция завершится успешно (eax=0).
 
  
 +
''Замечания:''
 +
:* Функция не поддерживается для CD (вернётся код ошибки 2).
 +
:* Родительская папка должна уже существовать.
 +
:* Если папка уже существует, функция завершится успешно (eax=0).
  
=== Подфункция 1 - установить заголовок окна программы. ===
+
'''Константы для регистров:'''
 +
::eax - SF_FILE (70)
 +
::[ebx] - SSF_CREATE_FOLDER (9)
  
Параметры:
+
{{System_functions}}
  * eax = 71 - номер функции
+
[[Category: SysCalls]]
  * ebx = 1 - номер подфункции
 
  * ecx = адрес строки заголовка
 
Возвращаемое значение:
 
  * функция не возвращает значения
 
Замечания:
 
  * Строка заголовка должна быть в формате ASCIIZ. В заголовке
 
    отображается не более 255 символов независимо от полной длины
 
    строки.
 
  * Чтобы убрать заголовок, передайте NULL в ecx.
 

Latest revision as of 06:35, 28 April 2021

Функция 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)