KasperskyOS Community Edition 1.3

Компонент ExecutionManager

API определен в заголовочных файлах, расположенных в директории sysroot-*-kos/include/component/execution_manager/ из состава KasperskyOS SDK.

Сценарий использования компонента ExecutionManager описан в статье "Запуск процессов с помощью системной программы ExecutionManager".

Интерфейс execution_manager_proxy.h

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

Интерфейс содержит функцию CreateExecutionManager() для получения указателя на экземпляр интерфейса IExecutionManager, необходимого для работы с компонентом ExecutionManager. Через входной параметр cfg эта функция принимает параметры конфигурации в виде структуры ExecutionManagerConfig. Все поля этой структуры опциональны для заполнения.

struct ExecutionManagerConfig { // Имя IPC-канала для соединения с процессом ExecutionManager. char const* const mainConnection = KOS_EXECMGR_CONN_MAIN; // Имя службы, реализующей интерфейс IApplicationController. char const* const appControlInterface = KOS_EXECMGR_IFACE_AC; // Имя службы, реализующей интерфейс IStateProvider. char const* const appStateInterface = KOS_EXECMGR_IFACE_AS; // Имя службы, реализующей интерфейс ISystemController. char const* const systemControlInterface = KOS_EXECMGR_IFACE_SC; // Имя службы, реализующей интерфейс IProcessControl. char const* const processControlInterface = KOS_EXECMGR_IFACE_PC; // Имя класса процесса ExecutionManager. char const* const execmgrServerName = KOS_EXECMGR_SERVER_NAME; };

Функции execution_manager_proxy.h

Функция

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

CreateExecutionManager()

Назначение

Получение указателя на экземпляр интерфейса IExecutionManager, необходимого для работы с компонентом ExecutionManager.

Параметры

  • [in] cfg – структура ExecutionManagerConfig с параметрами конфигурации для соединения с процессом ExecutionManager.
  • [out] emp – указатель на экземпляр интерфейса IExecutionManager.

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

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

Пример использования:

client.cpp

#include <component/execution_manager/kos_ipc/execution_manager_proxy.h> int main(int argc, const char *argv[]) { // ... execution_manager::ipc::ExecutionManagerConfig emCfg { // Имя IPC-канала для соединения с процессом ExecutionManager. // Должно совпадать со значением MAIN_CONN_NAME в файле // CMakeLists.txt для сборки компонента ExecutionManager. .mainConnection = "ExecMgrEntity", // Имя класса процесса ExecutionManager. .execmgrServerName = "kl.ExecMgrEntity" }; execution_manager::IExecutionManagerPtr emPtr; kos::Result res = CreateExecutionManager(emCfg, emPtr); if (res != kos::Ok) { std::cerr << fmt::format("[{}] Failed to create execution manager. res=0x{:x}\n", selfName, res); return EXIT_FAILURE; } // ... }

Интерфейс IExecutionManager

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

Интерфейс IExecutionManager позволяет получить доступ к указателям на следующие интерфейсы:

  • IProcessControl – интерфейс, который позволяет запускать процесс из исполняемого файла, установленного компонентом PackageManager из KPA-пакета в решение на базе KasperskyOS, а также получать сведения о процессе (включая информацию о его завершении) и останавливать его.
  • IApplicationController – интерфейс, который позволяет запускать процесс из любого исполняемого файла, чье расположение в файловой системе известно, а также останавливать этот процесс.
  • IStateProvider – интерфейс для получения сведений о процессе, запущенном с использованием интерфейса IApplicationController.
  • ISystemController – интерфейс для управления системой.

Пример использования:

client.cpp

int main(int argc, const char *argv[]) { // ... alm::execution_manager::IProcessControlPtr pc; res = emPtr->GetProcessController(pc); if (res != kos::Ok) { std::cerr << fmt::format("[{}] Failed to create process controller. res=0x{:x}\n", selfName, res); return EXIT_FAILURE; } execmgr::IApplicationControllerPtr ac; if (ptr->GetApplicationController(ac) != kos::Ok) { std::cerr << "Can not get application controller" << std::endl; return EXIT_FAILURE; } execmgr::ISystemControllerPtr sc; if (ptr->GetSystemController(sc) != kos::Ok) { std::cerr << "Cannot get system controller" << std::endl; return EXIT_FAILURE; } // ... }

В этом разделе

Интерфейс IProcessControl

Интерфейс IApplicationController

Интерфейс IStateProvider

Интерфейс ISystemController

В начало
[Topic execmgr_component]

Интерфейс IProcessControl

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

API позволяет:

  • запускать процесс из исполняемого файла, установленного компонентом PackageManager из KPA-пакета в решение на базе KasperskyOS;
  • получать сведения о процессе (включая информацию о его завершении);
  • останавливать процесс.

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

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

Чтобы запустить процесс, нужно вызвать функцию StartProcess(). Через входной параметр opts эта функция принимает параметры для запуска процесса в виде структуры StartOptions. Все поля этой структуры являются опциональными для инициализации.

struct StartOptions { // Дескриптор, который идентифицирует родительский процесс. IpcHandle parent{NK_INVALID_HANDLE, 0, NK_INVALID_HANDLE}; // Список пользовательских дескрипторов, // которые будут переданы процессу при его запуске. UserHandleItems userHandles; // Аргументы командной строки. Strings extraArgs; // Переменные окружения. Strings extraEnvs;};

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

Вектор userHandles является компонентом структуры StartOptions и содержит список пользовательских дескрипторов, которые будут переданы процессу при его запуске. Элементами списка являются пары, задаваемые в структуре UserHandleItem и состоящие из дескриптора и его имени. После запуска процесса переданные ему дескрипторы могут быть найдены с помощью функции KosTaskLookupResource() по их именам.

struct UserHandleItem { // Имя дескриптора. std::string id; // Дескриптор. IpcHandle handle; };

Входные параметры pkgId и runConfigId функции StartProcess() определены в манифесте KPA-пакета. Их значения могут быть получены с использованием функций из интерфейса IPackageManifest компонента PackageManager.

Остановка процесса

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

enum class StopPolicy : uint32_t { // Отправить процессу сигнал на остановку. Normal = 0, // Немедленно остановить процесс. Forced, };

Получение сведений о процессе

Чтобы запросить сведения о процессе, нужно вызвать функцию GetProcessState(). Через выходной параметр state эта функция возвращает сведения о процессе в виде структуры ProcessContext.

struct ProcessContext { // Состояние процесса. ProcessState state{}; // Системный статус завершения процесса. ExecutableExitStatus exitStatus{}; // Общий код завершения процесса. ExecutableExitCode exitCode{}; // Уточняющий код завершения процесса. ExecutableExitReason exitReason{}; };

Перечисление state является компонентом структуры ProcessContext и описывает состояние процесса.

enum class ProcessState : uint32_t { // Служебная константа. None = 0, // Процесс создан. Created, // Процесс инициализирован. Prepared, // Процесс запущен. Running, // Процесс аварийно остановлен. Failed, // Процесс остановлен, но данные о процессе доступны // для функции GetProcessState(). Finished, // Процесс завершен и не существует в системе. NotExisting, };

Перечисление exitStatus является компонентом структуры ProcessContext и описывает причину остановки процесса. Перечисление ExecutableExitStatus определено в заголовочном файле sysroot-*-kos/include/alm/execution_manager/execution_manager_types.h из состава KasperskyOS SDK.

enum class [[nodiscard]] ExecutableExitStatus : std::underlying_type_t<TaskExitStatus> { // Процесс ещё не запущен компонентом ExecutionManager. ExitUninitialized = TaskExitStatus::TaskExitUninitialized, // Процесс аварийно остановлен в результате необработанного исключения. ExitUnexpected = TaskExitStatus::TaskExitUnexpected, // Процесс завершил работу самостоятельно, в том числе // после получения сигнала на свою остановку при вызове // функции StopProcess() со значением Normal в политике остановки процесса. ExitNormal = TaskExitStatus::TaskExitNormal, // Процесс остановлен по внешнему запросу, в том числе вызовом функции // StopProcess() со значением Forced в политике остановки процесса. ExitTerminated = TaskExitStatus::TaskExitTerminated, };

Числовой параметр exitCode является компонентом структуры ProcessContext и содержит код возврата для процесса, который остановился самостоятельно, в том числе после получения сигнала на свою остановку. Значения для этого кода возврата определяются разработчиком решения на базе KasperskyOS.

Числовой параметр exitReason является компонентом структуры ProcessContext и содержит код возврата, который уточняет причину неудачной попытки запуска процесса, либо rcOk в случае успешного запуска. Параметр определен в заголовочном файле sysroot-*-kos/include/rtl_cpp/retcode.h из состава KasperskyOS SDK. В этом файле содержатся коды возврата, которые являются общими для API любых компонентов решения и их составных частей (см. "Коды возврата").

Функции i_process_control.h

Функция

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

StartProcess()

Назначение

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

Параметры

  • [in] pkgId – идентификатор KPA-пакета.
  • [in] runConfigId – идентификатор конфигурации запуска.
  • [in] opts – структура StartOptions с параметрами запуска процесса.
  • [out] accessToken – ссылка на дескриптор, который идентифицирует запущенный процесс.

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

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

StopProcess()

Назначение

Останавливает процесс.

Параметры

  • [in] accessToken – дескриптор, который идентифицирует запущенный процесс.
  • [in] stopPolicy – политика остановки процесса.

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

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

GetProcessState()

Назначение

Запрашивает сведения о процессе.

Параметры

  • [in] accessToken – дескриптор, который идентифицирует запущенный процесс.
  • [out] state – ссылка на структуру ProcessContext, содержащую сведения о процессе.

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

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

Пример использования:

client.cpp

int main(int argc, const char *argv[]) { // ... alm::execution_manager::IProcessControl::StartOptions startOptions{}; alm::execution_manager::IpcHandle procToken{}; // Идентификатор KPA-пакета. const std::string packageId{"application.Application"}; // Идентификатор конфигурации запуска. const std::string runConfigId{"app"}; kos::rtl::Result res = pc->StartProcess(packageId, runConfigId, startOptions, procToken); if (res != kos::rtl::Ok) { std::cerr << fmt::format("[{}] Failed to start process. res=0x{:x}\n", selfName, res); return EXIT_FAILURE; } alm::execution_manager::ProcessContext procContext{}; res = pc->GetProcessState(procToken, procContext); if (res != kos::rtl::Ok) { std::cerr << fmt::format("[{}] Failed to get process state. res=0x{:x}\n", selfName, res); return EXIT_FAILURE; } if (procContext.state == alm::execution_manager::ProcessState::Running) { std::cerr << fmt::format("[{}] Process state is Running.\n", selfName); } res = pc->StopProcess(procToken, alm::execution_manager::StopPolicy::Forced); if (res != kos::rtl::Ok) { std::cerr << fmt::format("[{}] Failed to stop process. res=0x{:x}\n", selfName, res); return EXIT_FAILURE; } // ... }
В начало
[Topic em_iprocesscontrol]

Интерфейс IApplicationController

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

API позволяет запускать процесс из исполняемого файла, а также останавливать процесс.

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

Чтобы запустить процесс, нужно вызвать функцию StartEntity(). Через входной параметр info эта функция принимает параметры для запуска процесса в виде структуры StartEntityInfo. Все поля этой структуры являются опциональными для инициализации. Через выходной параметр resInfo эта функция возвращает ссылку на структуру StartEntityResultInfo с результатами запуска процесса.

Чтобы остановить процесс, нужно вызвать функцию ShutdownEntity() или StopEntity(). Через входной параметр entId эти функции принимают дескриптор, идентифицирующий запущенный процесс.

struct IApplicationController { struct StartEntityInfo { // Имя процесса. Если не указано, то будет использовано имя класса процесса. // Если не указано имя класса процесса, то будет использовано имя исполняемого файла. std::string entityName; // Класс процесса. Если не указан, то будет использовано имя процесса. // Если не указано имя процесса, то будет использовано имя исполняемого файла. std::string eiid; // Аргументы командной строки. std::vector<std::string> args; // Переменные окружения. std::vector<std::string> envs; // Политика перезапуска процесса при его аварийном завершении. Возможные значения: // EntityRestartPolicy::DoNotRestart - не перезапускать. // EntityRestartPolicy::AlwaysRestart - всегда перезапускать. EntityRestartPolicy restartPolicy { EntityRestartPolicy::DoNotRestart }; }; struct StartEntityResultInfo { // Класс безопасности, присвоенный процессу. std::string eiid; // Дескриптор, идентифицирующий запущенный процесс. EntityId entId; // Идентификатор безопасности запущенного процесса. Uid sid; // Имя запущенного процесса. std::string taskName; }; };

Функции i_application_control.h

Функция

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

StartEntity()

Назначение

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

Параметры

  • [in] runPath – путь к исполняемому файлу, который нужно запустить.
  • [in] info – структура с параметрами запуска процесса StartEntityInfo.
  • [out] resInfo – структура с результатами запуска процесса StartEntityResultInfo.
  • [out] containerPath – путь к изолированному хранилищу данных процесса.

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

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

ShutdownEntity()

Назначение

Отправляет процессу сигнал на завершение.

Параметры

  • [in] entId – дескриптор, идентифицирующий запущенный процесс.

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

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

StopEntity()

Назначение

Немедленно останавливает исполнение процесса.

Параметры

  • [in] entId – дескриптор, идентифицирующее запущенный процесс.

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

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

Пример использования:

client.cpp

int main(int argc, const char *argv[]) { // ... const fs::path appPath{"/application"}; execmgr::IApplicationController::StartEntityResultInfo result; execmgr::IApplicationController::StartEntityInfo info; info.entityName = std::string{"application.Application"}; info.eiid = std::string{"application.Application"}; info.args = std::vector<std::string>{"1", "ARG1", "ARG2" , "ARG3"}; info.envs = std::vector<std::string>{"ENV1=10", "ENV2=envStr"}; std::cout << "Starting application from elf\n"; if (ac->StartEntity(appPath, info, result) != kos::Ok) { std::cerr << "Can not start application from " << appPath << std::endl; return EXIT_FAILURE; } std::cout << "Application started with process sid " << result.sid << "\n"; auto AppId = result.entId; if (ac->StopEntity(AppId) != kos::Ok) { std::cerr << "Cannot stop process " << appPath << std::endl; return EXIT_FAILURE; } // ... }
В начало
[Topic em_iapplicationcontroller]

Интерфейс IStateProvider

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

API позволяет получать сведения о процессе, запущенном с использованием функции StartEntity() из API IApplicationController (см. "Интерфейс IApplicationController"), включая информацию о причине его завершения.

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

Чтобы получить сведения о процессе, нужно вызвать функцию GetApplicationState(). Через входной параметр entityId эта функция принимает значение типа EntityId, которое идентифицирует запущенный процесс. Через выходной параметр appState эта функция возвращает сведения о процессе в виде структуры AppContext. Структура AppContext определена в заголовочном файле sysroot-*-kos/include/component/execution_manager/types.h из состава KasperskyOS SDK

struct AppContext { // Состояние процесса. AppState state{}; // Причина остановки процесса. alm::execution_manager::ExecutableExitStatus exitStatus{}; // Код возврата для процесса, // который остановился самостоятельно. alm::execution_manager::ExecutableExitCode exitCode{}; // Код возврата, который уточняет причину // неудачной попытки запуска процесса. alm::execution_manager::ExecutableExitReason exitReason{}; };

Перечисление state является компонентом структуры AppContext и описывает состояние процесса. Перечисление state определено в заголовочном файле sysroot-*-kos/include/component/execution_manager/types.h из состава KasperskyOS SDK.

enum class AppState : uint32_t { None = 0, // Процесс запущен. Started, // Процесс перезапущен. Restarted, // Процесс остановлен с помощью функции StopEntity() // из API IApplicationController. Stopped, // Процесс остановлен с помощью функции ShutdownEntity() // из API IApplicationController. Completed, // Процесс аварийно остановлен // в результате необработанного исключения. Failed, };

Перечисление exitStatus является компонентом структуры AppContext и описывает причину остановки процесса. Перечисление ExecutableExitStatus определено в заголовочном файле sysroot-*-kos/include/alm/execution_manager/execution_manager_types.h из состава KasperskyOS SDK.

enum class [[nodiscard]] ExecutableExitStatus : std::underlying_type_t<TaskExitStatus> { // Процесс ещё не запущен компонентом ExecutionManager. ExitUninitialized = TaskExitStatus::TaskExitUninitialized, // Процесс аварийно остановлен в результате необработанного исключения. ExitUnexpected = TaskExitStatus::TaskExitUnexpected, // Процесс завершил работу самостоятельно, // в том числе после получения сигнала на остановку // при вызове функции ShutdownEntity() из API IApplicationController. ExitNormal = TaskExitStatus::TaskExitNormal, // Процесс остановлен по внешнему запросу, в том числе вызовом // функции StopEntity() из API IApplicationController. ExitTerminated = TaskExitStatus::TaskExitTerminated, };

Числовой параметр exitCode является компонентом структуры AppContext и содержит код возврата для процесса, который остановился самостоятельно, в том числе после получения сигнала на свою остановку. Значения для этого кода возврата определяются разработчиком решения на базе KasperskyOS.

Числовой параметр exitReason является компонентом структуры AppContext и содержит код возврата, который уточняет причину неудачной попытки запуска процесса, либо rcOk в случае успешного запуска процесса. Параметр определен в заголовочном файле sysroot-*-kos/include/rtl_cpp/retcode.h из состава KasperskyOS SDK. В этом файле содержатся коды возврата, которые являются общими для API любых компонентов решения и их составных частей (см. "Коды возврата").

Функции i_state_control

Функция

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

GetApplicationState()

Назначение

Запрашивает сведения о процессе.

Параметры

  • [in] entityId – значение типа EntityId, которое идентифицирует запущенный процесс.
  • [out] appState – ссылка на структуру AppContext, содержащую сведения о процессе.

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

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

Пример использования:

client.cpp

int main(int argc, const char *argv[]) { // ... execution_manager::AppContext appContext(); if (rc = m_sc->GetApplicationState(entityId, appContext), rc != kos::Ok) { KOS_LOGERROR("GetApplicationState: failure with entity {}: {}", entityName, RC_GET_CODE(rc)); return rc; } // ... }
В начало
[Topic em_istateprovider]

Интерфейс ISystemController

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

API позволяет завершать работу системы.

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

Функции i_system_control.h

Функция

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

StopAllEntities()

Назначение

Останавливает все запущенные процессы; затем завершает процесс ExecutionManager; а затем отправляет в ядро запрос на выключение устройства.

Параметры

Нет.

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

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

Пример использования:

client.cpp

int main(int argc, const char *argv[]) { // ... if (sc->StopAllEntities() != kos::Ok) { std::cerr << "Cannot stop all processes\n"; return EXIT_FAILURE; } // ... }
В начало
[Topic em_isystemcontroller]