SysFn70/ru: Difference between revisions

From KolibriOS wiki
Jump to navigation Jump to search
No edit summary
Line 15: Line 15:
:* +12 = +0xC: dword: размер
:* +12 = +0xC: dword: размер
:* +16 = +0x10: dword: указатель на данные
:* +16 = +0x10: dword: указатель на данные
:* +20 = +0x14: n db: ASCIIZ-строка с именем файла или
:* +20 = +0x14: ?: текстовая строка - путь к файлу, заканчивается нулём
:* +20 = +0x14: db 0
:или
:* +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
:* +20 = +0x14: byte: 0
:* +21 = +0x15: dword: указатель на строку
 
Чувствительность к регистру букв зависит от файловой системы.
Можно указать кодировку, поместив в начале строки байт со значениями:
:* 1 = cp866
:* 2 = UTF-16LE
:* 3 = UTF-8
:иначе будет использоваться кодировка cp866.


Уточнения - в документации на соответствующую подфункцию.
Имя файла нечувствительно к регистру букв. Русские буквы должны быть
записаны в кодировке 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.


''Примеры:''
''Примеры:''
:* '/rd/1/kernel.asm',0
:* '/sys/example.asm',0
:* '/HD0/1/kernel.asm',0
:* '/rd/1/example.asm',0
:* '/hd0/2/menuet/pics/tanzania.bmp',0
:* '/HD0/1/folder/file.txt',0
:* '/hd0/1/Program files/NameOfProgram/SomeFile.SomeExtension',0
:* '/hd2/2/pics/tanzania.bmp',0
:* '/sys/MySuperApp.ini',0
:* 2,'/',0,'sys','/',0,'F',0,'I',0,'L',0,'E',0,0,0


Также функция поддерживает относительные имена. Если путь начинается
Также функция поддерживает относительные имена. Если путь начинается
Line 67: Line 71:
:* +12 = +0xC: dword: сколько байт читать
:* +12 = +0xC: dword: сколько байт читать
:* +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
:* +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
:* +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или
:* +20 = +0x14: путь, правила формирования имён указаны в общем описании
:* +20 = +0x14: db 0
:* +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла


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


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


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


Line 125: Line 125:
:** бит 4 (маска 0x10): это папка
:** бит 4 (маска 0x10): это папка
:** бит 5 (маска 0x20): файл не архивировался - многие программы архивации имеют опцию, по которой архивируются только файлы с установленным этим битом, после чего этот бит сбрасывается - это может быть полезно для автоматического создания backup-архивов, ибо при записи бит обычно устанавливается (не в Kolibri, правда)
:** бит 5 (маска 0x20): файл не архивировался - многие программы архивации имеют опцию, по которой архивируются только файлы с установленным этим битом, после чего этот бит сбрасывается - это может быть полезно для автоматического создания backup-архивов, ибо при записи бит обычно устанавливается (не в Kolibri, правда)
:* +4: byte: тип данных имени: (совпадает с битом 0 флагов информационной структуры)
:* +4: byte: кодировка имени:
:**0 = ASCII = 1-байтное представление каждого символа
::0 = cp866 -> байт на символ
:**1 = UNICODE = 2-байтное представление каждого символа
::1 = UTF-16LE -> 2 байта на символ
:* +5: 3*byte: зарезервировано (нули)
:* +5: 3*byte: зарезервировано (нули)
:* +8: 4*byte: время создания файла
:* +8: 4*byte: время создания файла
Line 136: Line 136:
:* +28 = +0x1C: 4*byte: дата последней модификации
:* +28 = +0x1C: 4*byte: дата последней модификации
:* +32 = +0x20: qword: размер файла в байтах (до 16777216 Тб)
:* +32 = +0x20: qword: размер файла в байтах (до 16777216 Тб)
:* +40 = +0x28: имя
:* +40 = +0x28: (256*enc+8)*byte: имя
:** для формата ASCII: максимальная длина имени 263 символа (263 байта), байт после имени имеет значение 0
:** для формата UNICODE: максимальная длина имени 259 символов (518 байт), два байта после имени имеют значение 0


''Формат времени:''
''Формат времени:''
Line 154: Line 152:


''Замечания:''
''Замечания:''
:* Если в БДВК присутствует имя в ASCII, то длина БДВК составляет 304 байта, если в UNICODE - 560 байт. Значение длины выравнено на целое кратное 16 байт (для ускорения обработки в кэш-памяти CPU).
:* Если в БДВК присутствует имя в cp866, то длина БДВК составляет 304 байта, если в UTF-16LE - 560 байт. Значение длины выравнено на целое кратное 16 байт для ускорения обработки в кэш-памяти CPU.
:* Первый символ после имени нулевой (ASCIIZ-строка). Дальнейшие данные содержат мусор.
:* Строка имени заканчивается нулём, дальнейшие данные содержат мусор.
:* Если файлы в папке кончились раньше, чем было прочитано запрошенное количество, то функция прочитает, сколько сможет, после чего вернёт eax=6 (EOF).
:* Если файлы в папке кончились раньше, чем было прочитано запрошенное количество, то функция прочитает, сколько сможет, после чего вернёт eax=6 (EOF).
:* Любая папка на диске, кроме корневой, содержит два специальных входа "." и "..", идентифицирующих соответственно саму папку и родительскую папку.
:* Любая папка на диске, кроме корневой, содержит два специальных входа "." и "..", идентифицирующих соответственно саму папку и родительскую папку.
Line 176: Line 174:
:* +12 = +0xC: dword: сколько байт писать
:* +12 = +0xC: dword: сколько байт писать
:* +16 = +0x10: dword: указатель на данные
:* +16 = +0x10: dword: указатель на данные
:* +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или
:* +20 = +0x14: путь, правила формирования имён указаны в общем описании
:* +20 = +0x14: db 0
:* +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла


''Возвращаемое значение:''
''Возвращаемое значение:''
Line 205: Line 201:
:* +12 = +0xC: dword: сколько байт писать
:* +12 = +0xC: dword: сколько байт писать
:* +16 = +0x10: dword: указатель на данные
:* +16 = +0x10: dword: указатель на данные
:* +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или
:* +20 = +0x14: путь, правила формирования имён указаны в общем описании
:* +20 = +0x14: db 0
:* +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла


''Возвращаемое значение:''
''Возвращаемое значение:''
Line 235: Line 229:
:* +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
:* +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла


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


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


''Возвращаемое значение:''
''Возвращаемое значение:''
Line 332: Line 320:
:* +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
:* +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла


''Возвращаемое значение:''
''Возвращаемое значение:''
Line 361: Line 347:
:* +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
:* +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла


''Возвращаемое значение:''
''Возвращаемое значение:''
Line 389: Line 373:
:* +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
:* +21 = +0x15: dd указатель на ASCIIZ-строку с именем папки


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

Revision as of 02:57, 4 September 2016

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

Параметры:

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

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

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

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

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

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

  • 1 = cp866
  • 2 = UTF-16LE
  • 3 = UTF-8
иначе будет использоваться кодировка cp866.

Формат имени файла:

/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,