SysFn70/ru

From KolibriOS wiki
Revision as of 06:51, 10 April 2010 by Kogemyaka (talk | contribs) (Created page with 'Параметры: * eax = 70 * ebx = указатель на информационную структуру Возвращаемое значение: * eax = 0 - усп...')
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Параметры:

 * 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-строку с именем файла

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

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

Замечания:

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


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

Параметры:

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

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

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

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

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

Замечания:

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


Подфункция 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: ASCIIZ-имя файла, правила формирования имён указаны в
   общем описании
   или
 * +20 = +0x14: db 0
 * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла

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

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

Замечания:

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


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

Параметры:

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

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

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

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

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

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

 * Функция не поддерживает виртуальные папки типа /, /rd и
   корневые папки типа /rd/1.


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

Параметры:

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

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

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

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

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

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

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


Подфункция 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: ASCIIZ-имя файла, правила формирования имён указаны в
   общем описании
   или
 * +20 = +0x14: db 0
 * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла

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

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

Замечания:

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


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

Параметры:

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

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

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

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

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

Замечания:

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


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

Параметры:

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

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

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

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

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

Замечания:

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


Подфункция 1 - установить заголовок окна программы.

Параметры:

 * eax = 71 - номер функции
 * ebx = 1 - номер подфункции
 * ecx = адрес строки заголовка

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

 * функция не возвращает значения

Замечания:

 * Строка заголовка должна быть в формате ASCIIZ. В заголовке
   отображается не более 255 символов независимо от полной длины
   строки.
 * Чтобы убрать заголовок, передайте NULL в ecx.