Запуск процесса с помощью KasperskyOS API

02 августа 2023

ID app_static_start

В этом примере: использование функций EntityInitEx() и EntityRun() для запуска исполняемого файла из образа решения.

Ниже приводится код функции GpMgrOpenSession(), выполняющей запуск серверного процесса, соединение его с клиентским процессом и инициализацию IPC-транспорта. Исполняемый файл нового процесса должен содержаться в ROMFS-хранилище решения.

#define CONNECT_RETRY 150 /* Количество попыток соединения */

#define CONNECT_DELAY 10 /* Задержка в мс между попытками */

/**

* Параметр classname задает имя класса запускаемого процесса,

* параметр server задает уникальное имя процесса, а параметр service содержит имя сервиса,

* используемое при динамическом создании канала.

* Выходной параметр transport содержит инициализированный транспорт,

* если IPC-канал до клиента успешно создан.

*/

Retcode GpMgrOpenSession(const char *classname, const char *server,

const char *service, NkKosTransport *transport)

{

Retcode rc;

Entity *e;

EntityInfo tae_info;

Handle endpoint;

rtl_uint32_t riid;

int count = CONNECT_RETRY;

/* Инициализация структуры описания процесса. */

rtl_memset(&tae_info, 0, sizeof(tae_info));

tae_info.eiid = classname;

tae_info.args[0] = server;

tae_info.args[1] = service;

/* Создание процесса с описанием tae_info и именем server.

* Поскольку третий параметр равен RTL_NULL, имя запускаемого

* бинарного файла совпадает с именем класса из описания tae_info.

* Созданный процесс находится в остановленном состоянии. */

if ((e = EntityInitEx(&tae_info, server, RTL_NULL)) == NK_NULL)

{

rtl_printf("Cannot init entity '%s'\n", tae_info.eiid);

return rcFail;

}

/* Запуск процесса. */

if ((rc = EntityRun(e)) != rcOk)

{

rtl_printf("Cannot launch entity %" RTL_PRId32 "\n", rc);

EntityFree(e);

return rc;

}

/* Динамическое создание IPC-канала. */

while ((rc = KnCmConnect(server, service, INFINITE_TIMEOUT, &endpoint, &riid) ==

rcResourceNotFound && count--)

{

KnSleep(CONNECT_DELAY);

}

if (rc != rcOk)

{

rtl_printf("Cannot connect to server %" RTL_PRId32 "\n", rc);

return rc;

}

/* Инициализация IPC-транспорта. */

NkKosTransport_Init(transport, endpoint, NK_NULL, 0);

...

return rcOk;

}

Чтобы процесс мог запускать другие процессы, политика безопасности решения должна разрешать ему использование следующих служб ядра: Handle, Task и VMM (их описания находятся в директории kl\core\).

Вам помогла эта статья?
Что нам нужно улучшить?
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!
Спасибо за ваш отзыв, вы помогаете нам становиться лучше!