Difference between revisions of "SysFn70/ru"
Line 1: | Line 1: | ||
+ | '''Функция 70''' - работа с файловой системой с поддержкой длинных имён. | ||
+ | |||
''Параметры:'' | ''Параметры:'' | ||
− | + | :* eax = 70 | |
− | * eax = 70 | + | :* ebx = указатель на информационную структуру |
− | * ebx = указатель на информационную структуру | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
− | + | :* eax = 0 - успешно; иначе код ошибки файловой системы | |
− | * eax = 0 - успешно; иначе код ошибки файловой системы | + | :* в зависимости от подфункции может возвращаться значение и в других регистрах |
− | * в зависимости от подфункции может возвращаться значение и в других регистрах | ||
''Общий формат информационной структуры:'' | ''Общий формат информационной структуры:'' | ||
− | + | :* +0: dword: номер подфункции | |
− | * +0: dword: номер подфункции | + | :* +4: dword: смещение в файле |
− | * +4: dword: смещение в файле | + | :* +8: dword: старший dword смещения (должен быть 0) или поле флагов |
− | * +8: dword: старший dword смещения (должен быть 0) или поле флагов | + | :* +12 = +0xC: dword: размер |
− | * +12 = +0xC: dword: размер | + | :* +16 = +0x10: dword: указатель на данные |
− | * +16 = +0x10: dword: указатель на данные | + | :* +20 = +0x14: n db: ASCIIZ-строка с именем файла или |
− | * +20 = +0x14: n db: ASCIIZ-строка с именем файла или | + | :* +20 = +0x14: db 0 |
− | * +20 = +0x14: db 0 | + | :* +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла |
− | * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла | ||
Уточнения - в документации на соответствующую подфункцию. | Уточнения - в документации на соответствующую подфункцию. | ||
Line 37: | Line 36: | ||
''Примеры:'' | ''Примеры:'' | ||
− | + | :* '/rd/1/kernel.asm',0 | |
− | * '/rd/1/kernel.asm',0 | + | :* '/HD0/1/kernel.asm',0 |
− | * '/HD0/1/kernel.asm',0 | + | :* '/hd0/2/menuet/pics/tanzania.bmp',0 |
− | * '/hd0/2/menuet/pics/tanzania.bmp',0 | + | :* '/hd0/1/Program files/NameOfProgram/SomeFile.SomeExtension',0 |
− | * '/hd0/1/Program files/NameOfProgram/SomeFile.SomeExtension',0 | + | :* '/sys/MySuperApp.ini',0 |
− | * '/sys/MySuperApp.ini',0 | ||
Также функция поддерживает относительные имена. Если путь начинается | Также функция поддерживает относительные имена. Если путь начинается | ||
не с '/', то он считается относительно текущей папки. Получить или | не с '/', то он считается относительно текущей папки. Получить или | ||
− | установить текущую папку можно с помощью сисфункции 30. | + | установить текущую папку можно с помощью [[SysFn30/ru|сисфункции 30]]. |
Для CD-приводов в связи с аппаратными ограничениями доступны | Для CD-приводов в связи с аппаратными ограничениями доступны | ||
Line 54: | Line 52: | ||
(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: 0 (зарезервировано под старший dword позиции) |
− | * +8: dword: 0 (зарезервировано под старший dword позиции) | + | :* +12 = +0xC: dword: сколько байт читать |
− | * +12 = +0xC: dword: сколько байт читать | + | :* +16 = +0x10: dword: указатель на буфер, куда будут записаны данные |
− | * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные | + | :* +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или |
− | * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или | + | :* +20 = +0x14: db 0 |
− | * +20 = +0x14: db 0 | + | :* +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла |
− | * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
− | + | :* eax = 0 - успешно, иначе код ошибки файловой системы | |
− | * eax = 0 - успешно, иначе код ошибки файловой системы | + | :* ebx = число прочитанных байт или -1=0xffffffff, если файл не найден |
− | * 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 = номер подфункции | |
− | * +0: dword: 1 = номер подфункции | + | :* +4: dword: индекс начального блока (считая с 0) |
− | * +4: dword: индекс начального блока (считая с 0) | + | :* +8: dword: поле флагов: |
− | * +8: dword: поле флагов: | + | :** бит 0 (маска 1): в каком формате возвращать имена, 0=ANSI, 1=UNICODE |
− | ** бит 0 (маска 1): в каком формате возвращать имена, 0=ANSI, 1=UNICODE | + | :** прочие биты зарезервированы и должны быть установлены в 0 для будущей совместимости |
− | ** прочие биты зарезервированы и должны быть установлены в 0 для будущей совместимости | + | :* +12 = +0xC: dword: сколько блоков читать |
− | * +12 = +0xC: dword: сколько блоков читать | + | :* +16 = +0x10: dword: указатель на буфер, куда будут записаны данные, размер буфера должен быть не меньше 32 + [+12]*560 байт |
− | * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные, размер буфера должен быть не меньше 32 + [+12]*560 байт | + | :* +20 = +0x14: ASCIIZ-имя папки, правила формирования имён указаны в общем описании или |
− | * +20 = +0x14: ASCIIZ-имя папки, правила формирования имён указаны в общем описании или | + | :* +20 = +0x14: db 0 |
− | * +20 = +0x14: db 0 | + | :* +21 = +0x15: dd указатель на ASCIIZ-строку с именем папки |
− | * +21 = +0x15: dd указатель на ASCIIZ-строку с именем папки | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
− | + | :* eax = 0 - успешно, иначе код ошибки файловой системы | |
− | * eax = 0 - успешно, иначе код ошибки файловой системы | + | :* ebx = число файлов, информация о которых была записана в буфер, или -1=0xffffffff, если папка не найдена |
− | * ebx = число файлов, информация о которых была записана в буфер, или -1=0xffffffff, если папка не найдена | ||
''Структура буфера:'' | ''Структура буфера:'' | ||
− | + | :* +0: 32*byte: заголовок | |
− | * +0: 32*byte: заголовок | + | :* +32 = +0x20: n1*byte: блок с информацией о файле 1 |
− | * +32 = +0x20: n1*byte: блок с информацией о файле 1 | + | :* +32+n1: n2*byte: блок с информацией о файле 2 |
− | * +32+n1: n2*byte: блок с информацией о файле 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): это не файл, а метка тома (на заданном разделе встречается не более одного раза и только в корневой папке) |
− | ** бит 3 (маска 8): это не файл, а метка тома (на заданном разделе встречается не более одного раза и только в корневой папке) | + | :** бит 4 (маска 0x10): это папка |
− | ** бит 4 (маска 0x10): это папка | + | :** бит 5 (маска 0x20): файл не архивировался - многие программы архивации имеют опцию, по которой архивируются только файлы с установленным этим битом, после чего этот бит сбрасывается - это может быть полезно для автоматического создания backup-архивов, ибо при записи бит обычно устанавливается (не в Kolibri, правда) |
− | ** бит 5 (маска 0x20): файл не архивировался - многие программы архивации имеют опцию, по которой архивируются только файлы с установленным этим битом, после чего этот бит сбрасывается - это может быть полезно для автоматического создания backup-архивов, ибо при записи бит обычно | + | :* +4: byte: тип данных имени: (совпадает с битом 0 флагов информационной структуры) |
− | * +4: byte: тип данных имени: (совпадает с битом 0 флагов информационной структуры) | + | :**0 = ASCII = 1-байтное представление каждого символа |
− | **0 = ASCII = 1-байтное представление каждого символа | + | :**1 = UNICODE = 2-байтное представление каждого символа |
− | **1 = UNICODE = 2-байтное представление каждого символа | + | :* +5: 3*byte: зарезервировано (нули) |
− | * +5: 3*byte: зарезервировано (нули) | + | :* +8: 4*byte: время создания файла |
− | * +8: 4*byte: время создания файла | + | :* +12 = +0xC: 4*byte: дата создания файла |
− | * +12 = +0xC: 4*byte: дата создания файла | + | :* +16 = +0x10: 4*byte: время последнего доступа (чтение или запись) |
− | * +16 = +0x10: 4*byte: время последнего доступа (чтение или запись) | + | :* +20 = +0x14: 4*byte: дата последнего доступа |
− | * +20 = +0x14: 4*byte: дата последнего доступа | + | :* +24 = +0x18: 4*byte: время последней модификации |
− | * +24 = +0x18: 4*byte: время последней модификации | + | :* +28 = +0x1C: 4*byte: дата последней модификации |
− | * +28 = +0x1C: 4*byte: дата последней модификации | + | :* +32 = +0x20: qword: размер файла в байтах (до 16777216 Тб) |
− | * +32 = +0x20: qword: размер файла в байтах (до 16777216 Тб) | + | :* +40 = +0x28: имя |
− | * +40 = +0x28: имя | + | :** для формата ASCII: максимальная длина имени 263 символа (263 байта), байт после имени имеет значение 0 |
− | ** для формата ASCII: максимальная длина имени 263 символа (263 байта), байт после имени имеет значение 0 | + | :** для формата UNICODE: максимальная длина имени 259 символов (518 байт), два байта после имени имеют значение 0 |
− | ** для формата UNICODE: максимальная длина имени 259 символов (518 байт), два байта после имени имеют значение 0 | ||
''Формат времени:'' | ''Формат времени:'' | ||
− | + | :* +0: byte: секунды | |
− | * +0: byte: секунды | + | :* +1: byte: минуты |
− | * +1: byte: минуты | + | :* +2: byte: часы |
− | * +2: byte: часы | + | :* +3: byte: зарезервировано (0) |
− | * +3: byte: зарезервировано (0) | + | :* например, 23.59.59 записывается как (в hex) 3B 3B 17 00 |
− | * например, 23.59.59 записывается как (в hex) 3B 3B 17 00 | ||
''Формат даты:'' | ''Формат даты:'' | ||
− | + | :* +0: byte: день | |
− | * +0: byte: день | + | :* +1: byte: месяц |
− | * +1: byte: месяц | + | :* +2: word: год |
− | * +2: word: год | + | :* например, 25.11.1979 записывается как (в hex) 19 0B BB 07 |
− | * например, 25.11.1979 записывается как (в hex) 19 0B BB 07 | ||
''Замечания:'' | ''Замечания:'' | ||
+ | :* Если в БДВК присутствует имя в ASCII, то длина БДВК составляет 304 байта, если в UNICODE - 560 байт. Значение длины выравнено на целое кратное 16 байт (для ускорения обработки в кэш-памяти CPU). | ||
+ | :* Первый символ после имени нулевой (ASCIIZ-строка). Дальнейшие данные содержат мусор. | ||
+ | :* Если файлы в папке кончились раньше, чем было прочитано запрошенное количество, то функция прочитает, сколько сможет, после чего вернёт eax=6 (EOF). | ||
+ | :* Любая папка на диске, кроме корневой, содержит два специальных входа "." и "..", идентифицирующих соответственно саму папку и родительскую папку. | ||
+ | :* Функция позволяет также читать виртуальные папки "/", "/rd", "/fd", "/hd[n]", при этом атрибуты подпапок полагаются равными 0x10, а времена и даты обнулены. Альтернативный способ получения информации об оборудовании - подфункция 11 [[SysFn18/ru|функции 18]]. | ||
− | + | '''Константы для регистров:''' | |
− | + | ::eax - SF_FILE (70) | |
− | + | ::[ebx] - SSF_READ_FOLDER (1) | |
− | |||
− | |||
=== Подфункция 2 - создание/перезапись файла с поддержкой длинных имён. === | === Подфункция 2 - создание/перезапись файла с поддержкой длинных имён. === | ||
''Параметры:'' | ''Параметры:'' | ||
− | + | :* eax = 70 - номер функции | |
− | * eax = 70 - номер функции | + | :* ebx = указатель на информационную структуру |
− | * ebx = указатель на информационную структуру | ||
''Формат информационной структуры:'' | ''Формат информационной структуры:'' | ||
− | + | :* +0: dword: 2 = номер подфункции | |
− | * +0: dword: 2 = номер подфункции | + | :* +4: dword: 0 (зарезервировано) |
− | * +4: dword: 0 (зарезервировано) | + | :* +8: dword: 0 (зарезервировано) |
− | * +8: dword: 0 (зарезервировано) | + | :* +12 = +0xC: dword: сколько байт писать |
− | * +12 = +0xC: dword: сколько байт писать | + | :* +16 = +0x10: dword: указатель на данные |
− | * +16 = +0x10: dword: указатель на данные | + | :* +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или |
− | * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или | + | :* +20 = +0x14: db 0 |
− | * +20 = +0x14: db 0 | + | :* +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла |
− | * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
− | + | :* eax = 0 - успешно, иначе код ошибки файловой системы | |
− | * eax = 0 - успешно, иначе код ошибки файловой системы | + | :* ebx = число записанных байт (возможно, 0) |
− | * ebx = число записанных байт (возможно, 0) | ||
''Замечания:'' | ''Замечания:'' | ||
+ | :* Если файл с таким именем не существовал, он создаётся; если существовал, то перезаписывается. | ||
+ | :* Если свободного места на диске недостаточно, то функция запишет, сколько сможет, после чего вернёт код ошибки 8. | ||
+ | :* Функция не поддерживается для CD (вернётся код ошибки 2). | ||
− | + | '''Константы для регистров:''' | |
− | + | ::eax - SF_FILE (70) | |
− | + | ::[ebx] - SSF_CREATE_FILE (2) | |
=== Подфункция 3 - запись в существующий файл с поддержкой длинных имён. === | === Подфункция 3 - запись в существующий файл с поддержкой длинных имён. === | ||
''Параметры:'' | ''Параметры:'' | ||
− | + | :* eax = 70 - номер функции | |
− | * eax = 70 - номер функции | + | :* ebx = указатель на информационную структуру |
− | * ebx = указатель на информационную структуру | ||
''Формат информационной структуры:'' | ''Формат информационной структуры:'' | ||
− | + | :* +0: dword: 3 = номер подфункции | |
− | * +0: dword: 3 = номер подфункции | + | :* +4: dword: позиция в файле (в байтах) |
− | * +4: dword: позиция в файле (в байтах) | + | :* +8: dword: старший dword позиции (должен быть 0 для FAT) |
− | * +8: dword: старший dword позиции (должен быть 0 для FAT) | + | :* +12 = +0xC: dword: сколько байт писать |
− | * +12 = +0xC: dword: сколько байт писать | + | :* +16 = +0x10: dword: указатель на данные |
− | * +16 = +0x10: dword: указатель на данные | + | :* +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или |
− | * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или | + | :* +20 = +0x14: db 0 |
− | * +20 = +0x14: db 0 | + | :* +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла |
− | * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
− | + | :* eax = 0 - успешно, иначе код ошибки файловой системы | |
− | * eax = 0 - успешно, иначе код ошибки файловой системы | + | :* ebx = число записанных байт (возможно, 0) |
− | * ebx = число записанных байт (возможно, 0) | ||
''Замечания:'' | ''Замечания:'' | ||
+ | :* Файл должен уже существовать, иначе вернётся eax=5. | ||
+ | :* Единственным результатом записи 0 байт является установка в атрибутах файла даты/времени модификации и доступа в текущую. | ||
+ | :* Если начальная и/или конечная позиция выходит за пределы файла (за исключением предыдущего случая), файл расширяется до необходимого размера нулевыми символами. | ||
+ | :* Функция не поддерживается для CD (вернётся код ошибки 2). | ||
− | + | '''Константы для регистров:''' | |
− | + | ::eax - SF_FILE (70) | |
− | + | ::[ebx] - SSF_WRITE_FILE (3) | |
− | |||
=== Подфункция 4 - установка размера файла. === | === Подфункция 4 - установка размера файла. === | ||
''Параметры:'' | ''Параметры:'' | ||
− | + | :* eax = 70 - номер функции | |
− | * eax = 70 - номер функции | + | :* ebx = указатель на информационную структуру |
− | * ebx = указатель на информационную структуру | ||
''Формат информационной структуры:'' | ''Формат информационной структуры:'' | ||
− | + | :* +0: dword: 4 = номер подфункции | |
− | * +0: dword: 4 = номер подфункции | + | :* +4: dword: младший dword нового размера файла |
− | * +4: dword: младший dword нового размера файла | + | :* +8: 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: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или | + | :* +20 = +0x14: db 0 |
− | * +20 = +0x14: db 0 | + | :* +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла |
− | * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
− | + | :* eax = 0 - успешно, иначе код ошибки файловой системы | |
− | * eax = 0 - успешно, иначе код ошибки файловой системы | + | :* ebx разрушается |
− | * ebx разрушается | ||
''Замечания:'' | ''Замечания:'' | ||
+ | :* Если новый размер файла меньше старого, файл усекается. Если новый размер больше старого, файл расширяется нулевыми символами. Если новый размер равен старому, единственным результатом вызова является установка даты/времени модификации и доступа в текущие. | ||
+ | :* Если свободного места на диске недостаточно для расширения файла, то функция расширит насколько возможно, после чего вернёт код ошибки 8. | ||
+ | :* Функция не поддерживается для CD (вернётся код ошибки 2). | ||
− | + | '''Константы для регистров:''' | |
− | + | ::eax - SF_FILE (70) | |
− | + | ::[ebx] - SSF_SET_END (4) | |
=== Подфункция 5 - получение информации о файле/папке. === | === Подфункция 5 - получение информации о файле/папке. === | ||
''Параметры'': | ''Параметры'': | ||
− | + | :* eax = 70 - номер функции | |
− | * eax = 70 - номер функции | + | :* ebx = указатель на информационную структуру |
− | * ebx = указатель на информационную структуру | ||
''Формат информационной структуры:'' | ''Формат информационной структуры:'' | ||
− | + | :* +0: dword: 5 = номер подфункции | |
− | * +0: dword: 5 = номер подфункции | + | :* +4: dword: 0 (зарезервировано) |
− | * +4: dword: 0 (зарезервировано) | + | :* +8: dword: 0 (зарезервировано) |
− | * +8: dword: 0 (зарезервировано) | + | :* +12 = +0xC: dword: 0 (зарезервировано) |
− | * +12 = +0xC: dword: 0 (зарезервировано) | + | :* +16 = +0x10: dword: указатель на буфер, куда будут записаны данные (40 байт) |
− | * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные (40 байт) | + | :* +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или |
− | * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или | + | :* +20 = +0x14: db 0 |
− | * +20 = +0x14: db 0 | + | :* +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла |
− | * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
− | + | :* eax = 0 - успешно, иначе код ошибки файловой системы | |
− | * eax = 0 - успешно, иначе код ошибки файловой системы | + | :* ebx разрушается |
− | * ebx разрушается | ||
Информация о файле возвращается в формате БДВК | Информация о файле возвращается в формате БДВК | ||
Line 289: | Line 278: | ||
''Замечания:'' | ''Замечания:'' | ||
+ | :* Функция не поддерживает виртуальные папки типа /, /rd и корневые папки типа /rd/1. | ||
− | + | '''Константы для регистров:''' | |
+ | ::eax - SF_FILE (70) | ||
+ | ::[ebx] - SSF_GET_INFO (5) | ||
=== Подфункция 6 - установка атрибутов файла/папки. === | === Подфункция 6 - установка атрибутов файла/папки. === | ||
''Параметры:'' | ''Параметры:'' | ||
− | + | :* eax = 70 - номер функции | |
− | * eax = 70 - номер функции | + | :* ebx = указатель на информационную структуру |
− | * ebx = указатель на информационную структуру | ||
''Формат информационной структуры:'' | ''Формат информационной структуры:'' | ||
− | + | :* +0: dword: 6 = номер подфункции | |
− | * +0: dword: 6 = номер подфункции | + | :* +4: dword: 0 (зарезервировано) |
− | * +4: dword: 0 (зарезервировано) | + | :* +8: dword: 0 (зарезервировано) |
− | * +8: dword: 0 (зарезервировано) | + | :* +12 = +0xC: dword: 0 (зарезервировано) |
− | * +12 = +0xC: dword: 0 (зарезервировано) | + | :* +16 = +0x10: dword: указатель на буфер с атрибутами (32 байта) |
− | * +16 = +0x10: dword: указатель на буфер с атрибутами (32 байта) | + | :* +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или |
− | * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или | + | :* +20 = +0x14: db 0 |
− | * +20 = +0x14: db 0 | + | :* +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла |
− | * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
− | + | :* eax = 0 - успешно, иначе код ошибки файловой системы | |
− | * eax = 0 - успешно, иначе код ошибки файловой системы | + | :* ebx разрушается |
− | * ebx разрушается | ||
Атрибуты файла - первые 32 байта в БДВК (блоке данных входа каталога), | Атрибуты файла - первые 32 байта в БДВК (блоке данных входа каталога), | ||
Line 322: | Line 311: | ||
''Замечания:'' | ''Замечания:'' | ||
+ | :* Функция не поддерживает виртуальные папки типа /, /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 = номер подфункции | |
− | * +0: dword: 7 = номер подфункции | + | :* +4: dword: поле флагов: |
− | * +4: dword: поле флагов: | + | :** бит 0: запустить процесс как отлаживаемый |
− | ** бит 0: запустить процесс как отлаживаемый | + | :** остальные биты зарезервированы и должны быть установлены в 0 |
− | ** остальные биты зарезервированы и должны быть установлены в 0 | + | :* +8: dword: 0 или указатель на ASCIIZ-строку с параметрами |
− | * +8: dword: 0 или указатель на ASCIIZ-строку с параметрами | + | :* +12 = +0xC: dword: 0 (зарезервировано) |
− | * +12 = +0xC: dword: 0 (зарезервировано) | + | :* +16 = +0x10: dword: 0 (зарезервировано) |
− | * +16 = +0x10: dword: 0 (зарезервировано) | + | :* +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или |
− | * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или | + | :* +20 = +0x14: db 0 |
− | * +20 = +0x14: db 0 | + | :* +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла |
− | * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
− | + | :* eax > 0 - программа загружена, eax содержит PID | |
− | * eax > 0 - программа загружена, eax содержит PID | + | :* eax < 0 - произошла ошибка, -eax содержит код ошибки файловой системы |
− | * eax < 0 - произошла ошибка, -eax содержит код ошибки файловой системы | + | :* ebx разрушается |
− | * ebx разрушается | ||
Замечания: | Замечания: | ||
+ | :* Командная строка должна заканчиваться символом с кодом 0 (ASCIIZ-строка); учитываются либо все символы до завершающего нуля включительно, либо первые 256 символов, в зависимости от того, что меньше. | ||
+ | :* Если процесс запускается как отлаживаемый, он создаётся в замороженном состоянии; для запуска используйте подфункцию 5 [[SysFn69/ru|функции 69]]. | ||
− | + | '''Константы для регистров:''' | |
− | + | ::eax - SF_FILE (70) | |
+ | ::[ebx] - SSF_START_APP (7) | ||
=== Подфункция 8 - удаление файла/папки. === | === Подфункция 8 - удаление файла/папки. === | ||
''Параметры:'' | ''Параметры:'' | ||
− | + | :* eax = 70 - номер функции | |
− | * eax = 70 - номер функции | + | :* ebx = указатель на информационную структуру |
− | * ebx = указатель на информационную структуру | ||
''Формат информационной структуры:'' | ''Формат информационной структуры:'' | ||
− | + | :* +0: dword: 8 = номер подфункции | |
− | * +0: dword: 8 = номер подфункции | + | :* +4: dword: 0 (зарезервировано) |
− | * +4: dword: 0 (зарезервировано) | + | :* +8: dword: 0 (зарезервировано) |
− | * +8: dword: 0 (зарезервировано) | + | :* +12 = +0xC: dword: 0 (зарезервировано) |
− | * +12 = +0xC: dword: 0 (зарезервировано) | + | :* +16 = +0x10: dword: 0 (зарезервировано) |
− | * +16 = +0x10: dword: 0 (зарезервировано) | + | :* +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или |
− | * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или | + | :* +20 = +0x14: db 0 |
− | * +20 = +0x14: db 0 | + | :* +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла |
− | * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
− | + | :* eax = 0 - успешно, иначе код ошибки файловой системы | |
− | * eax = 0 - успешно, иначе код ошибки файловой системы | + | :* ebx разрушается |
− | * ebx разрушается | ||
''Замечания:'' | ''Замечания:'' | ||
+ | :* Функция не поддерживается для CD (вернётся код ошибки 2). | ||
+ | :* Можно удалять только пустые папки (попытка удаления непустой папки приведёт к ошибке с кодом 10, "доступ запрещён"). | ||
− | + | '''Константы для регистров:''' | |
− | + | ::eax - SF_FILE (70) | |
+ | ::[ebx] - SSF_DELETE (8) | ||
=== Подфункция 9 - создание папки. === | === Подфункция 9 - создание папки. === | ||
''Параметры:'' | ''Параметры:'' | ||
− | + | :* eax = 70 - номер функции | |
− | * eax = 70 - номер функции | + | :* ebx = указатель на информационную структуру |
− | * ebx = указатель на информационную структуру | ||
''Формат информационной структуры:'' | ''Формат информационной структуры:'' | ||
− | + | :* +0: dword: 9 = номер подфункции | |
− | * +0: dword: 9 = номер подфункции | + | :* +4: dword: 0 (зарезервировано) |
− | * +4: dword: 0 (зарезервировано) | + | :* +8: dword: 0 (зарезервировано) |
− | * +8: dword: 0 (зарезервировано) | + | :* +12 = +0xC: dword: 0 (зарезервировано) |
− | * +12 = +0xC: dword: 0 (зарезервировано) | + | :* +16 = +0x10: dword: 0 (зарезервировано) |
− | * +16 = +0x10: dword: 0 (зарезервировано) | + | :* +20 = +0x14: ASCIIZ-имя папки, правила формирования имён указаны в общем описании или |
− | * +20 = +0x14: ASCIIZ-имя папки, правила формирования имён указаны в общем описании или | + | :* +20 = +0x14: db 0 |
− | * +20 = +0x14: db 0 | + | :* +21 = +0x15: dd указатель на ASCIIZ-строку с именем папки |
− | * +21 = +0x15: dd указатель на ASCIIZ-строку с именем папки | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
− | + | :* eax = 0 - успешно, иначе код ошибки файловой системы | |
− | * eax = 0 - успешно, иначе код ошибки файловой системы | + | :* ebx разрушается |
− | * ebx разрушается | ||
''Замечания:'' | ''Замечания:'' | ||
+ | :* Функция не поддерживается для CD (вернётся код ошибки 2). | ||
+ | :* Родительская папка должна уже существовать. | ||
+ | :* Если папка уже существует, функция завершится успешно (eax=0). | ||
− | + | '''Константы для регистров:''' | |
− | + | ::eax - SF_FILE (70) | |
− | + | ::[ebx] - SSF_CREATE_FOLDER (9) | |
{{System_functions}} | {{System_functions}} | ||
[[Category: SysCalls]] | [[Category: SysCalls]] |
Revision as of 17:41, 22 January 2016
Функция 70 - работа с файловой системой с поддержкой длинных имён.
Параметры:
- 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
Также функция поддерживает относительные имена. Если путь начинается не с '/', то он считается относительно текущей папки. Получить или установить текущую папку можно с помощью сисфункции 30.
Для 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).
Константы для регистров:
- eax - SF_FILE (70)
- [ebx] - SSF_READ_FILE (0)
Подфункция 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: dword: атрибуты файла:
Формат времени:
- +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.
Константы для регистров:
- 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: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или
- +20 = +0x14: db 0
- +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
Возвращаемое значение:
- 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: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или
- +20 = +0x14: db 0
- +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
Возвращаемое значение:
- 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: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или
- +20 = +0x14: db 0
- +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
Возвращаемое значение:
- 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: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или
- +20 = +0x14: db 0
- +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
Возвращаемое значение:
- eax = 0 - успешно, иначе код ошибки файловой системы
- ebx разрушается
Информация о файле возвращается в формате БДВК (блока данных входа каталога), указанном в описании подфункции 1, но без имени файла (то есть первые 40 = 0x28 байт).
Замечания:
- Функция не поддерживает виртуальные папки типа /, /rd и корневые папки типа /rd/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: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или
- +20 = +0x14: db 0
- +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
Возвращаемое значение:
- 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: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или
- +20 = +0x14: db 0
- +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
Возвращаемое значение:
- 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: ASCIIZ-имя файла, правила формирования имён указаны в общем описании или
- +20 = +0x14: db 0
- +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
Возвращаемое значение:
- 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: ASCIIZ-имя папки, правила формирования имён указаны в общем описании или
- +20 = +0x14: db 0
- +21 = +0x15: dd указатель на ASCIIZ-строку с именем папки
Возвращаемое значение:
- eax = 0 - успешно, иначе код ошибки файловой системы
- ebx разрушается
Замечания:
- Функция не поддерживается для CD (вернётся код ошибки 2).
- Родительская папка должна уже существовать.
- Если папка уже существует, функция завершится успешно (eax=0).
Константы для регистров:
- eax - SF_FILE (70)
- [ebx] - SSF_CREATE_FOLDER (9)
|