Difference between revisions of "SysFn68/ru"

From KolibriOS wiki
Jump to navigation Jump to search
(Добавлена подфункция 31 (актуально в r9811).)
 
(41 intermediate revisions by 10 users not shown)
Line 1: Line 1:
'''Функция 68'''
+
'''Функция 68 - внутренние системные службы'''
 
=== Подфункция 0 - получить счётчик переключений задач. ===
 
=== Подфункция 0 - получить счётчик переключений задач. ===
  
Параметры:
+
''Параметры:''
 +
:* eax = 68 - номер функции
 +
:* ebx = 0 - номер подфункции
  
* eax = 68 - номер функции
+
''Возвращаемое значение:''
* ebx = 0 - номер подфункции
+
:* eax = число переключений задач с момента загрузки системы (по модулю 2^32)
  
Возвращаемое значение:
+
'''Константы для регистров:'''
 
+
::eax - SF_SYS_MISC (68)
* eax = число переключений задач с момента загрузки системы (по модулю 2^32)
+
::ebx - SSF_GET_TASK_SWITCH_COUNT (0)
  
 
=== Подфункция 1 - переключиться на следующий поток выполнения. ===
 
=== Подфункция 1 - переключиться на следующий поток выполнения. ===
Line 19: Line 21:
 
выполнение возобновится.
 
выполнение возобновится.
  
Параметры:
+
''Параметры:''
 
+
:* eax = 68 - номер функции
* eax = 68 - номер функции
+
:* ebx = 1 - номер подфункции
* ebx = 1 - номер подфункции
 
 
 
Возвращаемое значение:
 
  
* функция не возвращает значения
+
''Возвращаемое значение:''
 +
:* функция не возвращает значения
  
 +
'''Константы для регистров:'''
 +
::eax - SF_SYS_MISC (68)
 +
::ebx - SSF_SWITCH_TASK (1)
  
 
=== Подфункция 2 - кэш + rdpmc. ===
 
=== Подфункция 2 - кэш + rdpmc. ===
  
Параметры:
+
''Параметры:''
 
+
:* eax = 68 - номер функции
* eax = 68 - номер функции
+
:* ebx = 2 - номер подфункции
* ebx = 2 - номер подфункции
+
:* ecx = требуемое действие:
* ecx = требуемое действие:
+
:* ecx = 0 - разрешить выполнение инструкции rdpmc (ReaD Performance-Monitoring Counters)
* ecx = 0 - разрешить выполнение инструкции rdpmc (ReaD Performance-Monitoring Counters)
+
:* ecx = 1 - узнать, включён/выключен кэш
* ecx = 1 - узнать, включён/выключен кэш
+
:* ecx = 2 - включить кэш
* ecx = 2 - включить кэш
+
:* ecx = 3 - выключить кэш
* ecx = 3 - выключить кэш
 
  
Возвращаемое значение:
+
''Возвращаемое значение:''
 
+
:* для ecx=0:
* для ecx=0:
+
:** eax = значение cr4
** eax = значение cr4
+
:* для ecx=1:
* для ecx=1:
+
:** eax = (cr0 and 0x60000000):
** eax = (cr0 and 0x60000000):
+
:* eax = 0 - кэш включён
* eax = 0 - кэш включён
+
:* eax <> 0 - кэш выключен
* eax <> 0 - кэш выключен
+
:* для ecx=2 и ecx=3 функция не возвращает значения
* для ecx=2 и ecx=3 функция не возвращает значения
 
  
 +
'''Константы для регистров:'''
 +
::eax - SF_SYS_MISC (68)
 +
::ebx - SSF_PERFORMANCE (2)
 +
::ecx - SSSF_ALLOW_RDPMC (0), SSSF_CACHE_STATUS (1),
 +
:::SSSF_CACHE_ON (2), SSSF_CACHE_OFF (3)
  
 
=== Подфункция 3 - прочитать MSR-регистр. ===
 
=== Подфункция 3 - прочитать MSR-регистр. ===
Line 59: Line 65:
 
каждое семейство процессоров имеет своё подмножество MSR-регистров.
 
каждое семейство процессоров имеет своё подмножество MSR-регистров.
  
Параметры:
+
''Параметры:''
 +
:* eax = 68 - номер функции
 +
:* ebx = 3 - номер подфункции
 +
:* ecx игнорируется
 +
:* edx = адрес MSR
  
* eax = 68 - номер функции
+
''Возвращаемое значение:''
* ebx = 3 - номер подфункции
+
:* ebx:eax = старший:младший dword результата
* ecx игнорируется
 
* edx = адрес MSR
 
  
Возвращаемое значение:
+
''Замечания:''
 +
:* Указание в ecx несуществующего или нереализованного для данного процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
 +
:* Предварительно следует определить, поддерживаются ли MSR в целом, командой cpuid. Иначе возникнет уже другое исключение в ядре, которое всё равно прибьёт поток.
  
* ebx:eax = старший:младший dword результата
+
'''Константы для регистров:'''
Замечания:
+
::eax - SF_SYS_MISC (68)
 
+
::ebx - SSF_READ_MSR (3)
* Указание в ecx несуществующего или нереализованного для данного процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
 
 
 
* Предварительно следует определить, поддерживаются ли MSR в целом, командой cpuid. Иначе возникнет уже другое исключение в ядре, которое всё равно прибьёт поток.
 
  
 
=== Подфункция 4 - записать в MSR-регистр. ===
 
=== Подфункция 4 - записать в MSR-регистр. ===
Line 82: Line 89:
 
каждое семейство процессоров имеет своё подмножество MSR-регистров.
 
каждое семейство процессоров имеет своё подмножество MSR-регистров.
  
Параметры:
+
''Параметры:''
 +
:* eax = 68 - номер функции
 +
:* ebx = 4 - номер подфункции
 +
:* ecx игнорируется
 +
:* edx = адрес MSR
 +
:* esi:edi = старший:младший dword
 +
 
 +
''Возвращаемое значение:''
 +
:* функция не возвращает значения
 +
 
 +
''Замечания:''
 +
:* Указание в ecx несуществующего или нереализованного для данного процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
 +
:* Предварительно следует определить, поддерживаются ли MSR в целом, командой cpuid. Иначе возникнет уже другое исключение в ядре, которое всё равно прибьёт поток.
 +
 
 +
'''Константы для регистров:'''
 +
::eax - SF_SYS_MISC (68)
 +
::ebx - SSF_WRITE_MSR (4)
 +
 
 +
=== Подфункция 11 - вручную инициализировать кучу процесса. ===
 +
 
 +
''Параметры:''
 +
:* eax = 68 - номер функции
 +
:* ebx = 11 - номер подфункции
 +
 
 +
''Возвращаемое значение:''
 +
:* eax = 0 - неуспех
 +
:* иначе размер созданной кучи
 +
 
 +
''Замечания:''
 +
:* Вызов функции инициализирует кучу, из которой впоследствии можно выделять и освобождать блоки памяти подфункциями 12, 13 и 20.
 +
:* Если куча уже создана, функция вернёт размер существующей кучи. Размер кучи равен размеру всей свободной памяти приложения.
 +
:* После создания кучи вызовы [[SysFn64/ru|функции 64]] игнорируются.
 +
 
 +
'''Константы для регистров:'''
 +
::eax - SF_SYS_MISC (68)
 +
::ebx - SSF_HEAP_INIT (11)
 +
 
 +
=== Подфункция 12 - выделить блок памяти. ===
 +
 
 +
''Параметры:''
 +
:* eax = 68 - номер функции
 +
:* ebx = 12 - номер подфункции
 +
:* ecx = требуемый размер в байтах
 +
 
 +
''Возвращаемое значение:''
 +
:* eax = указатель на выделенный блок
 +
 
 +
''Замечания:''
 +
:* Функция выделяет целое число страниц (4 Кб) так, что фактический размер выделенного блока больше или равен запрошенному.
 +
 
 +
'''Константы для регистров:'''
 +
::eax - SF_SYS_MISC (68)
 +
::ebx - SSF_MEM_ALLOC (12)
 +
 
 +
=== Подфункция 13 - освободить блок памяти. ===
 +
 
 +
''Параметры:''
 +
:* eax = 68 - номер функции
 +
:* ebx = 13 - номер подфункции
 +
:* ecx = указатель на блок памяти
 +
 
 +
''Возвращаемое значение:''
 +
:* eax = 1 - успешно
 +
:* eax = 0 - неудача
 +
 
 +
''Замечания:''
 +
:* Блок памяти должен быть ранее выделен подфункцией 12 или подфункцией 20.
 +
 
 +
'''Константы для регистров:'''
 +
::eax - SF_SYS_MISC (68)
 +
::ebx - SSF_MEM_FREE (13)
 +
 
 +
=== Подфункция 14 - ожидать извещения от драйвера. ===
 +
 
 +
''Параметры:''
 +
:* eax = 68 - номер функции
 +
:* ebx = 14 - номер подфункции
 +
:* ecx = указатель на буфер для информации (8 байт)
 +
 
 +
''Возвращаемое значение:''
 +
:* буфер, на который указывает ecx, содержит следующую информацию:
 +
:* +0: dword: константа EV_INTR = 1
 +
:* +4: dword: данные драйвера
 +
 
 +
''Замечания:''
 +
:* Текущая реализация во время ожидания требует довольно "тяжёлых" операций переключения контекста.
 +
 
 +
'''Константы для регистров:'''
 +
::eax - SF_SYS_MISC (68)
 +
::ebx - SSF_WAIT_SIGNAL (14)
  
* eax = 68 - номер функции
+
=== Подфункция 16 - загрузить драйвер. ===
* ebx = 4 - номер подфункции
 
* ecx игнорируется
 
* edx = адрес MSR
 
* esi:edi = старший:младший dword
 
  
Возвращаемое значение:
+
''Параметры:''
 +
:* eax = 68 - номер функции
 +
:* ebx = 16 - номер подфункции
 +
:* ecx = указатель на ASCIIZ-строку с именем драйвера
  
* функция не возвращает значения
+
''Возвращаемое значение:''
 +
:* eax = 0 - неудача
 +
:* иначе eax = хэндл драйвера
  
Замечания:
+
''Замечания:''
 +
:* Если драйвер ещё не загружен, он загружается; если драйвер уже загружен, ничего не меняется.
 +
:* Имя драйвера чувствительно к регистру символов. Максимальная длина имени - 16 символов, включая завершающий нулевой символ, остальные символы игнорируются.
 +
:* Драйвер с именем ABC загружается из файла /sys/drivers/ABC.sys.
  
* Указание в ecx несуществующего или нереализованного для данного процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
+
'''Константы для регистров:'''
 +
::eax - SF_SYS_MISC (68)
 +
::ebx - SSF_LOAD_DRIVER (16)
  
* Предварительно следует определить, поддерживаются ли MSR в целом, командой cpuid. Иначе возникнет уже другое исключение в ядре, которое всё равно прибьёт поток.
+
=== Подфункция 17 - управление драйвером. ===
  
=== Подфункция 11 - инициализировать кучу процесса. ===
+
''Параметры:''
 +
:* eax = 68 - номер функции
 +
:* ebx = 17 - номер подфункции
 +
:* ecx = указатель на управляющую структуру:
 +
:** +0: dword: хэндл драйвера
 +
:** +4: dword: код функции драйвера
 +
:** +8: dword: указатель на входные данные
 +
:** +12 = +0xC: dword: размер входных данных
 +
:** +16 = +0x10: dword: указатель на выходные данные
 +
:** +20 = +0x14: dword: размер выходных данных
  
Параметры:
+
''Возвращаемое значение:''
 +
:* eax = определяется драйвером
  
* eax = 68 - номер функции
+
''Замечания:''
* ebx = 11 - номер подфункции
+
:* Коды функций и структура входных/выходных данных определяются драйвером.
 +
:* Предварительно должен быть получен хэндл драйвера подфункцией 16.
  
Возвращаемое значение:
+
'''Константы для регистров:'''
 +
::eax - SF_SYS_MISC (68)
 +
::ebx - SSF_CONTROL_DRIVER (17)
  
* eax = 0 - неуспех
+
=== Подфункция 18 - загрузить DLL с указанием кодировки. ===
* иначе размер созданной кучи
 
  
Замечания:
+
''Параметры:''
 +
:* eax = 68 - номер функции
 +
:* ebx = 18 - номер подфункции
 +
:* ecx = указатель на строку с путём к DLL
 +
:* edx = кодировка строки, подробности указаны в описании функции 80.
  
* Вызов функции инициализирует кучу, из которой впоследствии можно выделять и освобождать блоки памяти подфункциями 12 и 13. Размер кучи равен размеру всей свободной памяти приложения.
+
''Возвращаемое значение:''
 +
:* eax = 0 - неудача
 +
:* иначе eax = указатель на таблицу экспорта DLL
  
* При повторном вызове функции тем же процессом функция вернёт размер существующей кучи.
+
''Замечания:''
 +
:* Таблица экспорта представляет собой массив структур по 2 dword'а, заканчивающийся нулём. Первый dword в структуре является указателем на имя функции, второй содержит адрес функции.
  
* После создания кучи вызовы функции 64 игнорируются.
+
=== Подфункция 19 - загрузить DLL. ===
  
 +
''Параметры:''
 +
:* eax = 68 - номер функции
 +
:* ebx = 19 - номер подфункции
 +
:* ecx = указатель на строку с путём к DLL, правила формирования строки указаны в описании функции 70.
  
=== Подфункция 12 - выделить блок памяти. ===
+
''Возвращаемое значение:''
 +
:* eax = 0 - неудача
 +
:* иначе eax = указатель на таблицу экспорта DLL
  
Параметры:
+
''Замечания:''
 +
:* Таблица экспорта представляет собой массив структур по 2 dword'а, заканчивающийся нулём. Первый dword в структуре является указателем на имя функции, второй содержит адрес функции.
  
* eax = 68 - номер функции
+
'''Константы для регистров:'''
* ebx = 12 - номер подфункции
+
::eax - SF_SYS_MISC (68)
* ecx = требуемый размер в байтах
+
::ebx - SSF_LOAD_DLL (19)
  
Возвращаемое значение:
+
=== Подфункция 20 - перераспределить блок памяти. ===
  
* eax = указатель на выделенный блок
+
''Параметры:''
 +
:* eax = 68 - номер функции
 +
:* ebx = 20 - номер подфункции
 +
:* ecx = новый размер в байтах
 +
:* edx = указатель на уже выделенный блок памяти
  
Замечания:
+
''Возвращаемое значение:''
 +
:* eax = указатель на перераспределённый блок, 0 при ошибке
  
* Предварительно следует инициализировать кучу процесса вызовом подфункции 11.
+
''Замечания:''
* Функция выделяет целое число страниц (4 Кб) так, что фактический размер выделенного блока больше или равен запрошенному.
+
:* Предварительно следует инициализировать кучу процесса вызовом подфункции 11.
 +
:* Функция выделяет целое число страниц (4 Кб) так, что фактический размер выделенного блока больше или равен запрошенному.
 +
:* Если edx=0, то вызов функции эквивалентен выделению памяти подфункцией 12. В противном случае блок памяти по адресу edx должен быть ранее выделен подфункцией 12 или описываемой подфункцией.
 +
:* Если ecx=0, то функция освобождает блок памяти по адресу edx и возвращает 0.
 +
:* Содержимое памяти вплоть до наименьшего из старого и нового размеров сохраняется.
  
 +
'''Константы для регистров:'''
 +
::eax - SF_SYS_MISC (68)
 +
::ebx - SSF_MEM_REALLOC (20)
  
=== Подфункция 13 - освободить блок памяти. ===
+
=== Подфункция 21 - загрузка PE драйвера ===
  
Параметры:
+
''Параметры:''
 +
:* eax = 68 - номер функции
 +
:* ebx = 21 - номер подфункции
 +
:* ecx = указатель на ASCIIZ-строку с именем драйвера
 +
:* edx = указатель на командную строку
 +
''Возвращаемое значение:''
 +
:* eax = 0 - неудача
 +
:* иначе eax = хэндл драйвера
 +
''Замечания:''
 +
:* Если драйвер ещё не загружен, он загружается; если драйвер уже загружен, ничего не меняется.
  
* eax = 68 - номер функции
+
'''Константы для регистров:'''
* ebx = 13 - номер подфункции
+
::eax - SF_SYS_MISC (68)
* ecx = указатель на блок памяти
+
::ebx - SSF_LOAD_DRIVER_PE (21)
  
Возвращаемое значение:
+
=== Подфункция 22 - открыть именованную область памяти. ===
  
* eax = 1 - успешно
+
''Параметры:''
* eax = 0 - неудача
+
:* eax = 68 - номер функции
 +
:* ebx = 22 - номер подфункции
 +
:* ecx = указатель на имя области. Максимум 32 символа включая завершающий ноль
 +
:* edx = размер области в байтах для SHM_CREATE и SHM_OPEN_ALWAYS
 +
:* esi = флаги открытия и доступа
  
Замечания:
+
:SHM_OPEN        = 0x00
 +
:SHM_OPEN_ALWAYS = 0x04
 +
:SHM_CREATE      = 0x08
 +
:SHM_READ        = 0x00
 +
:SHM_WRITE      = 0x01
  
* Блок памяти должен быть ранее выделен подфункцией 12 или подфункцией 20.
+
:*SHM_CREATE - создать новую область памяти. Если область с таким именем уже существует функция вернёт код ошибки E_ACCESS
 +
:*SHM_OPEN_ALWAYS - открывает существующую или создаёт новую область памяти.
 +
:*SHM_OPEN - открывает существующую область памяти. Если область с таким именем не существует функция вернёт код ошибки E_NOTFOUND.
 +
:*SHM_READ - доступ только на чтение.
 +
:*SHM_WRITE - доступ на чтение и запись.
  
 +
''Возвращаемые значения:''
 +
:* eax = указатель на область памяти или ноль в случае ошибки
 +
:* edx = если новая область создаётся SHM_CREATE или SHM_OPEN_ALWAYS ноль в случае успеха или код ошибки. Если существующая область открывается SHM_OPEN или SHM_OPEN_ALWAYS размер области в байтах или код ошибки.
  
=== Подфункция 14 - ожидать извещения от драйвера. ===
+
''Коды ошибок:''
 +
:* E_NOTFOUND = 5
 +
:* E_ACCESS  = 10
 +
:* E_NOMEM    = 30
 +
:* E_PARAM    = 33
  
''Параметры'':
+
''Замечания:''
 +
:* Предварительно следует инициализировать кучу процесса вызовом подфункции 11.
 +
:* Если создаётся новая область то флаги доступа устанавливают максимальные права доступа для остальных процессов.
 +
:* Родительский процесс всегда имеет доступ на запись.
  
* eax = 68 - номер функции
+
'''Константы для регистров:'''
* ebx = 14 - номер подфункции
+
::eax - SF_SYS_MISC (68)
* ecx = указатель на буфер для информации (8 байт)
+
::ebx - SSF_MEM_OPEN (22)
  
''Возвращаемое значение'':
+
=== Подфункция 23 - закрыть именованную область памяти. ===
  
* буфер, на который указывает ecx, содержит следующую информацию:
+
''Параметры:''
* +0: dword: константа EV_INTR = 1
+
:* eax = 68 - номер функции
* +4: dword: данные драйвера
+
:* ebx = 23 - номер подфункции
 +
:* ecx = указатель на имя области. Максимум 31 символ включая завершающий ноль
  
''Замечания'':
+
''Возвращаемое значение:''
 +
:* разрушается
  
* Текущая реализация во время ожидания требует довольно "тяжёлых" операций переключения контекста.
+
''Замечания:''
 +
:* Область памяти физически освобождается (с забыванием всех данных и высвобождением физической памяти), когда её закроют все открывшие потоки.
 +
:* При завершении потока освобождаются все открытые им области памяти.
  
=== Подфункция 15 - установить обработчик исключений FPU. ===
+
'''Константы для регистров:'''
 +
::eax - SF_SYS_MISC (68)
 +
::ebx - SSF_MEM_CLOSE (23)
  
Параметры:
+
=== Подфункция 24 - установить обработчик исключений ===
  * eax = 68 - номер функции
 
  * ebx = 15 - номер подфункции
 
  * ecx = адрес нового обработчика исключений
 
Возвращаемое значение:
 
  * eax = адрес старого обработчика исключений
 
    (0, если он не был установлен)
 
  
 +
''Параметры:''
 +
:* eax = 68 - номер функции
 +
:* ebx = 24 - номер подфункции
 +
:* ecx = адрес нового обработчика исключений
 +
:* edx = маска обрабатываемых исключений
  
=== Подфункция 16 - загрузить драйвер. ===
+
''Возвращаемое значение:''
 +
:* eax = адрес старого обработчика исключений (0, если не установлен)
 +
:* ebx = маска старого обработчика исключений
  
Параметры:
+
''Замечания:''
  * eax = 68 - номер функции
+
:* Номер бита в маске исключений соответствует номеру исключения по спецификации на процессор (Intel-PC). Так, например, исключения FPU имеют номер 16 (#MF), а SSE - 19 (#XF).
  * ebx = 16 - номер подфункции
+
:* В данной реализации игнорируется запрос на перехват исключения 7 - система обрабатывает #NM самостоятельно.
  * ecx = указатель на ASCIIZ-строку с именем драйвера
+
:* Пользовательский обработчик получает номер исключения параметром в стеке. Поэтому правильный выход из обработчика: RET 4. Возврат при этом производится на команду, вызвавшую исключение.
Возвращаемое значение:
+
:* При передаче управления обработчику исключений сбрасывается соответствующий бит в маске исключений. Возникновение этого же исключения впоследствии приведёт к умолчальной обработке такового. А именно: к завершению работы приложения в отсутствии отладчика, приостановка с уведомлением отлаживающего приложения иначе.
  * eax = 0 - неудача
+
:* После завершения критических действий в обработчике пользователя восстановление бита маски данного исключения можно сделать подфункцией 25. Сброс флагов исключений в модулях FPU и XMM также возлагается на обработчик пользователя.
  * иначе eax = хэндл драйвера
 
Замечания:
 
  * Если драйвер ещё не загружен, он загружается;
 
    если драйвер уже загружен, ничего не меняется.
 
  * Имя драйвера чувствительно к регистру символов.
 
    Максимальная длина имени - 16 символов, включая завершающий
 
    нулевой символ, остальные символы игнорируются.
 
  * Драйвер с именем ABC загружается из файла /rd/1/drivers/ABC.obj.
 
  
 +
'''Константы для регистров:'''
 +
::eax - SF_SYS_MISC (68)
 +
::ebx - SSF_SET_EXCEPTION_HANDLER (24)
  
=== Подфункция 17 - управление драйвером. ===
+
=== Подфункция 25 - изменить состояние активности сигнала ===
  
Параметры:
+
''Параметры:''
  * eax = 68 - номер функции
+
:* eax = 68 - номер функции
  * ebx = 17 - номер подфункции
+
:* ebx = 25 - номер подфункции
  * ecx = указатель на управляющую структуру:
+
:* ecx = номер сигнала
    * +0: dword: хэндл драйвера
+
:* edx = значение устанавливаемой активности (0/1)
    * +4: dword: код функции драйвера
 
    * +8: dword: указатель на входные данные
 
    * +12 = +0xC: dword: размер входных данных
 
    * +16 = +0x10: dword: указатель на выходные данные
 
    * +20 = +0x14: dword: размер выходных данных
 
Возвращаемое значение:
 
  * eax = определяется драйвером
 
Замечания:
 
  * Коды функций и структура входных/выходных данных
 
    определяются драйвером.
 
  * Предварительно должен быть получен хэндл драйвера подфункцией 16.
 
  
 +
''Возвращаемое значение:''
 +
:* eax = -1 - задан неверный номер сигнала
 +
:* иначе eax = старое значение активности сигнала (0/1)
  
=== Подфункция 18 - установить обработчик исключений SSE. ===
+
''Замечания:''
 +
:* В текущей реализации изменяется только маска пользовательского обработчика исключений, установленного подфункцией 24. При этом номер сигнала соответствует номеру исключения.
  
Параметры:
+
'''Константы для регистров:'''
  * eax = 68 - номер функции
+
::eax - SF_SYS_MISC (68)
  * ebx = 18 - номер подфункции
+
::ebx - SSF_SET_EXCEPTION_STATE (25)
  * ecx = адрес нового обработчика исключений
 
Возвращаемое значение:
 
  * eax = адрес старого обработчика исключений
 
    (0, если он не был установлен)
 
  
 +
=== Подфункция 26 - освободить страницы памяти ===
  
=== Подфункция 19 - загрузить DLL. ===
+
''Параметры:''
 +
:* eax = 68 - номер функции
 +
:* ebx = 26 - номер подфункции
 +
:* ecx = указатель на блок памяти выделенный подфункцией 12
 +
:* edx = смещение от начала блока
 +
:* esi = размер высвобождаемого блока памяти, в байтах
  
Параметры:
+
''Примечания:''
  * eax = 68 - номер функции
+
:* функция освобождает страницы с ecx+edx по ecx+edx+esi и устанавливает виртуальную память в зарезервированное состояние.
  * ebx = 19 - номер подфункции
 
  * ecx = указатель на ASCIIZ-строку с полным путём к DLL
 
Возвращаемое значение:
 
  * eax = 0 - неудача
 
  * иначе eax = указатель на таблицу экспорта DLL
 
Замечания:
 
  * Таблица экспорта представляет собой массив структур по 2 dword'а,
 
    заканчивающийся нулём. Первый dword в структуре является
 
    указателем на имя функции, второй содержит адрес функции.
 
  
 +
'''Константы для регистров:'''
 +
::eax - SF_SYS_MISC (68)
 +
::ebx - SSF_MEM_FREE_EXT (26)
  
=== Подфункция 20 - перераспределить блок памяти. ===
+
=== Подфункция 27 - загрузить файл ===
  
Параметры:
+
''Параметры:''
  * eax = 68 - номер функции
+
:* eax = 68 - номер функции
  * ebx = 20 - номер подфункции
+
:* ebx = 27 - номер подфункции
  * ecx = новый размер в байтах
+
:* ecx = указатель на строку с путём к файлу, правила формирования строки указаны в описании функции 70.
  * edx = указатель на уже выделенный блок памяти
 
Возвращаемое значение:
 
  * eax = указатель на перераспределённый блок, 0 при ошибке
 
Замечания:
 
  * Предварительно следует инициализировать кучу процесса вызовом
 
    подфункции 11.
 
  * Функция выделяет целое число страниц (4 Кб) так, что фактический
 
    размер выделенного блока больше или равен запрошенному.
 
  * Если edx=0, то вызов функции эквивалентен выделению памяти
 
    подфункцией 12. В противном случае блок памяти по адресу edx
 
    должен быть ранее выделен подфункцией 12 или
 
    описываемой подфункцией.
 
  * Если ecx=0, то функция освобождает блок памяти по адресу edx и
 
    возвращает 0.
 
  * Содержимое памяти вплоть до наименьшего из старого и нового
 
    размеров сохраняется.
 
  
=== Подфункция 22 - открыть именованую область памяти. ===
+
''Возвращаемое значение:''
 +
:* eax = адрес области памяти, содержащей загруженный файл
 +
:* edx = размер файла
  
Параметры
+
''Замечания:''
  * eax = 68 - номер функции
+
:* функция загружает и, при необходимости, распаковывает файл ([[Kpack/ru|kpack]])
  * ebx = 22 - номер подфункции
+
:* Предварительно следует инициализировать кучу процесса вызовом подфункции 11.
  * ecx = имя области. Максимум 32 символа включая завершающий ноль
 
  * edx = размер области в байтах для SHM_CREATE и SHM_OPEN_ALWAYS
 
  * esi = флаги открытия и доступа
 
  
          SHM_OPEN        = 0x00
+
'''Константы для регистров:'''
          SHM_OPEN_ALWAYS = 0x04
+
::eax - SF_SYS_MISC (68)
          SHM_CREATE      = 0x08
+
::ebx - SSF_LOAD_FILE (27)
          SHM_READ        = 0x00
 
          SHM_WRITE      = 0x01
 
  
          SHM_CREATE - создать новую область памяти. Если область с
+
=== Подфункция 28 - загрузить файл с указанием кодировки ===
          таким именем уже существует функция вернёт код ошибки E_ACCESS
 
          SHM_OPEN_ALWAYS - открывает существующую или создаёт новую
 
          область памяти.
 
          SHM_OPEN - открывает существующую область памяти. Если
 
          область с таким именем не существует функция вернёт код
 
          ошибки E_NOTFOUND.
 
  
          SHM_READ - доступ только на чтение.
+
''Параметры:''
          SHM_WRITE - доступ на чтение и запись.
+
:* eax = 68 - номер функции
 +
:* ebx = 28 - номер подфункции
 +
:* ecx = указатель на строку с путём к файлу
 +
:* edx = кодировка строки, подробности указаны в описании функции 80.
  
Возвращаемые значения:
+
''Возвращаемое значение:''
  * eax = указатель на область памяти или ноль в случае ошибки
+
:* eax = указатель на загруженный файл или 0
  * edx = если новая область создаётся SHM_CREATE или SHM_OPEN_ALWAYS
+
:* edx = размер загруженного файла или 0
          ноль в случае успеха или код ошибки.
 
          если существующая область открывается SHM_OPEN или SHM_OPEN_ALWAYS
 
          размер области в байтах или код ошибки
 
  
Коды ошибок:
+
''Примечания:''
  * E_NOTFOUND =  5
+
:* функция загружает и, при необходимости, распаковывает файл ([[Kpack/ru|kpack]])
  * E_ACCESS  = 10
 
  * E_NOMEM    = 30
 
  * E_PARAM    = 33
 
  
Замечания:
+
=== Подфункция 31 - получить данные драйвера ===
  * Если создаётся новая область то флаги доступа устанавливают
 
    максимальные права доступа для остальных процессов.
 
  * Родительский процесс всегда имеет доступ на запись.
 
  
 +
''Параметры:''
 +
:* eax = 68 - номер функции
 +
:* ebx = 31 - номер подфункции
 +
:* ecx = функция (1 - получить начальные значения списка, 2 - получить элемент списка)
 +
:* edx = Если ecx=2 указатель на структуру.
 +
:* edi = Если ecx=2 указатель на память под структуру
  
=== Подфункция 23 - закрыть именованую область памяти. ===
+
''Возвращаемое значение:''
 +
:* Если ecx = 1, то
 +
:**ebx = fd
 +
:**ecx = bk
 +
:* Если ecx = 2, то
 +
:**eax = 0  операция прошла успешно
 +
:**eax = -1 ошибка
  
Параметры
+
''Примечания:''
  * eax = 68 - номер функции
+
:* возвращаемая структура
  * ebx = 23 - номер подфункции
+
:**data_service:
  * ecx = имя области. Максимум 32 символа включая завершающий ноль
+
:***.name:        rb 16
 +
:***.fd:          rd 1
 +
:***.bk:          rd 1
 +
:***.base:        rd 1
 +
:***.entry:        rd 1
 +
:***.srv_proc:    rd 1
  
Возвращаемое значение:
+
{{System_functions}}
  * не определено
+
[[Category: SysCalls]]

Latest revision as of 10:41, 10 May 2022

Функция 68 - внутренние системные службы

Подфункция 0 - получить счётчик переключений задач.

Параметры:

  • eax = 68 - номер функции
  • ebx = 0 - номер подфункции

Возвращаемое значение:

  • eax = число переключений задач с момента загрузки системы (по модулю 2^32)

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_GET_TASK_SWITCH_COUNT (0)

Подфункция 1 - переключиться на следующий поток выполнения.

Функция завершает текущий квант времени, выделенный потоку, и переключается на следующий. (Какой поток какого процесса будет следующим, предсказать нельзя). Позднее, когда до текущего потока дойдёт очередь, выполнение возобновится.

Параметры:

  • eax = 68 - номер функции
  • ebx = 1 - номер подфункции

Возвращаемое значение:

  • функция не возвращает значения

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_SWITCH_TASK (1)

Подфункция 2 - кэш + rdpmc.

Параметры:

  • eax = 68 - номер функции
  • ebx = 2 - номер подфункции
  • ecx = требуемое действие:
  • ecx = 0 - разрешить выполнение инструкции rdpmc (ReaD Performance-Monitoring Counters)
  • ecx = 1 - узнать, включён/выключен кэш
  • ecx = 2 - включить кэш
  • ecx = 3 - выключить кэш

Возвращаемое значение:

  • для ecx=0:
    • eax = значение cr4
  • для ecx=1:
    • eax = (cr0 and 0x60000000):
  • eax = 0 - кэш включён
  • eax <> 0 - кэш выключен
  • для ecx=2 и ecx=3 функция не возвращает значения

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_PERFORMANCE (2)
ecx - SSSF_ALLOW_RDPMC (0), SSSF_CACHE_STATUS (1),
SSSF_CACHE_ON (2), SSSF_CACHE_OFF (3)

Подфункция 3 - прочитать MSR-регистр.

MSR = Model Specific Register; полный список MSR-регистров процессора содержится в документации по процессору (например, IA-32 Intel Architecture Software Developer's Manual, Volume 3, Appendix B); каждое семейство процессоров имеет своё подмножество MSR-регистров.

Параметры:

  • eax = 68 - номер функции
  • ebx = 3 - номер подфункции
  • ecx игнорируется
  • edx = адрес MSR

Возвращаемое значение:

  • ebx:eax = старший:младший dword результата

Замечания:

  • Указание в ecx несуществующего или нереализованного для данного процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
  • Предварительно следует определить, поддерживаются ли MSR в целом, командой cpuid. Иначе возникнет уже другое исключение в ядре, которое всё равно прибьёт поток.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_READ_MSR (3)

Подфункция 4 - записать в MSR-регистр.

MSR = Model Specific Register; полный список MSR-регистров процессора содержится в документации по процессору (например, IA-32 Intel Architecture Software Developer's Manual, Volume 3, Appendix B); каждое семейство процессоров имеет своё подмножество MSR-регистров.

Параметры:

  • eax = 68 - номер функции
  • ebx = 4 - номер подфункции
  • ecx игнорируется
  • edx = адрес MSR
  • esi:edi = старший:младший dword

Возвращаемое значение:

  • функция не возвращает значения

Замечания:

  • Указание в ecx несуществующего или нереализованного для данного процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
  • Предварительно следует определить, поддерживаются ли MSR в целом, командой cpuid. Иначе возникнет уже другое исключение в ядре, которое всё равно прибьёт поток.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_WRITE_MSR (4)

Подфункция 11 - вручную инициализировать кучу процесса.

Параметры:

  • eax = 68 - номер функции
  • ebx = 11 - номер подфункции

Возвращаемое значение:

  • eax = 0 - неуспех
  • иначе размер созданной кучи

Замечания:

  • Вызов функции инициализирует кучу, из которой впоследствии можно выделять и освобождать блоки памяти подфункциями 12, 13 и 20.
  • Если куча уже создана, функция вернёт размер существующей кучи. Размер кучи равен размеру всей свободной памяти приложения.
  • После создания кучи вызовы функции 64 игнорируются.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_HEAP_INIT (11)

Подфункция 12 - выделить блок памяти.

Параметры:

  • eax = 68 - номер функции
  • ebx = 12 - номер подфункции
  • ecx = требуемый размер в байтах

Возвращаемое значение:

  • eax = указатель на выделенный блок

Замечания:

  • Функция выделяет целое число страниц (4 Кб) так, что фактический размер выделенного блока больше или равен запрошенному.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_MEM_ALLOC (12)

Подфункция 13 - освободить блок памяти.

Параметры:

  • eax = 68 - номер функции
  • ebx = 13 - номер подфункции
  • ecx = указатель на блок памяти

Возвращаемое значение:

  • eax = 1 - успешно
  • eax = 0 - неудача

Замечания:

  • Блок памяти должен быть ранее выделен подфункцией 12 или подфункцией 20.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_MEM_FREE (13)

Подфункция 14 - ожидать извещения от драйвера.

Параметры:

  • eax = 68 - номер функции
  • ebx = 14 - номер подфункции
  • ecx = указатель на буфер для информации (8 байт)

Возвращаемое значение:

  • буфер, на который указывает ecx, содержит следующую информацию:
  • +0: dword: константа EV_INTR = 1
  • +4: dword: данные драйвера

Замечания:

  • Текущая реализация во время ожидания требует довольно "тяжёлых" операций переключения контекста.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_WAIT_SIGNAL (14)

Подфункция 16 - загрузить драйвер.

Параметры:

  • eax = 68 - номер функции
  • ebx = 16 - номер подфункции
  • ecx = указатель на ASCIIZ-строку с именем драйвера

Возвращаемое значение:

  • eax = 0 - неудача
  • иначе eax = хэндл драйвера

Замечания:

  • Если драйвер ещё не загружен, он загружается; если драйвер уже загружен, ничего не меняется.
  • Имя драйвера чувствительно к регистру символов. Максимальная длина имени - 16 символов, включая завершающий нулевой символ, остальные символы игнорируются.
  • Драйвер с именем ABC загружается из файла /sys/drivers/ABC.sys.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_LOAD_DRIVER (16)

Подфункция 17 - управление драйвером.

Параметры:

  • eax = 68 - номер функции
  • ebx = 17 - номер подфункции
  • ecx = указатель на управляющую структуру:
    • +0: dword: хэндл драйвера
    • +4: dword: код функции драйвера
    • +8: dword: указатель на входные данные
    • +12 = +0xC: dword: размер входных данных
    • +16 = +0x10: dword: указатель на выходные данные
    • +20 = +0x14: dword: размер выходных данных

Возвращаемое значение:

  • eax = определяется драйвером

Замечания:

  • Коды функций и структура входных/выходных данных определяются драйвером.
  • Предварительно должен быть получен хэндл драйвера подфункцией 16.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_CONTROL_DRIVER (17)

Подфункция 18 - загрузить DLL с указанием кодировки.

Параметры:

  • eax = 68 - номер функции
  • ebx = 18 - номер подфункции
  • ecx = указатель на строку с путём к DLL
  • edx = кодировка строки, подробности указаны в описании функции 80.

Возвращаемое значение:

  • eax = 0 - неудача
  • иначе eax = указатель на таблицу экспорта DLL

Замечания:

  • Таблица экспорта представляет собой массив структур по 2 dword'а, заканчивающийся нулём. Первый dword в структуре является указателем на имя функции, второй содержит адрес функции.

Подфункция 19 - загрузить DLL.

Параметры:

  • eax = 68 - номер функции
  • ebx = 19 - номер подфункции
  • ecx = указатель на строку с путём к DLL, правила формирования строки указаны в описании функции 70.

Возвращаемое значение:

  • eax = 0 - неудача
  • иначе eax = указатель на таблицу экспорта DLL

Замечания:

  • Таблица экспорта представляет собой массив структур по 2 dword'а, заканчивающийся нулём. Первый dword в структуре является указателем на имя функции, второй содержит адрес функции.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_LOAD_DLL (19)

Подфункция 20 - перераспределить блок памяти.

Параметры:

  • eax = 68 - номер функции
  • ebx = 20 - номер подфункции
  • ecx = новый размер в байтах
  • edx = указатель на уже выделенный блок памяти

Возвращаемое значение:

  • eax = указатель на перераспределённый блок, 0 при ошибке

Замечания:

  • Предварительно следует инициализировать кучу процесса вызовом подфункции 11.
  • Функция выделяет целое число страниц (4 Кб) так, что фактический размер выделенного блока больше или равен запрошенному.
  • Если edx=0, то вызов функции эквивалентен выделению памяти подфункцией 12. В противном случае блок памяти по адресу edx должен быть ранее выделен подфункцией 12 или описываемой подфункцией.
  • Если ecx=0, то функция освобождает блок памяти по адресу edx и возвращает 0.
  • Содержимое памяти вплоть до наименьшего из старого и нового размеров сохраняется.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_MEM_REALLOC (20)

Подфункция 21 - загрузка PE драйвера

Параметры:

  • eax = 68 - номер функции
  • ebx = 21 - номер подфункции
  • ecx = указатель на ASCIIZ-строку с именем драйвера
  • edx = указатель на командную строку

Возвращаемое значение:

  • eax = 0 - неудача
  • иначе eax = хэндл драйвера

Замечания:

  • Если драйвер ещё не загружен, он загружается; если драйвер уже загружен, ничего не меняется.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_LOAD_DRIVER_PE (21)

Подфункция 22 - открыть именованную область памяти.

Параметры:

  • eax = 68 - номер функции
  • ebx = 22 - номер подфункции
  • ecx = указатель на имя области. Максимум 32 символа включая завершающий ноль
  • edx = размер области в байтах для SHM_CREATE и SHM_OPEN_ALWAYS
  • esi = флаги открытия и доступа
SHM_OPEN = 0x00
SHM_OPEN_ALWAYS = 0x04
SHM_CREATE = 0x08
SHM_READ = 0x00
SHM_WRITE = 0x01
  • SHM_CREATE - создать новую область памяти. Если область с таким именем уже существует функция вернёт код ошибки E_ACCESS
  • SHM_OPEN_ALWAYS - открывает существующую или создаёт новую область памяти.
  • SHM_OPEN - открывает существующую область памяти. Если область с таким именем не существует функция вернёт код ошибки E_NOTFOUND.
  • SHM_READ - доступ только на чтение.
  • SHM_WRITE - доступ на чтение и запись.

Возвращаемые значения:

  • eax = указатель на область памяти или ноль в случае ошибки
  • edx = если новая область создаётся SHM_CREATE или SHM_OPEN_ALWAYS ноль в случае успеха или код ошибки. Если существующая область открывается SHM_OPEN или SHM_OPEN_ALWAYS размер области в байтах или код ошибки.

Коды ошибок:

  • E_NOTFOUND = 5
  • E_ACCESS = 10
  • E_NOMEM = 30
  • E_PARAM = 33

Замечания:

  • Предварительно следует инициализировать кучу процесса вызовом подфункции 11.
  • Если создаётся новая область то флаги доступа устанавливают максимальные права доступа для остальных процессов.
  • Родительский процесс всегда имеет доступ на запись.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_MEM_OPEN (22)

Подфункция 23 - закрыть именованную область памяти.

Параметры:

  • eax = 68 - номер функции
  • ebx = 23 - номер подфункции
  • ecx = указатель на имя области. Максимум 31 символ включая завершающий ноль

Возвращаемое значение:

  • разрушается

Замечания:

  • Область памяти физически освобождается (с забыванием всех данных и высвобождением физической памяти), когда её закроют все открывшие потоки.
  • При завершении потока освобождаются все открытые им области памяти.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_MEM_CLOSE (23)

Подфункция 24 - установить обработчик исключений

Параметры:

  • eax = 68 - номер функции
  • ebx = 24 - номер подфункции
  • ecx = адрес нового обработчика исключений
  • edx = маска обрабатываемых исключений

Возвращаемое значение:

  • eax = адрес старого обработчика исключений (0, если не установлен)
  • ebx = маска старого обработчика исключений

Замечания:

  • Номер бита в маске исключений соответствует номеру исключения по спецификации на процессор (Intel-PC). Так, например, исключения FPU имеют номер 16 (#MF), а SSE - 19 (#XF).
  • В данной реализации игнорируется запрос на перехват исключения 7 - система обрабатывает #NM самостоятельно.
  • Пользовательский обработчик получает номер исключения параметром в стеке. Поэтому правильный выход из обработчика: RET 4. Возврат при этом производится на команду, вызвавшую исключение.
  • При передаче управления обработчику исключений сбрасывается соответствующий бит в маске исключений. Возникновение этого же исключения впоследствии приведёт к умолчальной обработке такового. А именно: к завершению работы приложения в отсутствии отладчика, приостановка с уведомлением отлаживающего приложения иначе.
  • После завершения критических действий в обработчике пользователя восстановление бита маски данного исключения можно сделать подфункцией 25. Сброс флагов исключений в модулях FPU и XMM также возлагается на обработчик пользователя.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_SET_EXCEPTION_HANDLER (24)

Подфункция 25 - изменить состояние активности сигнала

Параметры:

  • eax = 68 - номер функции
  • ebx = 25 - номер подфункции
  • ecx = номер сигнала
  • edx = значение устанавливаемой активности (0/1)

Возвращаемое значение:

  • eax = -1 - задан неверный номер сигнала
  • иначе eax = старое значение активности сигнала (0/1)

Замечания:

  • В текущей реализации изменяется только маска пользовательского обработчика исключений, установленного подфункцией 24. При этом номер сигнала соответствует номеру исключения.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_SET_EXCEPTION_STATE (25)

Подфункция 26 - освободить страницы памяти

Параметры:

  • eax = 68 - номер функции
  • ebx = 26 - номер подфункции
  • ecx = указатель на блок памяти выделенный подфункцией 12
  • edx = смещение от начала блока
  • esi = размер высвобождаемого блока памяти, в байтах

Примечания:

  • функция освобождает страницы с ecx+edx по ecx+edx+esi и устанавливает виртуальную память в зарезервированное состояние.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_MEM_FREE_EXT (26)

Подфункция 27 - загрузить файл

Параметры:

  • eax = 68 - номер функции
  • ebx = 27 - номер подфункции
  • ecx = указатель на строку с путём к файлу, правила формирования строки указаны в описании функции 70.

Возвращаемое значение:

  • eax = адрес области памяти, содержащей загруженный файл
  • edx = размер файла

Замечания:

  • функция загружает и, при необходимости, распаковывает файл (kpack)
  • Предварительно следует инициализировать кучу процесса вызовом подфункции 11.

Константы для регистров:

eax - SF_SYS_MISC (68)
ebx - SSF_LOAD_FILE (27)

Подфункция 28 - загрузить файл с указанием кодировки

Параметры:

  • eax = 68 - номер функции
  • ebx = 28 - номер подфункции
  • ecx = указатель на строку с путём к файлу
  • edx = кодировка строки, подробности указаны в описании функции 80.

Возвращаемое значение:

  • eax = указатель на загруженный файл или 0
  • edx = размер загруженного файла или 0

Примечания:

  • функция загружает и, при необходимости, распаковывает файл (kpack)

Подфункция 31 - получить данные драйвера

Параметры:

  • eax = 68 - номер функции
  • ebx = 31 - номер подфункции
  • ecx = функция (1 - получить начальные значения списка, 2 - получить элемент списка)
  • edx = Если ecx=2 указатель на структуру.
  • edi = Если ecx=2 указатель на память под структуру

Возвращаемое значение:

  • Если ecx = 1, то
    • ebx = fd
    • ecx = bk
  • Если ecx = 2, то
    • eax = 0 операция прошла успешно
    • eax = -1 ошибка

Примечания:

  • возвращаемая структура
    • data_service:
      • .name: rb 16
      • .fd: rd 1
      • .bk: rd 1
      • .base: rd 1
      • .entry: rd 1
      • .srv_proc: rd 1