forked from KolibriOS/kolibrios
actualize documentation
git-svn-id: svn://kolibrios.org@4573 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
74329e061f
commit
f406933a83
@ -462,8 +462,6 @@ cdid rd 1
|
||||
hdbase rd 1 ; for boot 0x1f0
|
||||
hdid rd 1
|
||||
hdpos rd 1 ; for boot 0x1
|
||||
label known_part dword
|
||||
fat32part rd 1 ; for boot 0x1
|
||||
cdpos rd 1
|
||||
|
||||
;CPUID information
|
||||
|
@ -816,9 +816,9 @@
|
||||
вызове, оно может измениться в последующих версиях ядра.
|
||||
|
||||
======================================================================
|
||||
======== Функция 18, подфункция 10 - свернуть окно приложения. =======
|
||||
========= Функция 18, подфункция 10 - свернуть активное окно. ========
|
||||
======================================================================
|
||||
Сворачивает собственное окно.
|
||||
Сворачивает активное окно.
|
||||
Параметры:
|
||||
* eax = 18 - номер функции
|
||||
* ebx = 10 - номер подфункции
|
||||
@ -1239,52 +1239,6 @@ dd 1675
|
||||
переменную не использует.
|
||||
* Получить язык системы можно вызовом подфункции 5 функции 26.
|
||||
|
||||
======================================================================
|
||||
=========== Функция 21, подфункция 7 - установить базу HD. ===========
|
||||
======================================================================
|
||||
База HD нужна для определения, на какой жёсткий диск писать, при
|
||||
использовании устаревшего синтаксиса /HD в устаревшей функции 58;
|
||||
при использовании современного синтаксиса /HD0,/HD1,/HD2,/HD3
|
||||
база устанавливается автоматически.
|
||||
Параметры:
|
||||
* eax = 21 - номер функции
|
||||
* ebx = 7 - номер подфункции
|
||||
* ecx = база HD: 1=IDE0, 2=IDE1, 3=IDE2, 4=IDE3
|
||||
Возвращаемое значение:
|
||||
* eax = 0
|
||||
Замечания:
|
||||
* Любое приложение в любой момент времени может изменить базу.
|
||||
* Не следует изменять базу, когда какое-нибудь приложение работает
|
||||
с жёстким диском. Если не хотите глюков системы.
|
||||
* Получить установленную базу можно вызовом подфункции 7 функции 26.
|
||||
* Следует также определить используемый раздел жёсткого диска
|
||||
подфункцией 8.
|
||||
|
||||
======================================================================
|
||||
========== Функция 21, подфункция 8 - установить раздел HD. ==========
|
||||
======================================================================
|
||||
Раздел HD нужен для определения, на какой раздел жёсткого диска
|
||||
писать, при использовании устаревшего синтаксиса /HD в устаревшей
|
||||
функции 58; при использовании современного синтаксиса
|
||||
/HD0,/HD1,/HD2,/HD3 база и раздел устанавливаются автоматически.
|
||||
Параметры:
|
||||
* eax = 21 - номер функции
|
||||
* ebx = 8 - номер подфункции
|
||||
* ecx = раздел HD (считая с 1)
|
||||
Возвращаемое значение:
|
||||
* eax = 0
|
||||
Замечания:
|
||||
* Любое приложение в любой момент времени может изменить раздел.
|
||||
* Не следует изменять раздел, когда какое-нибудь приложение работает
|
||||
с жёстким диском. Если не хотите глюков системы.
|
||||
* Получить установленный раздел можно вызовом подфункции 8
|
||||
функции 26.
|
||||
* Проверок на корректность не делается.
|
||||
* Узнать число разделов на жёстком диске можно вызовом
|
||||
подфункции 11 функции 18.
|
||||
* Следует также определить используемую базу жёсткого диска
|
||||
подфункцией 7.
|
||||
|
||||
======================================================================
|
||||
====================== Функция 21, подфункция 11 =====================
|
||||
=========== Разрешить/запретить низкоуровневый доступ к HD. ==========
|
||||
@ -1674,42 +1628,6 @@ dd 1675
|
||||
соответствующую иконку (используя описываемую функцию).
|
||||
* Установить язык системы можно вызовом подфункции 5 функции 21.
|
||||
|
||||
======================================================================
|
||||
============ Функция 26, подфункция 7 - получить базу HD. ============
|
||||
======================================================================
|
||||
База HD нужна для определения, на какой жёсткий диск писать, при
|
||||
использовании устаревшего синтаксиса /HD в устаревшей функции 58;
|
||||
при использовании современного синтаксиса /HD0,/HD1,/HD2,/HD3
|
||||
база устанавливается автоматически.
|
||||
Параметры:
|
||||
* eax = 26 - номер функции
|
||||
* ebx = 7 - номер подфункции
|
||||
Возвращаемое значение:
|
||||
* eax = база HD: 1=IDE0, 2=IDE1, 3=IDE2, 4=IDE3
|
||||
Замечания:
|
||||
* Любое приложение в любой момент времени может изменить базу.
|
||||
* Установить базу можно вызовом подфункции 7 функции 21.
|
||||
* Получить используемый раздел жёсткого диска можно подфункцией 8.
|
||||
|
||||
======================================================================
|
||||
=========== Функция 26, подфункция 8 - получить раздел HD. ===========
|
||||
======================================================================
|
||||
Раздел HD нужен для определения, на какой раздел жёсткого диска
|
||||
писать, при использовании устаревшего синтаксиса /HD в устаревшей
|
||||
функции 58; при использовании современного синтаксиса
|
||||
/HD0,/HD1,/HD2,/HD3 база и раздел устанавливаются автоматически.
|
||||
Параметры:
|
||||
* eax = 26 - номер функции
|
||||
* ebx = 8 - номер подфункции
|
||||
Возвращаемое значение:
|
||||
* eax = раздел HD (считая с 1)
|
||||
Замечания:
|
||||
* Любое приложение в любой момент времени может изменить раздел.
|
||||
* Установить раздел можно вызовом подфункции 8 функции 21.
|
||||
* Узнать число разделов на жёстком диске можно вызовом
|
||||
подфункции 11 функции 18.
|
||||
* Получить используемую базу жёсткого диска можно подфункцией 7.
|
||||
|
||||
======================================================================
|
||||
=== Функция 26, подфункция 9 - получить значение счётчика времени. ===
|
||||
======================================================================
|
||||
@ -2543,221 +2461,6 @@ dword-значение цвета 0x00RRGGBB
|
||||
* Если BIOS не поддерживает это расширение, поведение функции
|
||||
эмулируется (через аналоги подфункций функции 62 режима ядра).
|
||||
|
||||
======================================================================
|
||||
============== Функция 58 - работа с файловой системой. ==============
|
||||
======================================================================
|
||||
Параметры:
|
||||
* eax = 58
|
||||
* ebx = указатель на информационную структуру
|
||||
Возвращаемое значение:
|
||||
* eax = 0 - успешно; иначе код ошибки файловой системы
|
||||
* в зависимости от подфункции может возвращаться значение и
|
||||
в других регистрах
|
||||
Общий формат информационной структуры:
|
||||
* +0: dword: номер подфункции
|
||||
* +4: dword: номер блока
|
||||
* +8: dword: размер
|
||||
* +12 = +0xC: dword: указатель на данные
|
||||
* +16 = +0x10: dword: указатель на память для работы системы
|
||||
(4096 байт)
|
||||
* +20 = +0x14: n db: ASCIIZ-строка с именем файла
|
||||
Уточнения - в документации на соответствующую подфункцию.
|
||||
Имя файла нечувствительно к регистру латинских букв,
|
||||
русские буквы должны быть заглавными.
|
||||
Формат имени файла:
|
||||
/base/number/dir1/dir2/.../dirn/file,
|
||||
где /base/number идентифицирует устройство, на котором ищется файл:
|
||||
одно из
|
||||
* /RD/1 = /RAMDISK/1 для доступа к рамдиску
|
||||
* /FD/1 = /FLOPPYDISK/1 для доступа к первому флоппи-дисководу,
|
||||
/FD/2 = /FLOPPYDISK/2 для второго флоппи-дисковода
|
||||
* /HD/x = /HARDDISK/x - устаревший вариант доступа к жёсткому диску
|
||||
(в этом случае база определяется подфункцией 7 функции 21),
|
||||
x - номер раздела (считая с 1)
|
||||
* /HD0/x, /HD1/x, /HD2/x, /HD3/x для доступа соответственно
|
||||
к устройствам IDE0 (Primary Master), IDE1 (Primary Slave),
|
||||
IDE2 (Secondary Master), IDE3 (Secondary Slave);
|
||||
x - номер раздела на выбранном винчестере, изменяется от 1 до 255
|
||||
(на каждом из винчестеров нумерация начинается с 1)
|
||||
Замечания:
|
||||
* В первых двух случаях допускается использование FIRST вместо 1,
|
||||
SECOND вместо 2, но использовать эту возможность
|
||||
не рекомендуется для удобства перехода на будущие расширения.
|
||||
* Накладывается ограничение n<=39.
|
||||
* Имена папок и файла dir1,...,dirn,file должны быть в формате 8.3:
|
||||
имя не более 8 символов, точка, расширение не более 3 символов.
|
||||
Хвостовые пробелы игнорируются. Других пробелов быть не должно.
|
||||
Если имя занимает ровно 8 символов, точку можно опустить
|
||||
(хотя пользоваться этим не рекомендуется для удобства перехода
|
||||
на будущие расширения).
|
||||
* Функция не поддерживает папок на рамдиске.
|
||||
Примеры:
|
||||
* '/RAMDISK/FIRST/KERNEL.ASM',0
|
||||
'/rd/1/kernel.asm',0
|
||||
* '/HD0/1/kernel.asm',0
|
||||
* '/hd0/1/menuet/pics/tanzania.bmp',0
|
||||
Доступные подфункции:
|
||||
* подфункция 0 - чтение файла/папки
|
||||
* подфункция 8 - LBA-чтение с устройства
|
||||
* подфункция 15 - получение информации о файловой системе
|
||||
|
||||
======================================================================
|
||||
========== Функция 58, подфункция 0 - прочитать файл/папку. ==========
|
||||
======================================================================
|
||||
Параметры:
|
||||
* eax = 58
|
||||
* ebx = указатель на информационную структуру
|
||||
Формат информационной структуры:
|
||||
* +0: dword: 0 = номер подфункции
|
||||
* +4: dword: номер блока для чтения (считая с 0)
|
||||
* +8: dword: число блоков для чтения
|
||||
* +12 = +0xC: dword: указатель на буфер, куда будут записаны данные
|
||||
* +16 = +0x10: dword: указатель на буфер для работы системы
|
||||
(4096 байт)
|
||||
* +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
|
||||
общем описании
|
||||
Возвращаемое значение:
|
||||
* eax = 0 - успешно, иначе код ошибки файловой системы
|
||||
* ebx = размер файла (в байтах) или
|
||||
-1=0xffffffff, если файл не найден
|
||||
Замечания:
|
||||
* Размер блока - 512 байт.
|
||||
* Эта функция устарела, для чтения файлов используйте подфункцию 0
|
||||
функции 70, для чтения папок - подфункцию 1 функции 70.
|
||||
* Функция позволяет читать содержимое папки. Из файловых систем
|
||||
поддерживается только FAT. Формат FAT-папки описан в любой
|
||||
документации по FAT.
|
||||
* Размер папки определяется по размеру цепочки кластеров в FAT.
|
||||
* Если файл кончился раньше, чем был прочитан последний запрошенный
|
||||
блок, то функция прочитает, сколько сможет, после чего вернёт
|
||||
eax=6 (EOF).
|
||||
* Функция позволяет читать корневые папки /rd/1,/fd/x,/hd[n]/x, но
|
||||
в первых двух случаях текущая реализация не следует
|
||||
установленным правилам:
|
||||
для /rd/1:
|
||||
* если указано 0 блоков для чтения, считается,
|
||||
что запрашивается 1;
|
||||
* если запрашивается больше 14 блоков или начальный блок
|
||||
не меньше 14-го, то возвращается eax=5 (not found) и ebx=-1;
|
||||
* размер корневого каталога рамдиска = 14 блоков,
|
||||
0x1C00=7168 байт; но возвращается ebx=0
|
||||
(за исключением случая предыдущего пункта);
|
||||
* как ни странно, можно прочитать 14-й блок (там, вообще говоря,
|
||||
мусор - напоминаю, счёт ведётся с 0);
|
||||
* если был запрошен хотя бы один блок с номером, не меньшим 14,
|
||||
то возвращается eax=6(EOF); иначе eax=0.
|
||||
Для /fd/x:
|
||||
* если начальный блок не меньше 14-го, то возвращается
|
||||
eax=5 (not found) и ebx=0;
|
||||
* кстати говоря, формат FAT12 допускает дискеты с размером
|
||||
корневого каталога меньше или больше 14 блоков;
|
||||
* проверки длины не делается;
|
||||
* если удалось прочитать данные с дискеты, возвращается
|
||||
eax=0,ebx=0; в противном случае eax=10 (access denied), ebx=-1.
|
||||
* Функция обрабатывает чтение специальных папок /,/rd,/fd,/hd[n];
|
||||
но результат не соответствует ожидаемому
|
||||
(по работе с обычными файлами/папками), не следует установленным
|
||||
правилам, может измениться в следующих версиях ядра и потому
|
||||
не описывается. Для получения информации об оборудовании
|
||||
используйте подфункцию 11 функции 18 или
|
||||
читайте соответствующие папки подфункцией 1 функции 70.
|
||||
|
||||
======================================================================
|
||||
========= Функция 58, подфункция 8 - LBA-чтение с устройства. ========
|
||||
======================================================================
|
||||
Параметры:
|
||||
* eax = 58 - номер функции
|
||||
* ebx = указатель на информационную структуру
|
||||
Формат информационной структуры:
|
||||
* +0: dword: 8 = номер подфункции
|
||||
* +4: dword: номер блока для чтения (считая с 0)
|
||||
* +8: dword: игнорируется (устанавливайте в 1)
|
||||
* +12 = +0xC: dword: указатель на буфер, куда будут записаны данные
|
||||
(512 байт)
|
||||
* +16 = +0x10: dword: указатель на буфер для работы системы
|
||||
(4096 байт)
|
||||
* +20 = +0x14: ASCIIZ-имя устройства: нечувствительно к регистру,
|
||||
одно из /rd/1 = /RamDisk/1, /hd/n = /HardDisk/n,
|
||||
1<=n<=4 - номер устройства: 1=IDE0, ..., 4=IDE3.
|
||||
Вместо цифр допускается, хотя и не рекомендуется для удобства
|
||||
перехода на будущие расширения,
|
||||
использование 'first','second','third','fourth'.
|
||||
Возвращаемое значение:
|
||||
* если указано имя устройства /hd/xxx, где xxx не находится
|
||||
в списке выше:
|
||||
* eax = ebx = 1
|
||||
* если указано неправильное имя устройства
|
||||
(за исключением предыдущего случая):
|
||||
* eax = 5
|
||||
* ebx не меняется
|
||||
* если LBA-доступ запрещён подфункцией 11 функции 21:
|
||||
* eax = 2
|
||||
* ebx разрушается
|
||||
* для рамдиска: попытка чтения блока за пределами рамдиска
|
||||
(18*2*80 блоков) приводит к
|
||||
* eax = 3
|
||||
* ebx = 0
|
||||
* при успешном чтении:
|
||||
* eax = ebx = 0
|
||||
Замечания:
|
||||
* Размер блока - 512 байт; читается один блок.
|
||||
* Не следует полагаться на возвращаемое значение,
|
||||
оно может измениться в следующих версиях.
|
||||
* Требуется, чтобы был разрешён LBA-доступ к устройствам
|
||||
подфункцией 11 функции 21. Узнать это можно вызовом
|
||||
подфункцией 11 функции 26.
|
||||
* LBA-чтение дискеты не поддерживается.
|
||||
* Функция считывает данные физического жёсткого диска;
|
||||
если по каким-то причинам нужны данные конкретного раздела,
|
||||
придётся определять начальный сектор этого раздела
|
||||
(либо напрямую через MBR, либо из расширенной структуры,
|
||||
возвращаемой той же подфункцией 11 функции 18).
|
||||
* Функция не проверяет код ошибки жёсткого диска, так что запрос
|
||||
несуществующего сектора всё равно что-то прочитает
|
||||
(вероятнее всего, нули, но это определяется устройством) и
|
||||
это будет считаться успехом (eax=0).
|
||||
|
||||
======================================================================
|
||||
= Функция 58, подфункция 15 - получить информацию о файловой системе.
|
||||
======================================================================
|
||||
Параметры:
|
||||
* eax = 58 - номер функции
|
||||
* ebx = указатель на информационную структуру
|
||||
Формат информационной структуры:
|
||||
* +0: dword: 15 = номер подфункции
|
||||
* +4: dword: игнорируется
|
||||
* +8: dword: игнорируется
|
||||
* +12 = +0xC: dword: игнорируется
|
||||
* +16 = +0x10: dword: игнорируется
|
||||
* +20 = +0x14: (проверяется только второй символ, сразу после слэша)
|
||||
/rd=/RAMDISK или /hd=/HARDDISK
|
||||
Возвращаемое значение:
|
||||
* если второй символ не принадлежит множеству {'r','R','h','H'}:
|
||||
* eax = 3
|
||||
* ebx = ecx = dword [fileinfo] = 0
|
||||
* для рамдиска:
|
||||
* eax = 0 (успех)
|
||||
* ebx = общее число кластеров = 2847
|
||||
* ecx = число свободных кластеров
|
||||
* dword [fileinfo] = размер кластера = 512
|
||||
* для жёсткого диска: база и раздел определяются подфункциями 7 и 8
|
||||
функции 21:
|
||||
* eax = 0 (успех)
|
||||
* ebx = общее число кластеров
|
||||
* ecx = число свободных кластеров
|
||||
* dword [fileinfo] = размер кластера (в байтах)
|
||||
Замечания:
|
||||
* Не удивляйтесь странному расположению 4-го возвращаемого
|
||||
параметра - когда писался этот код, при системных вызовах
|
||||
приложению возвращались только регистры eax,ebx,ecx (из
|
||||
pushad-структуры, передающейся как аргумент системной функции).
|
||||
Теперь это исправлено, так что, возможно, имеет смысл возвращать
|
||||
размер кластера в edx, пока эту функцию не начали использовать.
|
||||
* Вообще-то ещё существует подфункция 11 функции 18, возвращающая
|
||||
информацию о файловой системе. По расширенной таблице дисковой
|
||||
подсистемы можно определить размер кластера (там он хранится
|
||||
в секторах) и общее число кластеров для жёстких дисков.
|
||||
|
||||
======================================================================
|
||||
=========== Функция 60 - Inter Process Communication (IPC). ==========
|
||||
======================================================================
|
||||
|
@ -815,9 +815,9 @@ Remarks:
|
||||
changed in future versions of the kernel.
|
||||
|
||||
======================================================================
|
||||
===== Function 18, subfunction 10 - minimize application window. =====
|
||||
======= Function 18, subfunction 10 - minimize topmost window. =======
|
||||
======================================================================
|
||||
Minimizes the own window.
|
||||
Minimizes the topmost (active) window.
|
||||
Parameters:
|
||||
* eax = 18 - function number
|
||||
* ebx = 10 - subfunction number
|
||||
@ -828,8 +828,8 @@ Remarks:
|
||||
keeps position and sizes.
|
||||
* Restoring of an application window occurs at its activation by
|
||||
subfunction 3.
|
||||
* Usually there is no necessity to minimize/restire a window
|
||||
obviously: minimization of a window is carried out by the system
|
||||
* Usually there is no necessity to minimize/restore a window
|
||||
explicitly: minimization of a window is carried out by the system
|
||||
at pressing the minimization button (for skinned windows
|
||||
it is defined automatically by function 0,
|
||||
for other windows it can be defined manually by function 8),
|
||||
@ -1238,49 +1238,6 @@ Remarks:
|
||||
use this variable.
|
||||
* To get system language use subfunction 5 of function 26.
|
||||
|
||||
======================================================================
|
||||
============== Function 21, subfunction 7 - set HD base. =============
|
||||
======================================================================
|
||||
The HD base defines hard disk to write with usage of obsolete
|
||||
syntax /HD in obsolete function 58; at usage of modern syntax
|
||||
/HD0,/HD1,/HD2,/HD3 base is set automatically.
|
||||
Parameters:
|
||||
* eax = 21 - function number
|
||||
* ebx = 7 - subfunction number
|
||||
* ecx = HD base: 1=IDE0, 2=IDE1, 3=IDE2, 4=IDE3
|
||||
Returned value:
|
||||
* eax = 0
|
||||
Remarks:
|
||||
* Any application at any time can change the base.
|
||||
* Do not change base, when any application works with hard disk.
|
||||
If you do not want system bugs.
|
||||
* To get HD base use subfunction 7 of function 26.
|
||||
* It is also necessary to define used partition of hard disk by
|
||||
subfunction 8.
|
||||
|
||||
======================================================================
|
||||
========= Function 21, subfunction 8 - set used HD partition. ========
|
||||
======================================================================
|
||||
The HD partition defines partition of the hard disk to write with
|
||||
usage of obsolete syntax /HD and obsolete function 58;
|
||||
at usage of functions 58 and 70 and modern syntax /HD0,/HD1,/HD2,/HD3
|
||||
base and partition are set automatically.
|
||||
Parameters:
|
||||
* eax = 21 - function number
|
||||
* ebx = 8 - subfunction number
|
||||
* ecx = HD partition (beginning from 1)
|
||||
Return value:
|
||||
* eax = 0
|
||||
Remarks:
|
||||
* Any application at any time can change partition.
|
||||
* Do not change partition when any application works with hard disk.
|
||||
If you do not want system bugs.
|
||||
* To get used partition use subfunction 8 of function 26.
|
||||
* There is no correctness checks.
|
||||
* To get the number of partitions of a hard disk use
|
||||
subfunction 11 of function 18.
|
||||
* It is also necessary to define used HD base by subfunction 7.
|
||||
|
||||
======================================================================
|
||||
Function 21, subfunction 11 - enable/disable low-level access to HD.
|
||||
======================================================================
|
||||
@ -1661,41 +1618,6 @@ Remarks:
|
||||
appropriate icon (using this function).
|
||||
* To set system language use subfunction 5 of function 21.
|
||||
|
||||
======================================================================
|
||||
============== Function 26, subfunction 7 - get HD base. =============
|
||||
======================================================================
|
||||
The HD base defines hard disk to write with usage of obsolete
|
||||
syntax /HD in obsolete function 58; at usage of modern syntax
|
||||
/HD0,/HD1,/HD2,/HD3 base is set automatically.
|
||||
Parameters:
|
||||
* eax = 26 - function number
|
||||
* ebx = 7 - subfunction number
|
||||
Returned value:
|
||||
* eax = HD base: 1=IDE0, 2=IDE1, 3=IDE2, 4=IDE3
|
||||
Remarks:
|
||||
* Any application in any time can change HD base.
|
||||
* To set base use subfunction 7 of function 21.
|
||||
* To get used partition of hard disk use subfunction 8.
|
||||
|
||||
======================================================================
|
||||
========= Function 26, subfunction 8 - get used HD partition. ========
|
||||
======================================================================
|
||||
The HD partition defines partition of the hard disk to write with
|
||||
usage of obsolete syntax /HD in obsolete function 58;
|
||||
at usage of functions 58 and 70 and modern syntax /HD0,/HD1,/HD2,/HD3
|
||||
base and partition are set automatically.
|
||||
Parameters:
|
||||
* eax = 26 - function number
|
||||
* ebx = 8 - subfunction number
|
||||
Returned value:
|
||||
* eax = HD partition (beginning from 1)
|
||||
Remarks:
|
||||
* Any application in any time can change partition.
|
||||
* To set partition use subfunction 8 of function 21.
|
||||
* To get number of partitions on a hard disk use
|
||||
subfunction 11 of function 18.
|
||||
* To get base of used hard disk, use subfunction 7.
|
||||
|
||||
======================================================================
|
||||
=== Function 26, subfunction 9 - get the value of the time counter. ==
|
||||
======================================================================
|
||||
@ -2315,8 +2237,7 @@ Remarks:
|
||||
Parameters:
|
||||
* eax = 48 - function number
|
||||
* ebx = 8 - subfunction number
|
||||
* ecx = pointer to a block for function 58, in
|
||||
which the fields of intermediate buffer and file name are filled
|
||||
* ecx = pointer to filename of the skin
|
||||
Returned value:
|
||||
* eax = 0 - success
|
||||
* otherwise eax = file system error code; if file does not
|
||||
@ -2526,219 +2447,6 @@ Remarks:
|
||||
* If BIOS does not support this extension, its behavior is emulated
|
||||
(through kernel-mode analogues of subfunctions of function 62).
|
||||
|
||||
======================================================================
|
||||
================ Function 58 - work with file system. ================
|
||||
======================================================================
|
||||
Parameters:
|
||||
* eax = 58
|
||||
* ebx = pointer to the information structure
|
||||
Returned value:
|
||||
* eax = 0 - success; otherwise file system error code
|
||||
* some subfunctions return value in other registers too
|
||||
General format of the information structure:
|
||||
* +0: dword: subfunction number
|
||||
* +4: dword: number of block
|
||||
* +8: dword: size
|
||||
* +12 = +0xC: dword: pointer to data
|
||||
* +16 = +0x10: dword: pointer to a memory for system operations
|
||||
(4096 bytes)
|
||||
* +20 = +0x14: n db: ASCIIZ-string with the file name
|
||||
Specifications - in documentation on the appropriate subfunction.
|
||||
Filename is case-insensitive for latin letters, russian letters
|
||||
must be capital.
|
||||
Format of filename:
|
||||
/base/number/dir1/dir2/.../dirn/file,
|
||||
where /base/number identifies device, on which file is located:
|
||||
one of
|
||||
* /RD/1 = /RAMDISK/1 to access ramdisk
|
||||
* /FD/1 = /FLOPPYDISK/1 to access first floppy drive,
|
||||
/FD/2 = /FLOPPYDISK/2 to access second one
|
||||
* /HD/x = /HARDDISK/x - obsolete variant of access to hard disk
|
||||
(in this case base is defined by subfunction 7 of function 21),
|
||||
x - partition number (beginning from 1)
|
||||
* /HD0/x, /HD1/x, /HD2/x, /HD3/x to access accordingly to devices
|
||||
IDE0 (Primary Master), IDE1 (Primary Slave),
|
||||
IDE2 (Secondary Master), IDE3 (Secondary Slave);
|
||||
x - partition number on the selected hard drive, varies from 1
|
||||
to 255 (on each hard drive the indexing starts from 1)
|
||||
Remarks:
|
||||
* In the first two cases it is also possible to use FIRST
|
||||
instead of 1, SECOND instead of 2, but it is not recommended
|
||||
for convenience of transition to the future extensions.
|
||||
* Limitation n<=39 is imposed.
|
||||
* Names of folders and file dir1,...,dirn,file must have the
|
||||
format 8.3: name no more than 8 characters, dot, extension no
|
||||
more than 3 characters. Trailing spaces are ignored, no other
|
||||
spaces is allowed. If name occupies equally 8 characters,
|
||||
dot may be omitted (though it is not recommended to use this
|
||||
feature for convenience of transition to the future extensions).
|
||||
* This function does not support folders on ramdisk.
|
||||
Examples:
|
||||
* '/RAMDISK/FIRST/KERNEL.ASM',0
|
||||
'/rd/1/kernel.asm',0
|
||||
* '/HD0/1/kernel.asm',0
|
||||
* '/hd0/1/menuet/pics/tanzania.bmp',0
|
||||
Existing subfunctions:
|
||||
* subfunction 0 - read file/folder
|
||||
* subfunction 8 - LBA-read from device
|
||||
* subfunction 15 - get file system information
|
||||
|
||||
======================================================================
|
||||
=========== Function 58, subfunction 0 - read file/folder. ===========
|
||||
======================================================================
|
||||
Parameters:
|
||||
* eax = 58
|
||||
* ebx = pointer to the information structure
|
||||
Format of the information structure:
|
||||
* +0: dword: 0 = subfunction number
|
||||
* +4: dword: first block to read (beginning from 0)
|
||||
* +8: dword: amount of blocks to read
|
||||
* +12 = +0xC: dword: pointer to buffer for data
|
||||
* +16 = +0x10: dword: pointer to buffer for system operations
|
||||
(4096 bytes)
|
||||
* +20 = +0x14: ASCIIZ-name of file, the rules of names forming are
|
||||
given in the general description
|
||||
Returned value:
|
||||
* eax = 0 - success, otherwise file system error code
|
||||
* ebx = file size (in bytes) or -1=0xffffffff, if file was not found
|
||||
Remarks:
|
||||
* Block size is 512 bytes.
|
||||
* This function is obsolete, for reading files use subfunction 0
|
||||
of function 70, for reading folders - subfunction 1 of
|
||||
function 70.
|
||||
* Function can read contents of a folder. Only FAT file system is
|
||||
supported. The format of FAT-folder is described
|
||||
in any FAT documentation.
|
||||
* Size of a folder is determined by size of FAT clusters chain.
|
||||
* If file was ended before last requested block was read,
|
||||
the function will read as many as it can, and after that return
|
||||
eax=6 (EOF).
|
||||
* Function can read root folders /rd/1,/fd/x,/hd[n]/x, but
|
||||
in the first two cases the current implementation does not follow
|
||||
to the declared rules:
|
||||
for /rd/1:
|
||||
* if one want to read 0 blocks, function considers,
|
||||
that he requested 1;
|
||||
* if one requests more than 14 blocks or starting block is
|
||||
not less than 14, function returns eax=5 (not found) and ebx=-1;
|
||||
* size of ramdisk root folder is 14 blocks,
|
||||
0x1C00=7168 bytes; but function returns ebx=0
|
||||
(except of the case of previous item);
|
||||
* strangely enough, it is possible to read 14th block (which
|
||||
generally contains a garbage - I remind, the indexing begins
|
||||
from 0);
|
||||
* if some block with the number not less than 14 was requested,
|
||||
function returns eax=6(EOF); otherwise eax=0.
|
||||
For /fd/x:
|
||||
* if the start block is not less than 14, function returns
|
||||
eax=5 (not found) and ebx=0;
|
||||
* note that format of FAT12 allows floppies with the root size
|
||||
more or less than 14 blocks;
|
||||
* check for length is not performed;
|
||||
* if data was successful read, function returns
|
||||
eax=0,ebx=0; otherwise eax=10 (access denied), ebx=-1.
|
||||
* The function handles reading of special folders /,/rd,/fd,/hd[n];
|
||||
but the result does not correspond to expected (on operations with
|
||||
normal files/folders), does not follow the declared rules,
|
||||
may be changed in future versions of the kernel and consequently
|
||||
is not described. To obtain the information about the equipment
|
||||
use subfunction 11 of function 18 or
|
||||
read corresponding folder with subfunction 1 of function 70.
|
||||
|
||||
======================================================================
|
||||
========= Function 58, subfunction 8 - LBA-read from device. =========
|
||||
======================================================================
|
||||
Parameters:
|
||||
* eax = 58 - function number
|
||||
* ebx = pointer to the information structure
|
||||
Format of the information structure:
|
||||
* +0: dword: 8 = subfunction number
|
||||
* +4: dword: number of block to read (beginning from 0)
|
||||
* +8: dword: ignored (set to 1)
|
||||
* +12 = +0xC: dword: pointer to buffer for data (512 bytes)
|
||||
* +16 = +0x10: dword: pointer to buffer for system operations
|
||||
(4096 bytes)
|
||||
* +20 = +0x14: ASCIIZ-name of device: case-insensitive, one of
|
||||
/rd/1 = /RamDisk/1, /hd/n = /HardDisk/n,
|
||||
1<=n<=4 - number of device: 1=IDE0, ..., 4=IDE3.
|
||||
Instead of digits it is allowed, though not recommended for
|
||||
convenience of transition to future extensions, to use
|
||||
'first','second','third','fourth'.
|
||||
Returned value:
|
||||
* for device name /hd/xxx, where xxx is not in the list above:
|
||||
* eax = ebx = 1
|
||||
* for invalid device name (except for the previous case):
|
||||
* eax = 5
|
||||
* ebx does not change
|
||||
* if LBA-access is disabled by subfunction 11 of function 21:
|
||||
* eax = 2
|
||||
* ebx destroyed
|
||||
* for ramdisk: attempt to read block outside ramdisk
|
||||
(18*2*80 blocks) results in
|
||||
* eax = 3
|
||||
* ebx = 0
|
||||
* for successful read:
|
||||
* eax = ebx = 0
|
||||
Remarks:
|
||||
* Block size is 512 bytes; function reads one block.
|
||||
* Do not depend on returned value, it can be changed
|
||||
in future versions.
|
||||
* Function requires that LBA-access to devices is enabled by
|
||||
subfunction 11 of function 21. To check this one can use
|
||||
subfunction 11 of function 26.
|
||||
* LBA-read of floppy is not supported.
|
||||
* Function reads data on physical hard drive; if for any reason
|
||||
data of the concrete partition are required, application must
|
||||
define starting sector of this partition (either directly
|
||||
through MBR, or from the full structure returned by
|
||||
subfunction 11 of function 18).
|
||||
* Function does not check error code of hard disk, so request of
|
||||
nonexisting sector reads something (most probably it will be
|
||||
zeroes, but this is defined by device) and this is considered
|
||||
as success (eax=0).
|
||||
|
||||
======================================================================
|
||||
==== Function 58, subfunction 15 - get information on file system. ===
|
||||
======================================================================
|
||||
Parameters:
|
||||
* eax = 58 - function number
|
||||
* ebx = pointer to the information structure
|
||||
Format of the information structure:
|
||||
* +0: dword: 15 = subfunction number
|
||||
* +4: dword: ignored
|
||||
* +8: dword: ignored
|
||||
* +12 = +0xC: dword: ignored
|
||||
* +16 = +0x10: dword: ignored
|
||||
* +20 = +0x14: (only second character is checked)
|
||||
/rd=/RAMDISK or /hd=/HARDDISK
|
||||
Returned value:
|
||||
* if the second character does not belong to set {'r','R','h','H'}:
|
||||
* eax = 3
|
||||
* ebx = ecx = dword [fileinfo] = 0
|
||||
* for ramdisk:
|
||||
* eax = 0 (success)
|
||||
* ebx = total number of clusters = 2847
|
||||
* ecx = number of free clusters
|
||||
* dword [fileinfo] = cluster size = 512
|
||||
* for hard disk: base and partition are defined by subfunctions
|
||||
7 and 8 of function 21:
|
||||
* eax = 0 (success)
|
||||
* ebx = total number of clusters
|
||||
* ecx = number of free clusters
|
||||
* dword [fileinfo] = cluster size (in bytes)
|
||||
Remarks:
|
||||
* Be not surprised to strange layout of 4th returned parameter
|
||||
- when this code was writing, at system calls application got
|
||||
only registers eax,ebx,ecx (from pushad-structure transmitted
|
||||
as argument to the system function). Now it is corrected, so,
|
||||
probably, it is meaningful to return cluster size in edx, while
|
||||
this function is not used yet.
|
||||
* There exists also subfunction 11 of function 18,
|
||||
which returns information on file system. From the full table
|
||||
of disk subsystem it is possible to deduce cluster size (there
|
||||
it is stored in sectors) and total number of clusters
|
||||
for hard disks.
|
||||
|
||||
======================================================================
|
||||
========== Function 60 - Inter Process Communication (IPC). ==========
|
||||
======================================================================
|
||||
|
@ -1955,22 +1955,8 @@ ngsyse3:
|
||||
mov [esp+32], eax
|
||||
ret
|
||||
ngsyse5:
|
||||
; cmp eax,7
|
||||
sub ebx, 2
|
||||
jnz ngsyse7
|
||||
xor eax, eax
|
||||
mov [esp+32], eax
|
||||
ret
|
||||
ngsyse7:
|
||||
; cmp eax,8
|
||||
dec ebx
|
||||
jnz ngsyse8
|
||||
mov eax, [fat32part]
|
||||
mov [esp+32], eax
|
||||
ret
|
||||
ngsyse8:
|
||||
; cmp eax,9
|
||||
dec ebx
|
||||
sub ebx, 4
|
||||
jnz ngsyse9
|
||||
mov eax, [timer_ticks];[0xfdf0]
|
||||
mov [esp+32], eax
|
||||
|
Loading…
Reference in New Issue
Block a user