Difference between revisions of "SysFn68/ru"
Punk Joker (talk | contribs) |
Vitalkrilov (talk | contribs) (Добавлена подфункция 31 (актуально в r9811).) |
||
(15 intermediate revisions by 6 users not shown) | |||
Line 3: | Line 3: | ||
''Параметры:'' | ''Параметры:'' | ||
− | + | :* eax = 68 - номер функции | |
− | * eax = 68 - номер функции | + | :* ebx = 0 - номер подфункции |
− | * ebx = 0 - номер подфункции | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
+ | :* eax = число переключений задач с момента загрузки системы (по модулю 2^32) | ||
− | + | '''Константы для регистров:''' | |
+ | ::eax - SF_SYS_MISC (68) | ||
+ | ::ebx - SSF_GET_TASK_SWITCH_COUNT (0) | ||
=== Подфункция 1 - переключиться на следующий поток выполнения. === | === Подфункция 1 - переключиться на следующий поток выполнения. === | ||
Line 20: | Line 22: | ||
''Параметры:'' | ''Параметры:'' | ||
− | + | :* 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: | ||
+ | :** 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-регистр. === | === Подфункция 3 - прочитать MSR-регистр. === | ||
Line 60: | Line 66: | ||
''Параметры:'' | ''Параметры:'' | ||
− | + | :* eax = 68 - номер функции | |
− | * eax = 68 - номер функции | + | :* ebx = 3 - номер подфункции |
− | * ebx = 3 - номер подфункции | + | :* ecx игнорируется |
− | * ecx игнорируется | + | :* edx = адрес MSR |
− | * edx = адрес MSR | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
+ | :* ebx:eax = старший:младший dword результата | ||
− | + | ''Замечания:'' | |
− | + | :* Указание в ecx несуществующего или нереализованного для данного процессора MSR повлечёт исключение в ядре, которое прибьёт поток. | |
+ | :* Предварительно следует определить, поддерживаются ли MSR в целом, командой cpuid. Иначе возникнет уже другое исключение в ядре, которое всё равно прибьёт поток. | ||
− | + | '''Константы для регистров:''' | |
− | + | ::eax - SF_SYS_MISC (68) | |
− | + | ::ebx - SSF_READ_MSR (3) | |
=== Подфункция 4 - записать в MSR-регистр. === | === Подфункция 4 - записать в MSR-регистр. === | ||
Line 83: | Line 90: | ||
''Параметры:'' | ''Параметры:'' | ||
+ | :* 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 - вручную инициализировать кучу процесса. === | |
− | |||
− | === Подфункция 11 - инициализировать кучу процесса. === | ||
''Параметры:'' | ''Параметры:'' | ||
− | + | :* eax = 68 - номер функции | |
− | * eax = 68 - номер функции | + | :* ebx = 11 - номер подфункции |
− | * ebx = 11 - номер подфункции | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
− | + | :* eax = 0 - неуспех | |
− | * eax = 0 - неуспех | + | :* иначе размер созданной кучи |
− | * иначе размер созданной кучи | ||
''Замечания:'' | ''Замечания:'' | ||
+ | :* Вызов функции инициализирует кучу, из которой впоследствии можно выделять и освобождать блоки памяти подфункциями 12, 13 и 20. | ||
+ | :* Если куча уже создана, функция вернёт размер существующей кучи. Размер кучи равен размеру всей свободной памяти приложения. | ||
+ | :* После создания кучи вызовы [[SysFn64/ru|функции 64]] игнорируются. | ||
− | + | '''Константы для регистров:''' | |
− | + | ::eax - SF_SYS_MISC (68) | |
− | + | ::ebx - SSF_HEAP_INIT (11) | |
− | |||
− | |||
− | |||
=== Подфункция 12 - выделить блок памяти. === | === Подфункция 12 - выделить блок памяти. === | ||
''Параметры:'' | ''Параметры:'' | ||
− | + | :* eax = 68 - номер функции | |
− | * eax = 68 - номер функции | + | :* ebx = 12 - номер подфункции |
− | * ebx = 12 - номер подфункции | + | :* ecx = требуемый размер в байтах |
− | * ecx = требуемый размер в байтах | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
− | + | :* eax = указатель на выделенный блок | |
− | * eax = указатель на выделенный блок | ||
''Замечания:'' | ''Замечания:'' | ||
+ | :* Функция выделяет целое число страниц (4 Кб) так, что фактический размер выделенного блока больше или равен запрошенному. | ||
− | + | '''Константы для регистров:''' | |
− | + | ::eax - SF_SYS_MISC (68) | |
− | + | ::ebx - SSF_MEM_ALLOC (12) | |
=== Подфункция 13 - освободить блок памяти. === | === Подфункция 13 - освободить блок памяти. === | ||
''Параметры:'' | ''Параметры:'' | ||
− | + | :* eax = 68 - номер функции | |
− | * eax = 68 - номер функции | + | :* ebx = 13 - номер подфункции |
− | * ebx = 13 - номер подфункции | + | :* ecx = указатель на блок памяти |
− | * ecx = указатель на блок памяти | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
− | + | :* eax = 1 - успешно | |
− | * eax = 1 - успешно | + | :* eax = 0 - неудача |
− | * eax = 0 - неудача | ||
''Замечания:'' | ''Замечания:'' | ||
+ | :* Блок памяти должен быть ранее выделен подфункцией 12 или подфункцией 20. | ||
− | + | '''Константы для регистров:''' | |
− | + | ::eax - SF_SYS_MISC (68) | |
+ | ::ebx - SSF_MEM_FREE (13) | ||
=== Подфункция 14 - ожидать извещения от драйвера. === | === Подфункция 14 - ожидать извещения от драйвера. === | ||
''Параметры:'' | ''Параметры:'' | ||
− | + | :* eax = 68 - номер функции | |
− | * eax = 68 - номер функции | + | :* ebx = 14 - номер подфункции |
− | * ebx = 14 - номер подфункции | + | :* ecx = указатель на буфер для информации (8 байт) |
− | * ecx = указатель на буфер для информации (8 байт) | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
− | + | :* буфер, на который указывает ecx, содержит следующую информацию: | |
− | * буфер, на который указывает ecx, содержит следующую информацию: | + | :* +0: dword: константа EV_INTR = 1 |
− | * +0: dword: константа EV_INTR = 1 | + | :* +4: dword: данные драйвера |
− | * +4: dword: данные драйвера | ||
''Замечания:'' | ''Замечания:'' | ||
+ | :* Текущая реализация во время ожидания требует довольно "тяжёлых" операций переключения контекста. | ||
− | + | '''Константы для регистров:''' | |
− | + | ::eax - SF_SYS_MISC (68) | |
− | + | ::ebx - SSF_WAIT_SIGNAL (14) | |
− | |||
− | '' | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
=== Подфункция 16 - загрузить драйвер. === | === Подфункция 16 - загрузить драйвер. === | ||
''Параметры:'' | ''Параметры:'' | ||
− | * eax = 68 - номер функции | + | :* eax = 68 - номер функции |
− | * ebx = 16 - номер подфункции | + | :* ebx = 16 - номер подфункции |
− | * ecx = указатель на ASCIIZ-строку с именем драйвера | + | :* ecx = указатель на ASCIIZ-строку с именем драйвера |
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
− | + | :* eax = 0 - неудача | |
− | * eax = 0 - неудача | + | :* иначе eax = хэндл драйвера |
− | * иначе eax = хэндл драйвера | ||
''Замечания:'' | ''Замечания:'' | ||
+ | :* Если драйвер ещё не загружен, он загружается; если драйвер уже загружен, ничего не меняется. | ||
+ | :* Имя драйвера чувствительно к регистру символов. Максимальная длина имени - 16 символов, включая завершающий нулевой символ, остальные символы игнорируются. | ||
+ | :* Драйвер с именем ABC загружается из файла /sys/drivers/ABC.sys. | ||
− | + | '''Константы для регистров:''' | |
− | + | ::eax - SF_SYS_MISC (68) | |
− | + | ::ebx - SSF_LOAD_DRIVER (16) | |
=== Подфункция 17 - управление драйвером. === | === Подфункция 17 - управление драйвером. === | ||
''Параметры:'' | ''Параметры:'' | ||
− | + | :* eax = 68 - номер функции | |
− | * eax = 68 - номер функции | + | :* ebx = 17 - номер подфункции |
− | * ebx = 17 - номер подфункции | + | :* ecx = указатель на управляющую структуру: |
− | * ecx = указатель на управляющую структуру: | + | :** +0: dword: хэндл драйвера |
− | ** +0: dword: хэндл драйвера | + | :** +4: dword: код функции драйвера |
− | ** +4: dword: код функции драйвера | + | :** +8: dword: указатель на входные данные |
− | ** +8: dword: указатель на входные данные | + | :** +12 = +0xC: dword: размер входных данных |
− | ** +12 = +0xC: dword: размер входных данных | + | :** +16 = +0x10: dword: указатель на выходные данные |
− | ** +16 = +0x10: dword: указатель на выходные данные | + | :** +20 = +0x14: dword: размер выходных данных |
− | ** +20 = +0x14: dword: размер выходных данных | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
− | + | :* eax = определяется драйвером | |
− | * eax = определяется драйвером | ||
''Замечания:'' | ''Замечания:'' | ||
+ | :* Коды функций и структура входных/выходных данных определяются драйвером. | ||
+ | :* Предварительно должен быть получен хэндл драйвера подфункцией 16. | ||
− | + | '''Константы для регистров:''' | |
− | + | ::eax - SF_SYS_MISC (68) | |
+ | ::ebx - SSF_CONTROL_DRIVER (17) | ||
− | === Подфункция 18 - | + | === Подфункция 18 - загрузить DLL с указанием кодировки. === |
''Параметры:'' | ''Параметры:'' | ||
− | + | :* eax = 68 - номер функции | |
− | * eax = 68 - номер функции | + | :* ebx = 18 - номер подфункции |
− | * ebx = 18 - номер подфункции | + | :* ecx = указатель на строку с путём к DLL |
− | * ecx = | + | :* edx = кодировка строки, подробности указаны в описании функции 80. |
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
+ | :* eax = 0 - неудача | ||
+ | :* иначе eax = указатель на таблицу экспорта DLL | ||
− | * | + | ''Замечания:'' |
+ | :* Таблица экспорта представляет собой массив структур по 2 dword'а, заканчивающийся нулём. Первый dword в структуре является указателем на имя функции, второй содержит адрес функции. | ||
=== Подфункция 19 - загрузить DLL. === | === Подфункция 19 - загрузить DLL. === | ||
''Параметры:'' | ''Параметры:'' | ||
− | + | :* eax = 68 - номер функции | |
− | * eax = 68 - номер функции | + | :* ebx = 19 - номер подфункции |
− | * ebx = 19 - номер подфункции | + | :* ecx = указатель на строку с путём к DLL, правила формирования строки указаны в описании функции 70. |
− | * ecx = указатель на | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
− | + | :* eax = 0 - неудача | |
− | * eax = 0 - неудача | + | :* иначе eax = указатель на таблицу экспорта DLL |
− | * иначе eax = указатель на таблицу экспорта DLL | ||
''Замечания:'' | ''Замечания:'' | ||
+ | :* Таблица экспорта представляет собой массив структур по 2 dword'а, заканчивающийся нулём. Первый dword в структуре является указателем на имя функции, второй содержит адрес функции. | ||
− | + | '''Константы для регистров:''' | |
+ | ::eax - SF_SYS_MISC (68) | ||
+ | ::ebx - SSF_LOAD_DLL (19) | ||
=== Подфункция 20 - перераспределить блок памяти. === | === Подфункция 20 - перераспределить блок памяти. === | ||
− | ''Параметры' | + | ''Параметры:'' |
− | + | :* eax = 68 - номер функции | |
− | * eax = 68 - номер функции | + | :* ebx = 20 - номер подфункции |
− | * ebx = 20 - номер подфункции | + | :* ecx = новый размер в байтах |
− | * ecx = новый размер в байтах | + | :* edx = указатель на уже выделенный блок памяти |
− | * edx = указатель на уже выделенный блок памяти | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
− | + | :* eax = указатель на перераспределённый блок, 0 при ошибке | |
− | * 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 драйвера === | === Подфункция 21 - загрузка PE драйвера === | ||
− | Параметры: | + | ''Параметры:'' |
− | * eax = 68 - номер функции | + | :* eax = 68 - номер функции |
− | * ebx = 21 - номер подфункции | + | :* ebx = 21 - номер подфункции |
− | * ecx = указатель на ASCIIZ-строку с именем драйвера | + | :* ecx = указатель на ASCIIZ-строку с именем драйвера |
− | * edx = указатель на командную строку | + | :* edx = указатель на командную строку |
− | Возвращаемое значение: | + | ''Возвращаемое значение:'' |
− | * eax = 0 - неудача | + | :* eax = 0 - неудача |
− | * иначе eax = хэндл драйвера | + | :* иначе eax = хэндл драйвера |
− | Замечания: | + | ''Замечания:'' |
− | * Если драйвер ещё не загружен, он загружается; если драйвер уже загружен, ничего не меняется. | + | :* Если драйвер ещё не загружен, он загружается; если драйвер уже загружен, ничего не меняется. |
+ | |||
+ | '''Константы для регистров:''' | ||
+ | ::eax - SF_SYS_MISC (68) | ||
+ | ::ebx - SSF_LOAD_DRIVER_PE (21) | ||
− | === Подфункция 22 - открыть | + | === Подфункция 22 - открыть именованную область памяти. === |
''Параметры:'' | ''Параметры:'' | ||
− | + | :* eax = 68 - номер функции | |
− | * eax = 68 - номер функции | + | :* ebx = 22 - номер подфункции |
− | * ebx = 22 - номер подфункции | + | :* ecx = указатель на имя области. Максимум 32 символа включая завершающий ноль |
− | * ecx = указатель на имя области. Максимум 32 символа включая завершающий ноль | + | :* edx = размер области в байтах для SHM_CREATE и SHM_OPEN_ALWAYS |
− | * edx = размер области в байтах для SHM_CREATE и SHM_OPEN_ALWAYS | + | :* esi = флаги открытия и доступа |
− | * esi = флаги открытия и доступа | ||
:SHM_OPEN = 0x00 | :SHM_OPEN = 0x00 | ||
Line 314: | Line 318: | ||
''Возвращаемые значения:'' | ''Возвращаемые значения:'' | ||
− | + | :* eax = указатель на область памяти или ноль в случае ошибки | |
− | * eax = указатель на область памяти или ноль в случае ошибки | + | :* edx = если новая область создаётся SHM_CREATE или SHM_OPEN_ALWAYS ноль в случае успеха или код ошибки. Если существующая область открывается SHM_OPEN или SHM_OPEN_ALWAYS размер области в байтах или код ошибки. |
− | * edx = если новая область создаётся SHM_CREATE или SHM_OPEN_ALWAYS ноль в случае успеха или код ошибки. Если существующая область открывается SHM_OPEN или SHM_OPEN_ALWAYS размер области в байтах или код ошибки. | ||
''Коды ошибок:'' | ''Коды ошибок:'' | ||
− | * E_NOTFOUND = 5 | + | :* E_NOTFOUND = 5 |
− | * E_ACCESS = 10 | + | :* E_ACCESS = 10 |
− | * E_NOMEM = 30 | + | :* E_NOMEM = 30 |
− | * E_PARAM = 33 | + | :* E_PARAM = 33 |
''Замечания:'' | ''Замечания:'' | ||
− | * Если создаётся новая область то флаги доступа устанавливают максимальные права доступа для остальных процессов. | + | :* Предварительно следует инициализировать кучу процесса вызовом подфункции 11. |
− | * Родительский процесс всегда имеет доступ на запись. | + | :* Если создаётся новая область то флаги доступа устанавливают максимальные права доступа для остальных процессов. |
+ | :* Родительский процесс всегда имеет доступ на запись. | ||
+ | |||
+ | '''Константы для регистров:''' | ||
+ | ::eax - SF_SYS_MISC (68) | ||
+ | ::ebx - SSF_MEM_OPEN (22) | ||
− | === Подфункция 23 - закрыть | + | === Подфункция 23 - закрыть именованную область памяти. === |
''Параметры:'' | ''Параметры:'' | ||
+ | :* eax = 68 - номер функции | ||
+ | :* ebx = 23 - номер подфункции | ||
+ | :* ecx = указатель на имя области. Максимум 31 символ включая завершающий ноль | ||
+ | |||
+ | ''Возвращаемое значение:'' | ||
+ | :* разрушается | ||
+ | |||
+ | ''Замечания:'' | ||
+ | :* Область памяти физически освобождается (с забыванием всех данных и высвобождением физической памяти), когда её закроют все открывшие потоки. | ||
+ | :* При завершении потока освобождаются все открытые им области памяти. | ||
+ | |||
+ | '''Константы для регистров:''' | ||
+ | ::eax - SF_SYS_MISC (68) | ||
+ | ::ebx - SSF_MEM_CLOSE (23) | ||
− | * eax = 68 - номер функции | + | === Подфункция 24 - установить обработчик исключений === |
− | * ebx = | + | |
− | * ecx = | + | ''Параметры:'' |
+ | :* 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 - изменить состояние активности сигнала === | === Подфункция 25 - изменить состояние активности сигнала === | ||
− | Параметры: | + | |
− | * eax = 68 - номер функции | + | ''Параметры:'' |
− | * ebx = 25 - номер подфункции | + | :* eax = 68 - номер функции |
− | * ecx = номер сигнала | + | :* ebx = 25 - номер подфункции |
− | * edx = значение устанавливаемой активности (0/1) | + | :* ecx = номер сигнала |
− | Возвращаемое значение: | + | :* edx = значение устанавливаемой активности (0/1) |
− | * eax = -1 - задан неверный номер сигнала | + | |
− | * иначе eax = старое значение активности сигнала (0/1) | + | ''Возвращаемое значение:'' |
− | Замечания: | + | :* eax = -1 - задан неверный номер сигнала |
− | * В текущей реализации изменяется только маска пользовательского обработчика исключений, установленного подфункцией 24. При этом номер сигнала соответствует номеру исключения. | + | :* иначе eax = старое значение активности сигнала (0/1) |
+ | |||
+ | ''Замечания:'' | ||
+ | :* В текущей реализации изменяется только маска пользовательского обработчика исключений, установленного подфункцией 24. При этом номер сигнала соответствует номеру исключения. | ||
+ | |||
+ | '''Константы для регистров:''' | ||
+ | ::eax - SF_SYS_MISC (68) | ||
+ | ::ebx - SSF_SET_EXCEPTION_STATE (25) | ||
=== Подфункция 26 - освободить страницы памяти === | === Подфункция 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 = | + | ''Возвращаемое значение:'' |
− | + | :* eax = адрес области памяти, содержащей загруженный файл | |
− | + | :* edx = размер файла | |
− | * edx | ||
− | |||
''Замечания:'' | ''Замечания:'' | ||
− | * | + | :* функция загружает и, при необходимости, распаковывает файл ([[Kpack/ru|kpack]]) |
+ | :* Предварительно следует инициализировать кучу процесса вызовом подфункции 11. | ||
− | === Подфункция | + | '''Константы для регистров:''' |
+ | ::eax - SF_SYS_MISC (68) | ||
+ | ::ebx - SSF_LOAD_FILE (27) | ||
+ | |||
+ | === Подфункция 28 - загрузить файл с указанием кодировки === | ||
''Параметры:'' | ''Параметры:'' | ||
+ | :* eax = 68 - номер функции | ||
+ | :* ebx = 28 - номер подфункции | ||
+ | :* ecx = указатель на строку с путём к файлу | ||
+ | :* edx = кодировка строки, подробности указаны в описании функции 80. | ||
− | * eax = 68 - номер функции | + | ''Возвращаемое значение:'' |
− | * ebx = | + | :* eax = указатель на загруженный файл или 0 |
− | * ecx = | + | :* edx = размер загруженного файла или 0 |
+ | |||
+ | ''Примечания:'' | ||
+ | :* функция загружает и, при необходимости, распаковывает файл ([[Kpack/ru|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 | ||
{{System_functions}} | {{System_functions}} | ||
[[Category: SysCalls]] | [[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 функция не возвращает значения
- для ecx=0:
Константы для регистров:
- 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 ошибка
- Если ecx = 1, то
Примечания:
- возвращаемая структура
- data_service:
- .name: rb 16
- .fd: rd 1
- .bk: rd 1
- .base: rd 1
- .entry: rd 1
- .srv_proc: rd 1
- data_service:
- возвращаемая структура
|