SysFn70/ru: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
|||
(10 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
'''Функция 70''' - работа с файловой системой с поддержкой длинных имён. | |||
''Параметры:'' | ''Параметры:'' | ||
:* eax = 70 | |||
* eax = 70 | :* ebx = указатель на информационную структуру | ||
* ebx = указатель на информационную структуру | |||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
:* eax = 0 - успешно; иначе код ошибки файловой системы | |||
:* в зависимости от подфункции может возвращаться значение и в других регистрах | |||
* | ''Общий формат информационной структуры:'' | ||
* | :* +0: dword: номер подфункции | ||
:* +4: dword: смещение в файле или папке | |||
:* +8: dword: старшая часть смещения или поле флагов | |||
:* +12 = +0xC: dword: размер данных | |||
:* +16 = +0x10: dword: указатель на данные | |||
:* +20 = +0x14: ?: текстовая строка - путь к файлу, заканчивается нулём | |||
:или | |||
:* +20 = +0x14: byte: 0 | |||
:* +21 = +0x15: dword: указатель на строку | |||
'' | Чувствительность к регистру букв зависит от файловой системы. | ||
Если путь начинается не с '/', то он считается относительным. | |||
Получить или установить текущую папку можно с помощью [[SysFn30/ru|сисфункции 30]]. | |||
'../' в пути означает подъём на одну папку относительно текущей. | |||
Можно указать кодировку строки, поместив в её начале байт со значениями: | |||
:* 1 = cp866 | |||
:* 2 = UTF-16LE | |||
* | :* 3 = UTF-8 | ||
иначе будет использоваться кодировка cp866. В абсолютном пути можно | |||
* | поместить этот байт после '/' или добавить дополнительный '/' перед ним. | ||
Также, можно использовать [[SysFn80/ru|сисфункцию 80]]. | |||
* | |||
Формат абсолютного пути: | |||
Формат | |||
''/base/number/dir1/dir2/.../dirn/file,'' | ''/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/ | :* '/rd/1/example.asm',0 | ||
* '/HD0/1/ | :* '/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-приводов в связи с аппаратными ограничениями доступны | Для CD-приводов в связи с аппаратными ограничениями доступны | ||
Line 50: | Line 58: | ||
(CD и DVD) производится блокировка ручного управления механизмом | (CD и DVD) производится блокировка ручного управления механизмом | ||
лотка. Это связано с кэшированием данных, полученных от привода. | лотка. Это связано с кэшированием данных, полученных от привода. | ||
Разблокировка осуществляется при обращении подфункции 4 функции 24 | Разблокировка осуществляется при обращении подфункции 4 [[SysFn24/ru|функции 24]] | ||
к соответствующему устройству. | к соответствующему устройству. | ||
=== Подфункция 0 - чтение файла с поддержкой длинных имён. === | === Подфункция 0 - чтение файла с поддержкой длинных имён. === | ||
''Параметры:'' | ''Параметры:'' | ||
:* eax = 70 - номер функции | |||
* eax = 70 - номер функции | :* ebx = указатель на информационную структуру | ||
* ebx = указатель на информационную структуру | |||
''Формат информационной структуры:'' | ''Формат информационной структуры:'' | ||
:* +0: dword: 0 = номер подфункции | |||
* +0: dword: 0 = номер подфункции | :* +4: dword: позиция в файле (в байтах) | ||
* +4: dword: позиция в файле (в байтах) | :* +8: dword: старший dword позиции | ||
* +8: dword: | :* +12 = +0xC: dword: сколько байт читать | ||
* +12 = +0xC: dword: сколько байт читать | :* +16 = +0x10: dword: указатель на буфер, куда будут записаны данные | ||
* +16 = +0x10: dword: указатель на буфер, куда будут записаны данные | :* +20 = +0x14: путь, правила формирования имён указаны в общем описании | ||
* +20 = +0x14: | |||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
:* eax = 0 - успешно, иначе код ошибки файловой системы | |||
* eax = 0 - успешно, иначе код ошибки файловой системы | :* ebx = число прочитанных байт | ||
* ebx = число прочитанных байт | |||
''Замечания:'' | ''Замечания:'' | ||
:* Если файл кончился раньше, чем был прочитан последний запрошенный блок, то функция прочитает, сколько сможет, после чего вернёт 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 = номер подфункции | |||
* +0: dword: 1 = номер подфункции | :* +4: dword: индекс начального блока (считая с 0) | ||
* +4: dword: индекс начального блока (считая с 0) | :* +8: dword: в какой кодировке возвращать имена: | ||
* +8: dword: | :: 0 = по умолчанию | ||
:: 1 = cp866 | |||
:: 2 = UTF-16LE | |||
* +12 = +0xC: dword: сколько блоков читать | :: 3 = UTF-8 | ||
* +16 = +0x10: dword: указатель на буфер, куда будут записаны данные | :* +12 = +0xC: dword: сколько блоков читать | ||
* +20 = +0x14: | :* +16 = +0x10: dword: указатель на буфер, куда будут записаны данные | ||
:* +20 = +0x14: путь, правила формирования имён указаны в общем описании | |||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
:* eax = 0 - успешно, иначе код ошибки файловой системы | |||
* eax = 0 - успешно, иначе код ошибки файловой системы | :* ebx = число файлов, информация о которых была записана в буфер | ||
* ebx = число файлов, информация о которых была записана в буфер | |||
''Структура буфера:'' | ''Структура буфера:'' | ||
:* заголовок (32 байта) | |||
:* блок с информацией о файле 1 | |||
:* блок с информацией о файле 2 | |||
:* ... | |||
* ... | |||
''Структура заголовка:'' | ''Структура заголовка:'' | ||
:* +0: dword: версия структуры (текущая версия = 1) | |||
* +0: dword: версия структуры (текущая версия = 1) | :* +4: dword: количество размещённых блоков; не больше, чем запрошено в поле +12 информационной структуры; может быть меньше, если в папке кончились файлы (то же самое, что и в ebx) | ||
* +4: dword: количество размещённых блоков; не больше, чем запрошено в поле +12 информационной структуры; может быть меньше, если в папке кончились файлы (то же самое, что и в ebx) | :* +8: dword: общее число файлов в папке | ||
* +8: dword: общее число файлов в папке | :* +12 = +0xC: 20*byte: зарезервировано (нули) | ||
* +12 = +0xC: 20*byte: зарезервировано (нули) | |||
''Структура блока данных входа каталога (БДВК):'' | ''Структура блока данных входа каталога (БДВК):'' | ||
:* +0: dword: атрибуты файла: | |||
* +0: dword: атрибуты файла: | :** бит 0 (маска 1): файл только для чтения | ||
** бит 0 (маска 1): файл только для чтения | :** бит 1 (маска 2): файл является скрытым | ||
** бит 1 (маска 2): файл является скрытым | :** бит 2 (маска 4): файл является системным | ||
** бит 2 (маска 4): файл является системным | :** бит 3 (маска 8): это метка тома (возвращается только подфункцией 5) | ||
** бит 3 (маска 8): это | :** бит 4 (маска 0x10): это папка | ||
** бит 4 (маска 0x10): это папка | :** бит 5 (маска 0x20): файл не архивировался - многие программы архивации имеют опцию, по которой архивируются только файлы с установленным этим битом, после чего этот бит сбрасывается - это может быть полезно для автоматического создания backup-архивов, ибо при записи бит обычно устанавливается (не в Kolibri, правда) | ||
** бит 5 (маска 0x20): файл не архивировался - многие программы архивации имеют опцию, по которой архивируются только файлы с установленным этим битом, после чего этот бит сбрасывается - это может быть полезно для автоматического создания backup-архивов, ибо при записи бит обычно | :* +4: byte: кодировка имени, соответствует полю +8 информационной структуры | ||
* +4: byte: | :* +5: 3*byte: зарезервировано (нули) | ||
:* +8: 4*byte: время создания файла | |||
:* +12 = +0xC: 4*byte: дата создания файла | |||
* +5: 3*byte: зарезервировано (нули) | :* +16 = +0x10: 4*byte: время последнего доступа (чтение или запись) | ||
* +8: 4*byte: время создания файла | :* +20 = +0x14: 4*byte: дата последнего доступа | ||
* +12 = +0xC: 4*byte: дата создания файла | :* +24 = +0x18: 4*byte: время последней моди |