SysFn70/ru: Difference between revisions
Jump to navigation
Jump to search
Pathoswithin (talk | contribs) |
Pathoswithin (talk | contribs) No edit summary |
||
Line 15: | Line 15: | ||
:* +12 = +0xC: dword: размер | :* +12 = +0xC: dword: размер | ||
:* +16 = +0x10: dword: указатель на данные | :* +16 = +0x10: dword: указатель на данные | ||
:* +20 = +0x14: | :* +20 = +0x14: ?: текстовая строка - путь к файлу, заканчивается нулём | ||
:* +20 = +0x14: | :или | ||
:* +21 = +0x15: | :* +20 = +0x14: byte: 0 | ||
:* +21 = +0x15: dword: указатель на строку | |||
Чувствительность к регистру букв зависит от файловой системы. | |||
Можно указать кодировку, поместив в начале строки байт со значениями: | |||
:* 1 = cp866 | |||
:* 2 = UTF-16LE | |||
:* 3 = UTF-8 | |||
:иначе будет использоваться кодировка cp866. | |||
Формат имени файла: | Формат имени файла: | ||
''/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/example.asm',0 | ||
:* '/ | :* '/HD0/1/folder/file.txt',0 | ||
:* '/ | :* '/hd2/2/pics/tanzania.bmp',0 | ||
:* '/sys/ | :* 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: | :* +20 = +0x14: путь, правила формирования имён указаны в общем описании | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
Line 92: | Line 94: | ||
:* +0: dword: 1 = номер подфункции | :* +0: dword: 1 = номер подфункции | ||
:* +4: dword: индекс начального блока (считая с 0) | :* +4: dword: индекс начального блока (считая с 0) | ||
:* +8: dword: | :* +8: dword: в какой кодировке возвращать имена: | ||
: | ::0 = cp866 -> байт на символ | ||
::1 = UTF-16LE -> 2 байта на символ | |||
:* +12 = +0xC: dword: сколько блоков читать | :* +12 = +0xC: dword: сколько блоков читать | ||
:* +16 = +0x10: dword: указатель на буфер, куда будут записаны данные, размер буфера должен быть не меньше 32 + | :* +16 = +0x10: dword: указатель на буфер, куда будут записаны данные, размер буфера должен быть не меньше 32+n(40+256*enc+8) байт | ||
:* +20 = +0x14: | :* +20 = +0x14: путь, правила формирования имён указаны в общем описании | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
Line 106: | Line 106: | ||
''Структура буфера:'' | ''Структура буфера:'' | ||
:* | :* заголовок (32 байта) | ||
:* | :* блок с информацией о файле 1 | ||
:* | :* блок с информацией о файле 2 | ||
:* ... | :* ... | ||
Line 125: | Line 125: | ||
:** бит 4 (маска 0x10): это папка | :** бит 4 (маска 0x10): это папка | ||
:** бит 5 (маска 0x20): файл не архивировался - многие программы архивации имеют опцию, по которой архивируются только файлы с установленным этим битом, после чего этот бит сбрасывается - это может быть полезно для автоматического создания backup-архивов, ибо при записи бит обычно устанавливается (не в Kolibri, правда) | :** бит 5 (маска 0x20): файл не архивировался - многие программы архивации имеют опцию, по которой архивируются только файлы с установленным этим битом, после чего этот бит сбрасывается - это может быть полезно для автоматического создания backup-архивов, ибо при записи бит обычно устанавливается (не в Kolibri, правда) | ||
:* +4: byte: | :* +4: byte: кодировка имени: | ||
: | ::0 = cp866 -> байт на символ | ||
: | ::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: имя | ||
''Формат времени:'' | ''Формат времени:'' | ||
Line 154: | Line 152: | ||
''Замечания:'' | ''Замечания:'' | ||
:* Если в БДВК присутствует имя в | :* Если в БДВК присутствует имя в cp866, то длина БДВК составляет 304 байта, если в UTF-16LE - 560 байт. Значение длины выравнено на целое кратное 16 байт для ускорения обработки в кэш-памяти CPU. | ||
:* | :* Строка имени заканчивается нулём, дальнейшие данные содержат мусор. | ||
:* Если файлы в папке кончились раньше, чем было прочитано запрошенное количество, то функция прочитает, сколько сможет, после чего вернёт eax=6 (EOF). | :* Если файлы в папке кончились раньше, чем было прочитано запрошенное количество, то функция прочитает, сколько сможет, после чего вернёт eax=6 (EOF). | ||
:* Любая папка на диске, кроме корневой, содержит два специальных входа "." и "..", идентифицирующих соответственно саму папку и родительскую папку. | :* Любая папка на диске, кроме корневой, содержит два специальных входа "." и "..", идентифицирующих соответственно саму папку и родительскую папку. | ||
Line 176: | Line 174: | ||
:* +12 = +0xC: dword: сколько байт писать | :* +12 = +0xC: dword: сколько байт писать | ||
:* +16 = +0x10: dword: указатель на данные | :* +16 = +0x10: dword: указатель на данные | ||
:* +20 = +0x14: | :* +20 = +0x14: путь, правила формирования имён указаны в общем описании | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
Line 205: | Line 201: | ||
:* +12 = +0xC: dword: сколько байт писать | :* +12 = +0xC: dword: сколько байт писать | ||
:* +16 = +0x10: dword: указатель на данные | :* +16 = +0x10: dword: указатель на данные | ||
:* +20 = +0x14: | :* +20 = +0x14: путь, правила формирования имён указаны в общем описании | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
Line 235: | Line 229: | ||
:* +12 = +0xC: dword: 0 (зарезервировано) | :* +12 = +0xC: dword: 0 (зарезервировано) | ||
:* +16 = +0x10: dword: 0 (зарезервировано) | :* +16 = +0x10: dword: 0 (зарезервировано) | ||
:* +20 = +0x14: | :* +20 = +0x14: путь, правила формирования имён указаны в общем описании | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
Line 264: | Line 256: | ||
:* +12 = +0xC: dword: 0 (зарезервировано) | :* +12 = +0xC: dword: 0 (зарезервировано) | ||
:* +16 = +0x10: dword: указатель на буфер, куда будут записаны данные (40 байт) | :* +16 = +0x10: dword: указатель на буфер, куда будут записаны данные (40 байт) | ||
:* +20 = +0x14: | :* +20 = +0x14: путь, правила формирования имён указаны в общем описании | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
Line 296: | Line 286: | ||
:* +12 = +0xC: dword: 0 (зарезервировано) | :* +12 = +0xC: dword: 0 (зарезервировано) | ||
:* +16 = +0x10: dword: указатель на буфер с атрибутами (32 байта) | :* +16 = +0x10: dword: указатель на буфер с атрибутами (32 байта) | ||
:* +20 = +0x14: | :* +20 = +0x14: путь, правила формирования имён указаны в общем описании | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
Line 332: | Line 320: | ||
:* +12 = +0xC: dword: 0 (зарезервировано) | :* +12 = +0xC: dword: 0 (зарезервировано) | ||
:* +16 = +0x10: dword: 0 (зарезервировано) | :* +16 = +0x10: dword: 0 (зарезервировано) | ||
:* +20 = +0x14: | :* +20 = +0x14: путь, правила формирования имён указаны в общем описании | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
Line 361: | Line 347: | ||
:* +12 = +0xC: dword: 0 (зарезервировано) | :* +12 = +0xC: dword: 0 (зарезервировано) | ||
:* +16 = +0x10: dword: 0 (зарезервировано) | :* +16 = +0x10: dword: 0 (зарезервировано) | ||
:* +20 = +0x14: | :* +20 = +0x14: путь, правила формирования имён указаны в общем описании | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
Line 389: | Line 373: | ||
:* +12 = +0xC: dword: 0 (зарезервировано) | :* +12 = +0xC: dword: 0 (зарезервировано) | ||
:* +16 = +0x10: dword: 0 (зарезервировано) | :* +16 = +0x10: dword: 0 (зарезервировано) | ||
:* +20 = +0x14: | :* +20 = +0x14: путь, правила формирования имён указаны в общем описании | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' |
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,