KasperskyOS Community Edition 1.3

Управление процессами (низкоуровневый API task_api.h)

API определен в заголовочном файле sysroot-*-kos/include/coresrv/task/task_api.h из состава KasperskyOS SDK.

Основные возможности API:

  • создавать, запускать и завершать процессы;
  • обрабатывать исключения;
  • получать сведения о процессах, включая информацию о причинах их завершения;
  • задавать приоритеты и классы планирования начальных потоков процессов.

Сведения о функциях API приведены в таблице ниже.

Библиотека libkos также предоставляет высокоуровневый API для управления процессами, который определен в заголовочном файле sysroot-*-kos/include/kos/task.h из состава KasperskyOS SDK. Рекомендуется использовать именно этот API. Низкоуровневый API следует использовать, если недостаточно возможностей высокоуровневого API.

Создание и запуск процессов

Чтобы создать процесс, нужно вызвать функцию KnTaskCreate() или KnTaskCreateEx(). Эти функции создают "пустой" процесс, то есть процесс, в память которого не загружен ELF-образ программы. Перед запуском такого процесса нужно выполнить следующие шаги:

  1. Создать начальное значение генератора случайных чисел вызовом функции KosRandomGenerate(), которая объявлена в заголовочном файле sysroot-*-kos/include/kos/random/random_api.h из состава KasperskyOS SDK.

    Этот шаг необходим для выполнения следующего шага.

  2. Задать начальное значение генератора случайных чисел вызовом функции KnTaskReseedAslr().

    Этот шаг необходим для рандомизации размещения адресного пространства процесса. Рандомизация размещения адресного пространства (англ. Address Space Layout Randomization, ASLR) – это размещение структур данных (ELF-образа, динамических библиотек, стека и кучи) в памяти процесса по случайным адресам с целью усложнения эксплуатации уязвимостей, которые связаны с заранее известной злоумышленнику структурой адресного пространства процесса.

    Функция KnTaskReseedAslr() задает начальное значение генератора случайных чисел, который используется для автоматического выбора базового адреса выделяемого региона виртуальной памяти в таких функциях, как KnVmAllocate(), KnPmmMdlMap(), KnIoDmaMap(), KnTaskVmReserve(). Создание стека и кучи в процессе, а также загрузка динамических библиотек в его память выполняются операционной системой с использованием функции KnVmAllocate(). При этом в параметре addr указывается ноль, чтобы адрес выделенного региона виртуальной памяти был выбран автоматически, то есть был случайным значением.

  3. Стереть из памяти начальное значение генератора случайных чисел, созданное на шаге 1.

    Этот шаг необходим для целей безопасности. Чтобы выполнить этот шаг, нужно вызвать функцию RtlRandomMemSanitize(), которая объявлена в заголовочном файле sysroot-*-kos/include/rtl/random.h из состава KasperskyOS SDK.

  4. Загрузить сегменты ELF-образа в память процесса с использованием функции KnTaskLoadSeg().

    В поле loadAddr параметра seg нужно указать адрес загрузки сегмента ELF-образа. С целью поддержки ASLR (дополнительно к шагу 2) адрес загрузки сегмента ELF-образа, указанный в ELF-файле, должен быть увеличен на смещение загрузки ELF-образа. Смещение загрузки ELF-образа должно быть случайным значением. Генерацию случайного смещения загрузки ELF-образа и расчет адресов загрузки сегментов ELF-образа с учетом этого смещения выполняет функция KnElfCreateVmSegEx(), объявленная в заголовочном файле sysroot-*-kos/include/coresrv/elf/elf_api.h из состава KasperskyOS SDK.

    В результате этого шага буферы MDL, которые содержат сегменты ELF-образа, будут отображены на виртуальную память процесса.

  5. [Опционально] Загрузить таблицу символов .symtab и таблицу строк .strtab в память процесса вызовом функции KnTaskLoadElfSyms().

    Адреса загрузки сегментов ELF-образа с таблицей символов .symtab и таблицей строк .strtab должны быть рассчитаны так же, как и адреса загрузки других сегментов ELF-образа. Этот расчет выполняет функция KnElfCreateVmSegEx(), объявленная в заголовочном файле sysroot-*-kos/include/coresrv/elf/elf_api.h из состава KasperskyOS SDK.

    Используя таблицу символов .symtab и таблицу строк .strtab, ядро получает имена функций для формирования данных обратной трассировки стека (сведений о стеке вызовов).

  6. Задать точку входа в программу и смещение загрузки ELF-образа вызовом функции KnTaskSetInitialState().

    Точка входа в программу представляет собой сумму адреса, указанного в поле e_entry заголовка ELF-образа, и смещения загрузки ELF-образа. Генерацию случайного смещения загрузки ELF-образа и расчет адреса точки входа в программу с учетом этого смещения выполняет функция KnElfCreateVmSegEx(), объявленная в заголовочном файле sysroot-*-kos/include/coresrv/elf/elf_api.h из состава KasperskyOS SDK.

  7. [Опционально] Загрузить в память процесса заголовок ELF-образа вызовом функции KnTaskSetElfHdr().

    Этот шаг нужно выполнить, если требуется, чтобы данные из заголовка ELF-образа были доступны в созданном процессе.

Дескриптор процесса можно передать другому процессу через IPC.

По умолчанию начальный поток процесса является стандартным потоком исполнения, приоритет которого может принимать значения от 0 до 15. (О классах планирования потоков исполнения см. "Управление потоками исполнения (низкоуровневый API thread_api.h)".) Чтобы изменить класс планирования и/или приоритет начального потока процесса, нужно вызвать функцию KnTaskSetInitialPolicy(). Чтобы изменить приоритет начального потока процесса, нужно вызвать функцию KnTaskSetInitialThreadPriority(). Функции KnTaskSetInitialPolicy() и KnTaskSetInitialThreadPriority() можно использовать после задания точки входа в программу. Также эти функции можно использовать после запуска процесса.

Чтобы запустить процесс, нужно вызвать функцию KnTaskResume(). Запущенный процесс нельзя приостановить.

Перед запуском процесс получает данные от своего родительского процесса через страницу статических соединений. Страница статических соединений (англ. Static Connection Page, SCP) – набор структур, содержащих данные для статического создания IPC-каналов, параметры запуска и переменные окружения программы. Родительский процесс записывать данные в SCP дочернего процесса вызовом функции KnTaskSetEnv(). Дочерний процесс при запуске считывает данные из SCP вызовом функции KnTaskGetEnv(), а затем удаляет SCP вызовом функции KnTaskFreeEnv(). Все три функции не требуется явно вызывать, так как их вызовы выполняет библиотека libkos.

Завершение процессов

Завершение процесса включает в себя:

  • Завершение всех потоков процесса.
  • Освобождение памяти процесса.
  • Освобождение системных и пользовательских ресурсов, которыми процесс владеет эксклюзивно.

    При завершении процесса все дескрипторы, которыми он владеет, закрываются. Если закрытый дескриптор был единственным дескриптором ресурса, то этот ресурс освобождается.

Процесс завершается по следующим причинам:

  • По собственной инициативе.

    Вызвана функция KnTaskExit(), или завершены все потоки процесса.

  • По внешнему запросу.

    Вызвана функция KnTaskTerminate().

  • В результате необработанного исключения (аварийно).

    Вызовом функции KnTaskPanic() процесс может специально инициировать возникновение исключения, которое не может быть обработано и приводит к завершению этого процесса. Это требуется, чтобы процесс мог гарантированно завершить себя. (Например, если в процессе есть потоки исполнения, привязанные к прерываниям, то функция KnTaskExit() не может завершить этот процесс, а функция KnTaskPanic() позволяет сделать это.)

Коды завершения процессов определяются разработчиком решения на базе KasperskyOS. Эти коды нужно указывать в параметре status функции KnTaskExit(). Если процесс завершился в результате завершения всех его потоков, то кодом завершения этого процесса будет код завершения его начального потока. Чтобы получить код завершения процесса, который завершился по собственной инициативе, нужно вызвать функцию KnTaskGetExitCode().

Чтобы получить сведения о причине завершения процесса, нужно вызвать функцию KnTaskGetExitStatus(). Эта функция позволяет определить, был ли процесс завершен по собственной инициативе, по внешнему запросу или аварийно.

Чтобы получить сведения о необработанном исключении, которое привело к аварийному завершению процесса, нужно вызвать функцию KnTaskGetExceptionInfo(). Эти сведения включают код исключения и контекст потока исполнения, в котором это исключение возникло.

Если процесс создан вызовом функции KnTaskCreateEx() с флагом TaskExceptionFreezesTask в параметре flags, то в результате необработанного исключения этот процесс не завершится, а перейдет в "замороженное" состояние. "Замороженное" состояние процесса – это такое состояние процесса, при котором исполнение его потоков завершилось в результате необработанного исключения, но ресурсы не освободились, чтобы можно было получить сведения об этом процессе. Чтобы получить контекст потока исполнения, входящего в процесс, который находится в "замороженном" состоянии, нужно вызвать функцию KnTaskGetThreadContext(). Чтобы получить сведения о регионе виртуальной памяти, принадлежащем процессу, который находится в "замороженном" состоянии, нужно вызвать функцию KnTaskGetNextVmRegion(). Эти сведения включают такую информацию, как базовый адрес и размер региона виртуальной памяти, права доступа к нему. Перед переходом процесса в "замороженное" состояние выполняется вывод данных обратной трассировки стека (сведений о стеке вызовов) для потока исполнения, в котором возникло необработанное исключение. Чтобы завершить процесс, который находится в "замороженном" состоянии, нужно вызвать функцию KnTaskTerminateAfterFreezing().

Чтобы объект ядра, который описывает процесс, был удален после завершения этого процесса, нужно до или после завершения этого процесса закрыть или отозвать каждый его дескриптор во всех процессах, которые владеют этими дескрипторами. Чтобы выполнить это, нужно использовать функцию KnHandleClose() и/или KnHandleRevoke(), которые объявлены в заголовочном файле sysroot-*-kos/include/coresrv/handle/handle_api.h из состава KasperskyOS SDK.

Обработка исключений

Чтобы зарегистрировать функцию обработки исключений, нужно вызвать функцию KnTaskSetExceptionHandler(). Эта функция дерегистрирует предыдущую функцию обработки исключений и возвращает ее идентификатор. Сохранив этот идентификатор, в дальнейшем можно снова зарегистрировать предыдущую функцию обработки исключений.

Функция обработки исключений вызывается при возникновении исключения в любом потоке процесса. В случае успешной обработки исключения эта функция возвращает значение, отличное от ноля, в противном случае она возвращает ноль. Входным параметром функции обработки исключений является структура, содержащая сведения об исключении. Тип этой структуры определен в заголовочном файле sysroot-*-kos/include/thread/tcbpage.h из состава KasperskyOS SDK.

Если функции обработки исключений, зарегистрированной на уровне процесса, не удалось успешно обработать исключение, будет вызвана функция обработки исключений, зарегистрированная на уровне потока исполнения, в котором возникло это исключение. (Об обработке исключений на уровне потоков исполнения см. "Управление потоками исполнения (низкоуровневый API thread_api.h)".)

Резервирование памяти в дочернем процессе

API включает функции KnTaskVmReserve() и KnTaskVmFree(), которые позволяют соответственно резервировать и освобождать регионы виртуальной памяти в дочернем процессе, для которого еще не задана точка входа в программу. Эти функции являются только частью функциональности, нацеленной на повышение уровня контроля родительского процесса за виртуальным адресным пространством дочернего процесса. В настоящее время эта функциональность находится в разработке.

Получение адреса GSI

Общая системная информация (англ. Global System Information, GSI) – структура, содержащая системные сведения, такие как число отсчетов таймера с момента запуска ядра, число отсчетов таймера в секунду, число процессоров (вычислительных ядер) в активном состоянии, данные о процессорном кеше. Тип структуры определен в заголовочном файле sysroot-*-kos/include/task/pcbpage.h из состава KasperskyOS SDK. Получить адрес GSI позволяет функция KnTaskGetGsi(). Эта функция предназначена для использования библиотекой libc.

Получение адреса PCB

Блок управления процессом (англ. Process Control Block, PCB) – структура, содержащая сведения о процессе, которые используются ядром для управления этим процессом. Тип структуры определен в заголовочном файле sysroot-*-kos/include/task/pcbpage.h из состава KasperskyOS SDK. Получить адрес PCB позволяет функция KnTaskGetPcb(). Эта функция предназначена для использования библиотекой libc.

Сведения о функциях API

Функции task_api.h

Функция

Сведения о функции

KnTaskCreate()

Назначение

Создает процесс.

Параметры

  • [in] name – указатель на имя процесса.
  • [in] eiid – указатель на имя класса процесса.
  • [in] path – параметр, который должен иметь значение RTL_NULL.
  • [in,optional] stackSize – размер стека потока исполнения, используемый по умолчанию при создании потоков процесса, в байтах. Если указать 0, то по умолчанию стек будет иметь размер 1 МБ.
  • [in] priority – приоритет начального потока исполнения. Тип параметра определен в заголовочном файле sysroot-*-kos/include/coresrv/thread/thread_api.h из состава KasperskyOS SDK.
  • [out] outHandle – указатель на дескриптор процесса.

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

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KnTaskCreateEx()

Назначение

Создает процесс.

Параметры

  • [in] name – указатель на имя процесса.
  • [in] eiid – указатель на имя класса процесса.
  • [in] path – параметр, который должен иметь значение RTL_NULL.
  • [in,optional] stackSize – размер стека потока исполнения, используемый по умолчанию при создании потоков процесса, в байтах. Если указать 0, то по умолчанию стек будет иметь размер 1 МБ.
  • [in] priority – приоритет начального потока исполнения. Тип параметра определен в заголовочном файле sysroot-*-kos/include/coresrv/thread/thread_api.h из состава KasperskyOS SDK.
  • [in] flags – флаги, задающие параметры создания процесса.
  • [out] outHandle – указатель на дескриптор процесса.

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

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

Дополнительные сведения

В параметре flags можно указать следующие флаги:

  • TaskExceptionTerminatesTask – процесс завершается в результате необработанного исключения.
  • TaskExceptionFreezesTask – процесс переходит в "замороженное" состояние в результате необработанного исключения. Этот флаг нельзя указывать совместно с флагом TaskExceptionTerminatesTask.
  • TaskEmpty – создание "пустого" процесса. Этот флаг должен быть обязательно установлен.

KnTaskGetGsi()

Назначение

Позволяет получить адрес GSI для вызывающего процесса.

Параметры

Нет.

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

Указатель на GSI. Тип данных для хранения GSI определен в заголовочном файле sysroot-*-kos/include/task/pcbpage.h из состава KasperskyOS SDK.

KnTaskGetPcb()

Назначение

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

Параметры

Нет.

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

Указатель на PCB. Тип данных для хранения PCB определен в заголовочном файле sysroot-*-kos/include/task/pcbpage.h из состава KasperskyOS SDK.

KnTaskGetEnv()

Назначение

Позволяет получить адрес SCP вызывающего процесса.

Параметры

  • [out] envSize – указатель на размер SCP в байтах.

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

Указатель на SCP или RTL_NULL, если у процесса нет SCP.

KnTaskSetEnv()

Назначение

Записывает данные в SCP процесса.

Параметры

  • [in] task – дескриптор процесса.
  • [in] env – указатель на буфер с данными для записи в SCP.
  • [in] envSize – размер данных для записи в SCP в байтах.

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

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KnTaskFreeEnv()

Назначение

Удаляет SCP вызывающего процесса.

Параметры

Нет.

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

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KnTaskSetElfHdr()

Назначение

Записывает заголовок ELF-образа в PCB процесса.

Параметры

  • [in] h – дескриптор процесса.
  • [in] hdrData – указатель на буфер, содержащий заголовок ELF-образа.
  • [in] hdrSize – размер заголовка ELF-образа в байтах.

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

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KnTaskResume()

Назначение

Запускает процесс.

Параметры

  • [in] task – дескриптор процесса.

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

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KnTaskExit()

Назначение

Завершает вызывающий процесс.

Параметры

  • [in] status – код завершения процесса.

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

Код ошибки.

Дополнительные сведения

Не завершает процесс, если в нем есть потоки исполнения, привязанные к прерываниям.

KnTaskTerminate()

Назначение

Завершает процесс.

Параметры

  • [in] task – дескриптор процесса.

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

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KnTaskGetExitStatus()

Назначение

Позволяет получить сведения о причине завершения процесса.

Параметры

  • [in] task – дескриптор завершившегося процесса.
  • [out] status – указатель на значение, отражающее причину завершения процесса. Тип данных для хранения этого значения определен в заголовочном файле sysroot-*-kos/include/task/pcbpage.h из состава KasperskyOS SDK.

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

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

Дополнительные сведения

Через параметры status можно получить следующие значения:

  • TaskExitUnexpected – процесс завершился аварийно.
  • TaskExitNormal – процесс завершился по собственной инициативе.
  • TaskExitTerminated – процесс завершился по внешнему запросу.

KnTaskGetExceptionInfo()

Назначение

Позволяет получить сведения о необработанном исключении, которое привело к аварийному завершению процесса.

Параметры

  • [in] task – дескриптор аварийно завершившегося процесса.
  • [out] excType – указатель на код исключения, который неспецифичен для любой процессорной архитектуры. Тип данных для хранения этого кода определен в заголовочном файле sysroot-*-kos/include/hal/exc_codes.h из состава KasperskyOS SDK.
  • [out] excNo – указатель на код исключения, который специфичен для используемой процессорной архитектуры. Тип данных для хранения этого кода определен в заголовочном файле sysroot-*-kos/include/hal/exc_codes.h из состава KasperskyOS SDK.
  • [out] exceptionContext – указатель на структуру, содержащую контекст потока исполнения, в котором возникло исключение. Тип структуры определен в заголовочном файле sysroot-*-kos/include/hal/*/frame.h из состава KasperskyOS SDK.

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

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KnTaskGetThreadContext()

Назначение

Позволяет получить контекст потока исполнения, входящего в процесс, который находится в "замороженном" состоянии.

Параметры

  • [in] task – дескриптор процесса, который находится в "замороженном" состоянии.
  • [in] index – индекс потока исполнения. Используется для перечисления потоков исполнения. Нумерация начинается с нуля. Нулевой индекс имеет поток исполнения, в котором возникло необработанное исключение.
  • [out] context – указатель на структуру, содержащую идентификатор (TID) и контекст потока исполнения. Тип структуры определен в заголовочном файле sysroot-*-kos/include/thread/context.h из состава KasperskyOS SDK.

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

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KnTaskGetNextVmRegion()

Назначение

Позволяет получить сведения о регионе виртуальной памяти, принадлежащем процессу, который находится в "замороженном" состоянии.

Параметры

  • [in] task – дескриптор процесса, который находится в "замороженном" состоянии.
  • [in] after – адрес, после которого размещен регион виртуальной памяти.
  • [out] next – указатель на базовый адрес региона виртуальной памяти.
  • [out] size – указатель на размер региона виртуальной памяти в байтах.
  • [out] flags – указатель на флаги, отражающие параметры региона виртуальной памяти. Флаги определены в заголовочном файле sysroot-*-kos/include/vmm/flags.h из состава KasperskyOS SDK.
  • [out] outHandle – указатель на дескриптор буфера MDL, отображенного на регион виртуальной памяти. Функция KnTaskGetNextVmRegion() создает буфер MDL из физической памяти, отображенной на регион виртуальной памяти (даже если уже существует буфер MDL, который отображен на этот регион виртуальной памяти).

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

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KnTaskTerminateAfterFreezing()

Назначение

Завершает процесс, который находится в "замороженном" состоянии.

Параметры

  • [in] task – дескриптор процесса, который находится в "замороженном" состоянии.

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

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KnTaskGetExitCode()

Назначение

Позволяет получить код завершения процесса, который завершился по собственной инициативе.

Параметры

  • [in] task – дескриптор завершившегося процесса.
  • [out] exitCode – указатель на код завершения процесса.

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

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KnTaskGetId()

Назначение

Позволяет получить идентификатор процесса (PID) для вызывающего процесса.

Параметры

Нет.

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

Идентификатор процесса. Тип идентификатора определен в заголовочном файле sysroot-*-kos/include/task/pidtype.h из KasperskyOS SDK.

KnTaskGetName()

Назначение

Позволяет получить имя вызывающего процесса.

Параметры

  • [out] name – указатель на буфер для сохранения имени процесса.
  • [in] msize – размер буфера для сохранения имени процесса в байтах.

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

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KnTaskGetPath()

Назначение

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

Параметры

  • [out] path – указатель на буфер для сохранения имени исполняемого файла.
  • [in] msize – размер буфера для сохранения имени исполняемого файла в байтах.

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

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KnTaskGetInitialThreadPriority()

Назначение

Позволяет получить приоритет начального потока процесса.

Параметры

  • [in] task – дескриптор процесса.
  • [out] priority – указатель на приоритет начального потока процесса. Тип данных для хранения приоритета потока исполнения определен в заголовочном файле sysroot-*-kos/include/coresrv/thread/thread_api.h из состава KasperskyOS SDK.

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

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KnTaskSetInitialThreadPriority()

Назначение

Задает приоритет начального потока процесса.

Параметры

  • [in] task – дескриптор процесса.
  • [in] priority – приоритет начального потока процесса. Тип параметра определен в заголовочном файле sysroot-*-kos/include/coresrv/thread/thread_api.h из состава KasperskyOS SDK.

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

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KnTaskSetExceptionHandler()

Назначение

Регистрирует функцию обработки исключений для вызывающего процесса.

Параметры

  • [in,optional] handler – идентификатор функции обработки исключений или RTL_NULL, чтобы дерегистрировать предыдущую зарегистрированную функцию без регистрации новой. Тип параметра определен в заголовочном файле sysroot-*-kos/include/task/pcbpage.h из состава KasperskyOS SDK.

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

Идентификатор предыдущей зарегистрированной функции обработки исключений или RTL_NULL при ее отсутствии. Тип возвращаемого значения определен в заголовочном файле sysroot-*-kos/include/task/pcbpage.h из состава KasperskyOS SDK.

KnTaskLoadSeg()

Назначение

Загружает сегмент ELF-образа в память процесса.

Параметры

  • [in] h – дескриптор процесса.
  • [in] seg – указатель на структуру, описывающую сегмент ELF-образа. Если задать поле loadAddr этой структуры равным 0, то адрес загрузки сегмента ELF-образа будет выбран автоматически. Тип структуры определен в заголовочном файле sysroot-*-kos/include/coresrv/vmm/vmm_types.h из состава KasperskyOS SDK.
  • [out] actual – указатель на адрес загрузки сегмента ELF-образа.

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

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KnTaskVmReserve()

Назначение

Резервирует регион виртуальной памяти в процессе.

Параметры

  • [in] task – дескриптор процесса.
  • [in,optional] hint – странично выровненный желаемый базовый адрес региона виртуальной памяти или RTL_NULL, чтобы этот адрес был выбран автоматически.
  • [in] size – размер региона виртуальной памяти в байтах.
  • [in] flags – флаги, задающие параметры региона виртуальной памяти. Флаги определены в заголовочном файле sysroot-*-kos/include/vmm/flags.h из состава KasperskyOS SDK.
  • [out] addr – указатель на базовый адрес зарезервированного региона виртуальной памяти.

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

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

Дополнительные сведения

В параметре flags можно указать следующие флаги:

  • VMM_FLAG_LOCKED – фиксация региона виртуальной памяти с выделением всего требуемого объема физической памяти. При вызове функции KnTaskVmReserve() с этим флагом фиксация не выполняется. Этот флаг имеет эффект при последующих действиях с зарезервированным регионом виртуальной памяти, которые связаны с его фиксацией.
  • VMM_FLAG_READ, VMM_FLAG_WRITE, VMM_FLAG_EXECUTE и VMM_FLAG_RWX_MASK – флаги, задающие права доступа к региону виртуальной памяти.
  • VMM_FLAG_LOW_GUARD, VMM_FLAG_HIGH_GUARD – добавление охранной страницы в начало и конец региона виртуальной памяти соответственно. Размер охранной страницы не включается в размер региона виртуальной памяти.

Допустимые комбинации флагов, задающих права доступа к региону виртуальной памяти:

  • VMM_FLAG_READ – доступ на чтение.
  • VMM_FLAG_READ | VMM_FLAG_WRITE – доступ на чтение и запись.
  • VMM_FLAG_READ | VMM_FLAG_EXECUTE – доступ на чтение и исполнение.
  • VMM_FLAG_RWX_MASK или VMM_FLAG_READ | VMM_FLAG_WRITE | VMM_FLAG_EXECUTE – доступ на чтение, запись и исполнение.

KnTaskVmFree()

Назначение

Освобождает регион виртуальной памяти, зарезервированный вызовом функции KnTaskVmReserve().

Параметры

  • [in] task – дескриптор процесса.
  • [in] base – странично выровненный базовый адрес региона виртуальной памяти.
  • [in] size – размер региона виртуальной памяти в байтах.

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

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KnTaskSetInitialState()

Назначение

Задает точку входа в программу и смещение загрузки ELF-образа.

Параметры

  • [in] h – дескриптор процесса.
  • [in] state – указатель на структуру, содержащую адрес точки входа в программу и смещение загрузки ELF-образа в байтах.

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

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KnTaskLoadElfSyms()

Назначение

Загружает таблицу символов .symtab и таблицу строк .strtab в память процесса.

Параметры

  • [in] h – дескриптор процесса.
  • [in] symTabSeg – указатель на структуру, описывающую сегмент ELF-образа с таблицей символов .symtab. Тип структуры определен в заголовочном файле sysroot-*-kos/include/coresrv/vmm/vmm_types.h из состава KasperskyOS SDK.
  • [in] symTabSize – размер таблицы символов .symtab в байтах.
  • [in] strTabSeg – указатель на структуру, описывающую сегмент ELF-образа с таблицей строк .strtab. Тип структуры определен в заголовочном файле sysroot-*-kos/include/coresrv/vmm/vmm_types.h из состава KasperskyOS SDK.
  • [in] strTabSize – размер таблицы строк .strtab в байтах.

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

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KnTaskSetInitialPolicy()

Назначение

Задает класс планирования и приоритет начального потока процесса.

Параметры

  • [in] task – дескриптор процесса.
  • [in] policy – класс планирования начального потока процесса. Тип параметра определен в заголовочном файле sysroot-*-kos/include/thread/tidtype.h из состава KasperskyOS SDK.
  • [in] priority – приоритет начального потока процесса. Тип параметра определен в заголовочном файле sysroot-*-kos/include/coresrv/thread/thread_api.h из состава KasperskyOS SDK.
  • [in,optional] param – указатель на параметры класса планирования начального потока или RTL_NULL. Тип данных для хранения этих параметров определен в заголовочном файле sysroot-*-kos/include/coresrv/thread/thread_api.h из состава KasperskyOS SDK.

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

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

Дополнительные сведения

В параметре param можно указать RTL_NULL, если требуется задать параметры класса планирования начального потока процесса, применяемые по умолчанию.

В параметре param необходимо указать RTL_NULL, если класс планирования начального потока процесса не имеет параметров.

KnTaskReseedAslr()

Назначение

Задает начальное значение генератора случайных чисел для поддержки ASLR в заданном процессе.

Параметры

  • [in] task – дескриптор процесса.
  • [in] seed – указатель на буфер с начальным значением генератора случайных чисел.
  • [in] seedSize – размер буфера с начальным значением генератора случайных чисел (в байтах).

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

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KnTaskGetElfSyms()

Назначение

Позволяет получить адреса и размеры таблицы символов .symtab и таблицы строк .strtab для вызывающего процесса.

Параметры

  • [out] relocBase – указатель на смещение загрузки ELF-образа в байтах. Смещение загрузки ELF-образа нужно сложить с адресом символа из таблицы символов .symtab, чтобы получить адрес этого символа в памяти процесса.
  • [out] syms – указатель на адрес таблицы символов .symtab.
  • [out] symsCnt – указатель на размер таблицы символов .symtab в байтах.
  • [out] strs – указатель на адрес таблицы строк .strtab.
  • [out] strsCnt – указатель на размер таблицы строк .strtab в байтах.

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

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

Дополнительные сведения

Если таблица символов .symtab и таблица строк .strtab не загружены в память процесса вызовом функции KnTaskLoadElfSyms(), то функция KnTaskGetElfSyms() возвращает rcOk (при отсутствии других ошибок). В этом случае полученные адреса таблиц имеют значения RTL_NULL, а полученные размеры таблиц имеют нулевые значения.

Функция предназначена для механизма, который выводит данные обратной трассировки стека и работает в процессе, а не в ядре. В настоящее время этот механизм находится в разработке.

KnTaskGetIdByHandle()

Назначение

Позволяет получить идентификатор процесса (PID).

Параметры

  • [in] task – дескриптор процесса.
  • [out] taskId – указатель на идентификатор процесса. Тип идентификатора определен в заголовочном файле sysroot-*-kos/include/task/pidtype.h из KasperskyOS SDK.

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

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

KnTaskPanic()

Назначение

Инициирует возникновение исключения, которое не может быть обработано и приводит к завершению вызывающего процесса.

Параметры

Нет.

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

Нет.

KnTaskTransferResource()

Назначение

Передает дескриптор процессу, который еще не запущен.

Параметры

  • [in] task – дескриптор процесса.
  • [in] srcHandle – передаваемый дескриптор.
  • [in] srcBadge – дескриптор объекта контекста передачи ресурса.
  • [in] dstRights – маска прав потомка передаваемого дескриптора.
  • [out] outDstHandle – указатель на потомка переданного дескриптора (из пространства дескрипторов процесса, который получил дескриптор).

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

В случае успеха возвращает rcOk, иначе возвращает код ошибки.

Дополнительные сведения

В отличие от функции KosTaskTransferResource() из API task.h функция KnTaskTransferResource() не копирует значение потомка переданного дескриптора в SCP процесса, которому передан дескриптор. Функция KosTaskTransferResource() выполняет это, чтобы процесс, который получил потомка переданного дескриптора, мог найти его вызовом функции KosTaskLookupResource() из API task.h.