Запуск процесса с помощью KasperskyOS API
В этом примере: использование функций EntityInitEx()
и EntityRun()
для запуска исполняемого файла из образа решения.
Ниже приводится код функции GpMgrOpenSession()
, выполняющей запуск серверного процесса, соединение его с клиентским процессом и инициализацию IPC-транспорта. Исполняемый файл нового процесса должен содержаться в ROMFS-хранилище решения.
/**
* Параметр 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\
).