SysFn68/ru: Difference between revisions
No edit summary |
|||
Line 19: | Line 19: | ||
выполнение возобновится. | выполнение возобновится. | ||
Параметры: | ''Параметры:'' | ||
* eax = 68 - номер функции | * eax = 68 - номер функции | ||
* ebx = 1 - номер подфункции | * ebx = 1 - номер подфункции | ||
Возвращаемое значение: | ''Возвращаемое значение:'' | ||
* функция не возвращает значения | * функция не возвращает значения | ||
Line 31: | Line 31: | ||
=== Подфункция 2 - кэш + rdpmc. === | === Подфункция 2 - кэш + rdpmc. === | ||
Параметры: | ''Параметры:'' | ||
* eax = 68 - номер функции | * eax = 68 - номер функции | ||
Line 41: | Line 41: | ||
* ecx = 3 - выключить кэш | * ecx = 3 - выключить кэш | ||
Возвращаемое значение: | ''Возвращаемое значение:'' | ||
* для ecx=0: | * для ecx=0: | ||
Line 59: | Line 59: | ||
каждое семейство процессоров имеет своё подмножество MSR-регистров. | каждое семейство процессоров имеет своё подмножество MSR-регистров. | ||
Параметры: | ''Параметры:'' | ||
* eax = 68 - номер функции | * eax = 68 - номер функции | ||
Line 66: | Line 66: | ||
* edx = адрес MSR | * edx = адрес MSR | ||
Возвращаемое значение: | ''Возвращаемое значение:'' | ||
* ebx:eax = старший:младший dword результата | * ebx:eax = старший:младший dword результата | ||
Line 82: | Line 82: | ||
каждое семейство процессоров имеет своё подмножество MSR-регистров. | каждое семейство процессоров имеет своё подмножество MSR-регистров. | ||
Параметры: | ''Параметры:'' | ||
* eax = 68 - номер функции | * eax = 68 - номер функции | ||
Line 94: | Line 94: | ||
* функция не возвращает значения | * функция не возвращает значения | ||
Замечания: | ''Замечания:'' | ||
* Указание в ecx несуществующего или нереализованного для данного процессора MSR повлечёт исключение в ядре, которое прибьёт поток. | * Указание в ecx несуществующего или нереализованного для данного процессора MSR повлечёт исключение в ядре, которое прибьёт поток. | ||
Line 102: | Line 102: | ||
=== Подфункция 11 - инициализировать кучу процесса. === | === Подфункция 11 - инициализировать кучу процесса. === | ||
Параметры: | ''Параметры:'' | ||
* eax = 68 - номер функции | * eax = 68 - номер функции | ||
* ebx = 11 - номер подфункции | * ebx = 11 - номер подфункции | ||
Возвращаемое значение: | ''Возвращаемое значение:'' | ||
* eax = 0 - неуспех | * eax = 0 - неуспех | ||
* иначе размер созданной кучи | * иначе размер созданной кучи | ||
Замечания: | ''Замечания:'' | ||
* Вызов функции инициализирует кучу, из которой впоследствии можно выделять и освобождать блоки памяти подфункциями 12 и 13. Размер кучи равен размеру всей свободной памяти приложения. | * Вызов функции инициализирует кучу, из которой впоследствии можно выделять и освобождать блоки памяти подфункциями 12 и 13. Размер кучи равен размеру всей свободной памяти приложения. | ||
Line 123: | Line 123: | ||
=== Подфункция 12 - выделить блок памяти. === | === Подфункция 12 - выделить блок памяти. === | ||
Параметры: | ''Параметры:'' | ||
* eax = 68 - номер функции | * eax = 68 - номер функции | ||
Line 129: | Line 129: | ||
* ecx = требуемый размер в байтах | * ecx = требуемый размер в байтах | ||
Возвращаемое значение: | ''Возвращаемое значение:'' | ||
* eax = указатель на выделенный блок | * eax = указатель на выделенный блок | ||
Замечания: | ''Замечания:'' | ||
* Предварительно следует инициализировать кучу процесса вызовом подфункции 11. | * Предварительно следует инициализировать кучу процесса вызовом подфункции 11. | ||
Line 141: | Line 141: | ||
=== Подфункция 13 - освободить блок памяти. === | === Подфункция 13 - освободить блок памяти. === | ||
Параметры: | ''Параметры:'' | ||
* eax = 68 - номер функции | * eax = 68 - номер функции | ||
Line 147: | Line 147: | ||
* ecx = указатель на блок памяти | * ecx = указатель на блок памяти | ||
Возвращаемое значение: | ''Возвращаемое значение:'' | ||
* eax = 1 - успешно | * eax = 1 - успешно | ||
* eax = 0 - неудача | * eax = 0 - неудача | ||
Замечания: | ''Замечания:'' | ||
* Блок памяти должен быть ранее выделен подфункцией 12 или подфункцией 20. | * Блок памяти должен быть ранее выделен подфункцией 12 или подфункцией 20. | ||
Line 159: | Line 159: | ||
=== Подфункция 14 - ожидать извещения от драйвера. === | === Подфункция 14 - ожидать извещения от драйвера. === | ||
''Параметры:'' | |||
* eax = 68 - номер функции | * eax = 68 - номер функции | ||
Line 165: | Line 165: | ||
* ecx = указатель на буфер для информации (8 байт) | * ecx = указатель на буфер для информации (8 байт) | ||
''Возвращаемое значение'' | ''Возвращаемое значение:'' | ||
* буфер, на который указывает ecx, содержит следующую информацию: | * буфер, на который указывает ecx, содержит следующую информацию: | ||
Line 171: | Line 171: | ||
* +4: dword: данные драйвера | * +4: dword: данные драйвера | ||
''Замечания'' | ''Замечания:'' | ||
* Текущая реализация во время ожидания требует довольно "тяжёлых" операций переключения контекста. | * Текущая реализация во время ожидания требует довольно "тяжёлых" операций переключения контекста. | ||
Line 177: | Line 177: | ||
=== Подфункция 15 - установить обработчик исключений FPU. === | === Подфункция 15 - установить обработчик исключений FPU. === | ||
''Параметры'' | ''Параметры:'' | ||
* eax = 68 - номер функции | * eax = 68 - номер функции | ||
Line 183: | Line 183: | ||
* ecx = адрес нового обработчика исключений | * ecx = адрес нового обработчика исключений | ||
''Возвращаемое значение'' | ''Возвращаемое значение:'' | ||
* eax = адрес старого обработчика исключений (0, если он не был установлен) | * eax = адрес старого обработчика исключений (0, если он не был установлен) | ||
Line 189: | Line 189: | ||
=== Подфункция 16 - загрузить драйвер. === | === Подфункция 16 - загрузить драйвер. === | ||
''Параметры'' | ''Параметры:'' | ||
* eax = 68 - номер функции | * eax = 68 - номер функции | ||
* ebx = 16 - номер подфункции | * ebx = 16 - номер подфункции | ||
* ecx = указатель на ASCIIZ-строку с именем драйвера | * ecx = указатель на ASCIIZ-строку с именем драйвера | ||
''Возвращаемое значение'' | ''Возвращаемое значение:'' | ||
* eax = 0 - неудача | * eax = 0 - неудача | ||
* иначе eax = хэндл драйвера | * иначе eax = хэндл драйвера | ||
''Замечания'' | ''Замечания:'' | ||
* Если драйвер ещё не загружен, он загружается; если драйвер уже загружен, ничего не меняется. | * Если драйвер ещё не загружен, он загружается; если драйвер уже загружен, ничего не меняется. | ||
Line 207: | Line 207: | ||
=== Подфункция 17 - управление драйвером. === | === Подфункция 17 - управление драйвером. === | ||
''Параметры'' | ''Параметры:'' | ||
* eax = 68 - номер функции | * eax = 68 - номер функции | ||
Line 219: | Line 219: | ||
** +20 = +0x14: dword: размер выходных данных | ** +20 = +0x14: dword: размер выходных данных | ||
''Возвращаемое значение'' | ''Возвращаемое значение:'' | ||
* eax = определяется драйвером | * eax = определяется драйвером | ||
''Замечания'' | ''Замечания:'' | ||
* Коды функций и структура входных/выходных данных определяются драйвером. | * Коды функций и структура входных/выходных данных определяются драйвером. | ||
Line 230: | Line 230: | ||
=== Подфункция 18 - установить обработчик исключений SSE. === | === Подфункция 18 - установить обработчик исключений SSE. === | ||
''Параметры'' | ''Параметры:'' | ||
* eax = 68 - номер функции | * eax = 68 - номер функции | ||
Line 236: | Line 236: | ||
* ecx = адрес нового обработчика исключений | * ecx = адрес нового обработчика исключений | ||
''Возвращаемое значение'' | ''Возвращаемое значение:'' | ||
* eax = адрес старого обработчика исключений (0, если он не был установлен) | * eax = адрес старого обработчика исключений (0, если он не был установлен) | ||
Line 242: | Line 242: | ||
=== Подфункция 19 - загрузить DLL. === | === Подфункция 19 - загрузить DLL. === | ||
''Параметры'' | ''Параметры:'' | ||
* eax = 68 - номер функции | * eax = 68 - номер функции | ||
Line 248: | Line 248: | ||
* ecx = указатель на ASCIIZ-строку с полным путём к DLL | * ecx = указатель на ASCIIZ-строку с полным путём к DLL | ||
''Возвращаемое значение'' | ''Возвращаемое значение:'' | ||
* eax = 0 - неудача | * eax = 0 - неудача | ||
* иначе eax = указатель на таблицу экспорта DLL | * иначе eax = указатель на таблицу экспорта DLL | ||
''Замечания'' | ''Замечания:'' | ||
* Таблица экспорта представляет собой массив структур по 2 dword'а, заканчивающийся нулём. Первый dword в структуре является указателем на имя функции, второй содержит адрес функции. | * Таблица экспорта представляет собой массив структур по 2 dword'а, заканчивающийся нулём. Первый dword в структуре является указателем на имя функции, второй содержит адрес функции. | ||
Line 259: | Line 259: | ||
=== Подфункция 20 - перераспределить блок памяти. === | === Подфункция 20 - перераспределить блок памяти. === | ||
''Параметры'' | ''Параметры':' | ||
* eax = 68 - номер функции | * eax = 68 - номер функции | ||
Line 266: | Line 266: | ||
* edx = указатель на уже выделенный блок памяти | * edx = указатель на уже выделенный блок памяти | ||
''Возвращаемое значение'' | ''Возвращаемое значение:'' | ||
* eax = указатель на перераспределённый блок, 0 при ошибке | * eax = указатель на перераспределённый блок, 0 при ошибке | ||
''Замечания'' | ''Замечания:'' | ||
* Предварительно следует инициализировать кучу процесса вызовом подфункции 11. | * Предварительно следует инициализировать кучу процесса вызовом подфункции 11. | ||
Line 280: | Line 280: | ||
=== Подфункция 22 - открыть именованую область памяти. === | === Подфункция 22 - открыть именованую область памяти. === | ||
''Параметры'' | ''Параметры:'' | ||
* eax = 68 - номер функции | * eax = 68 - номер функции | ||
Line 300: | Line 300: | ||
:*SHM_WRITE - доступ на чтение и запись. | :*SHM_WRITE - доступ на чтение и запись. | ||
''Возвращаемые значения'' | ''Возвращаемые значения:'' | ||
* 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 | ||
Line 311: | Line 311: | ||
* E_PARAM = 33 | * E_PARAM = 33 | ||
''Замечания'' | ''Замечания:'' | ||
* Если создаётся новая область то флаги доступа устанавливают максимальные права доступа для остальных процессов. | * Если создаётся новая область то флаги доступа устанавливают максимальные права доступа для остальных процессов. | ||
* Родительский процесс всегда имеет доступ на запись. | * Родительский процесс всегда имеет доступ на запись. |
Revision as of 16:45, 9 April 2010
Функция 68
Подфункция 0 - получить счётчик переключений задач.
Параметры:
- eax = 68 - номер функции
- ebx = 0 - номер подфункции
Возвращаемое значение:
- eax = число переключений задач с момента загрузки системы (по модулю 2^32)
Подфункция 1 - переключиться на следующий поток выполнения.
Функция завершает текущий квант времени, выделенный потоку, и переключается на следующий. (Какой поток какого процесса будет следующим, предсказать нельзя). Позднее, когда до текущего потока дойдёт очередь, выполнение возобновится.
Параметры:
- eax = 68 - номер функции
- ebx = 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 функция не возвращает значения
Подфункция 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. Иначе возникнет уже другое исключение в ядре, которое всё равно прибьёт поток.
Подфункция 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. Иначе возникнет уже другое исключение в ядре, которое всё равно прибьёт поток.
Подфункция 11 - инициализировать кучу процесса.
Параметры:
- eax = 68 - номер функции
- ebx = 11 - номер подфункции
Возвращаемое значение:
- eax = 0 - неуспех
- иначе размер созданной кучи
Замечания:
- Вызов функции инициализирует кучу, из которой впоследствии можно выделять и освобождать блоки памяти подфункциями 12 и 13. Размер кучи равен размеру всей свободной памяти приложения.
- При повторном вызове функции тем же процессом функция вернёт размер существующей кучи.
- После создания кучи вызовы функции 64 игнорируются.
Подфункция 12 - выделить блок памяти.
Параметры:
- eax = 68 - номер функции
- ebx = 12 - номер подфункции
- ecx = требуемый размер в байтах
Возвращаемое значение:
- eax = указатель на выделенный блок
Замечания:
- Предварительно следует инициализировать кучу процесса вызовом подфункции 11.
- Функция выделяет целое число страниц (4 Кб) так, что фактический размер выделенного блока больше или равен запрошенному.
Подфункция 13 - освободить блок памяти.
Параметры:
- eax = 68 - номер функции
- ebx = 13 - номер подфункции
- ecx = указатель на блок памяти
Возвращаемое значение:
- eax = 1 - успешно
- eax = 0 - неудача
Замечания:
- Блок памяти должен быть ранее выделен подфункцией 12 или подфункцией 20.
Подфункция 14 - ожидать извещения от драйвера.
Параметры:
- eax = 68 - номер функции
- ebx = 14 - номер подфункции
- ecx = указатель на буфер для информации (8 байт)
Возвращаемое значение:
- буфер, на который указывает ecx, содержит следующую информацию:
- +0: dword: константа EV_INTR = 1
- +4: dword: данные драйвера
Замечания:
- Текущая реализация во время ожидания требует довольно "тяжёлых" операций переключения контекста.
Подфункция 15 - установить обработчик исключений FPU.
Параметры:
- eax = 68 - номер функции
- ebx = 15 - номер подфункции
- ecx = адрес нового обработчика исключений
Возвращаемое значение:
- eax = адрес старого обработчика исключений (0, если он не был установлен)
Подфункция 16 - загрузить драйвер.
Параметры:
- eax = 68 - номер функции
- ebx = 16 - номер подфункции
- ecx = указатель на ASCIIZ-строку с именем драйвера
Возвращаемое значение:
- eax = 0 - неудача
- иначе eax = хэндл драйвера
Замечания:
- Если драйвер ещё не загружен, он загружается; если драйвер уже загружен, ничего не меняется.
- Имя драйвера чувствительно к регистру символов. Максимальная длина имени - 16 символов, включая завершающий нулевой символ, остальные символы игнорируются.
- Драйвер с именем ABC загружается из файла /rd/1/drivers/ABC.obj.
Подфункция 17 - управление драйвером.
Параметры:
- eax = 68 - номер функции
- ebx = 17 - номер подфункции
- ecx = указатель на управляющую структуру:
- +0: dword: хэндл драйвера
- +4: dword: код функции драйвера
- +8: dword: указатель на входные данные
- +12 = +0xC: dword: размер входных данных
- +16 = +0x10: dword: указатель на выходные данные
- +20 = +0x14: dword: размер выходных данных
Возвращаемое значение:
- eax = определяется драйвером
Замечания:
- Коды функций и структура входных/выходных данных определяются драйвером.
- Предварительно должен быть получен хэндл драйвера подфункцией 16.
Подфункция 18 - установить обработчик исключений SSE.
Параметры:
- eax = 68 - номер функции
- ebx = 18 - номер подфункции
- ecx = адрес нового обработчика исключений
Возвращаемое значение:
- eax = адрес старого обработчика исключений (0, если он не был установлен)
Подфункция 19 - загрузить DLL.
Параметры:
- eax = 68 - номер функции
- ebx = 19 - номер подфункции
- ecx = указатель на ASCIIZ-строку с полным путём к DLL
Возвращаемое значение:
- eax = 0 - неудача
- иначе eax = указатель на таблицу экспорта DLL
Замечания:
- Таблица экспорта представляет собой массив структур по 2 dword'а, заканчивающийся нулём. Первый dword в структуре является указателем на имя функции, второй содержит адрес функции.
Подфункция 20 - перераспределить блок памяти.
Параметры':'
- eax = 68 - номер функции
- ebx = 20 - номер подфункции
- ecx = новый размер в байтах
- edx = указатель на уже выделенный блок памяти
Возвращаемое значение:
- eax = указатель на перераспределённый блок, 0 при ошибке
Замечания:
- Предварительно следует инициализировать кучу процесса вызовом подфункции 11.
- Функция выделяет целое число страниц (4 Кб) так, что фактический размер выделенного блока больше или равен запрошенному.
- Если edx=0, то вызов функции эквивалентен выделению памяти подфункцией 12. В противном случае блок памяти по адресу edx должен быть ранее выделен подфункцией 12 или описываемой подфункцией.
- Если ecx=0, то функция освобождает блок памяти по адресу edx и возвращает 0.
- Содержимое памяти вплоть до наименьшего из старого и нового размеров сохраняется.
Подфункция 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
Замечания:
- Если создаётся новая область то флаги доступа устанавливают максимальные права доступа для остальных процессов.
- Родительский процесс всегда имеет доступ на запись.
Подфункция 23 - закрыть именованую область памяти.
Параметры:
- eax = 68 - номер функции
- ebx = 23 - номер подфункции
- ecx = имя области. Максимум 32 символа включая завершающий ноль
Возвращаемое значение:
- не определено