Динамическое создание IPC-каналов (cm_api.h, ns_api.h)

12 января 2026

ID libkos_cm_ns_api

API определены в следующих заголовочных файлах из состава KasperskyOS SDK:

  • sysroot-*-kos/include/coresrv/cm/cm_api.h;
  • sysroot-*-kos/include/coresrv/ns/ns_api.h.

API позволяют динамически создавать IPC-каналы.

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

Использование API

Чтобы серверы могли сообщать клиентам о предоставляемых службах, нужно включить в решение сервер имен, то есть системную программу NameServer (исполняемый файл sysroot-*-kos/bin/ns из состава KasperskyOS SDK). IPC-каналы от клиентов и серверов к серверу имен можно создать статически (эти IPC-каналы должны иметь имя kl.core.NameServer). Если этого не сделать, то при вызове клиентами и серверами функции NsCreate() будут выполнены попытки динамического создания этих IPC-каналов. В качестве клиентской библиотеки сервера имен выступает библиотека libkos. Сервер имен не требуется включать в решение, если у клиентов изначально есть сведения об именах серверов и предоставляемых этими серверами служб.

Имена служб и интерфейсов нужно задавать в соответствии с формальными спецификациями компонентов решения. (О квалифицированном имени службы см. "Привязка методов моделей безопасности к событиям безопасности".) Вместо квалифицированного имени службы можно использовать какое-либо условное название этой службы. Имена клиентов и серверов задаются в init-описании. Также имя процесса можно получить вызовом функции KnTaskGetName() из API task_api.h.

Динамическое создание IPC-канала на стороне сервера включает следующие шаги:

  1. Подключиться к серверу имен вызовом функции NsCreate().
  2. Опубликовать предоставляемые службы на сервере имен, используя функцию NsPublishService().

    Чтобы отменить публикацию службы, нужно вызвать функцию NsUnPublishService().

  3. Получить запрос клиента на создание IPC-канала вызовом функции KnCmListen().

    Функция KnCmListen() позволяет получить первый запрос в очереди, но при этом не удаляет этот запрос, а помещает в конец очереди. Если в очереди всего один запрос, то вызов функции KnCmListen() несколько раз подряд дает один и тот же результат. Запрос удаляется из очереди при вызове функции KnCmAccept() или KnCmDrop().

  4. Принять запрос клиента на создание IPC-канала вызовом функции KnCmAccept().

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

    Слушающий дескриптор создается при вызове функции KnCmAccept() со значением INVALID_HANDLE в параметре listener. Если указать слушающий дескриптор, то созданный серверный IPC-дескриптор обеспечит возможность получать IPC-запросы по всем IPC-каналам, ассоциированным с этим слушающим дескриптором. (Первый IPC-канал, ассоциированный со слушающим дескриптором, создается при вызове функции KnCmAccept() со значением INVALID_HANDLE в параметре listener. Второй и последующие IPC-каналы, ассоциированные со слушающим дескриптором, создаются при втором и последующих вызовах функции KnCmAccept() с указанием дескриптора, полученного при первом вызове.) В параметре listener функции KnCmAccept() можно указать слушающий дескриптор, полученный с использованием функций KnHandleConnect(), KnHandleConnectEx() и KnHandleCreateListener() из API handle_api.h, а также функции SLStaticResolveHandle() из API sl-static.h. В параметре rsid функции KnCmAccept() нужно указать идентификатор службы (RIID), который является константой в автоматически генерируемом транспортном коде (например, FsDriver_operationsComp_fileOperations_iid).

Динамическое создание IPC-канала на стороне клиента включает следующие шаги:

  1. Подключиться к серверу имен вызовом функции NsCreate().
  2. Найти сервер, предоставляющий требуемую службу, используя функцию NsEnumServices().

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

  3. Выполнить запрос на создание IPC-канала с требуемым сервером вызовом функции KnCmConnect().

К серверу имен можно подключить несколько клиентов и серверов. Каждый клиент и сервер может создать несколько подключений к серверу имен. Сервер может отменить публикацию службы, выполненную другим сервером.

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

Удаление динамически созданных IPC-каналов

Динамически созданный IPC-канал будет удален при закрытии его клиентского и серверного IPC-дескрипторов.

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

Функции ns_api.h

Функции cm_api.h

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