KasperskyOS Community Edition 1.2

Компонент ExecutionManager

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

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

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

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

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

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

client.cpp

#include <component/execution_manager/kos_ipc/execution_manager_proxy.h> ... namespace execmgr = execution_manager; int main(int argc, const char *argv[]) { // ... execmgr::IExecutionManagerPtr ptr; // имя IPC-канала для соединения с процессом ExecutionManager. Должно совпадать со значением MAIN_CONN_NAME в файле CMakeLists.txt для сборки ExecutionManager. char mainConnection[] = "ExecMgrEntity"; execmgr::ipc::ExecutionManagerConfig cfg{mainConnection}; if (CreateExecutionManager(cfg, ptr) != eka::sOk) { std::cerr << "Cannot create execution manager" << std::endl; return EXIT_FAILURE; } // ... }

Интерфейс IExecutionManager

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

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

  • IApplicationController - интерфейс для запуска\остановки процессов;
  • ISystemController - интерфейс для управления системой.

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

client.cpp

int main(int argc, const char *argv[]) { // ... execmgr::IApplicationControllerPtr ac; if (ptr->GetApplicationController(ac) != eka::sOk) { std::cerr << "Cannot get application controller" << std::endl; return EXIT_FAILURE; } execmgr::ISystemControllerPtr sc; if (ptr->GetSystemController(sc) != eka::sOk) { std::cerr << "Cannot get system controller" << std::endl; return EXIT_FAILURE; } // ... }

Интерфейс IApplicationController

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

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

  • StartEntity(

    const std::filesystem::path& runPath,

    const StartEntityInfo& info,

    StartEntityResultInfo& resInfo) - метод для запуска процесса.

  • RestartEntity(EntityId endId) - метод для перезапуска ранее запущенного процесса.
  • ShutdownEntity(EntityId entId) - метод для отправки процессу сигнала на завершение.
  • StopEntity(EntityId entId) - метод для немедленной остановки исполнения процесса.

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

Остальные методы принимают структуру EntityId, идентифицирующую запущенный процесс.

struct IApplicationController { // Все поля структуры StartEntityInfo являются опциональными для инициализации. 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; // Имя запущенного процесса. }; };

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

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) != eka::sOk) { 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) != eka::sOk) { std::cerr << "Cannot stop process " << appPath << std::endl; return EXIT_FAILURE; } // ... }

Интерфейс ISystemController

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

Интерфейс ISystemController предоставляет следующий метод для управления системой:

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

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

client.cpp

int main(int argc, const char *argv[]) { // ... if (sc->StopAllEntities() != eka::sOk) { std::cerr << "Cannot stop all processes\n"; return EXIT_FAILURE; } // ... }