Функция 70, подфункция 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.