Динамическое создание IPC-каналов (cm_api.h, ns_api.h)
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-канала на стороне сервера включает следующие шаги:
- Подключиться к серверу имен вызовом функции
NsCreate(). - Опубликовать предоставляемые службы на сервере имен, используя функцию
NsPublishService().Чтобы отменить публикацию службы, нужно вызвать функцию
NsUnPublishService(). - Получить запрос клиента на создание IPC-канала вызовом функции
KnCmListen().Функция
KnCmListen()позволяет получить первый запрос в очереди, но при этом не удаляет этот запрос, а помещает в конец очереди. Если в очереди всего один запрос, то вызов функцииKnCmListen()несколько раз подряд дает один и тот же результат. Запрос удаляется из очереди при вызове функцииKnCmAccept()илиKnCmDrop(). - Принять запрос клиента на создание 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-канала на стороне клиента включает следующие шаги:
- Подключиться к серверу имен вызовом функции
NsCreate(). - Найти сервер, предоставляющий требуемую службу, используя функцию
NsEnumServices().Чтобы получить полный список служб с заданным интерфейсом, нужно вызвать функцию несколько раз, инкрементируя индекс, пока не будет получена ошибка
rcResourceNotFound. - Выполнить запрос на создание IPC-канала с требуемым сервером вызовом функции
KnCmConnect().
К серверу имен можно подключить несколько клиентов и серверов. Каждый клиент и сервер может создать несколько подключений к серверу имен. Сервер может отменить публикацию службы, выполненную другим сервером.
Чтобы удалить подключение к серверу имен, нужно вызвать функцию NsDestroy().
Удаление динамически созданных IPC-каналов
Динамически созданный IPC-канал будет удален при закрытии его клиентского и серверного IPC-дескрипторов.
Сведения о функциях API
Функции ns_api.h
Функция | Сведения о функции |
|---|---|
| Назначение Создает подключение к серверу имен. Параметры
Возвращаемые значения В случае успеха возвращает |
| Назначение Удаляет подключение к серверу имен. Параметры
Возвращаемые значения В случае успеха возвращает |
| Назначение Публикует службу на сервере имен. Параметры
Возвращаемые значения В случае успеха возвращает |
| Назначение Отменяет публикацию службы на сервере имен. Параметры
Возвращаемые значения В случае успеха возвращает |
| Назначение Перечисляет службы, опубликованные на сервере имен. Параметры
Возвращаемые значения В случае успеха возвращает |
Функции cm_api.h
Функция | Сведения о функции |
|---|---|
| Назначение Выполняет запрос на создание IPC-канала с сервером для использования заданной службы. Параметры
Возвращаемые значения В случае успеха возвращает |
| Назначение Позволяет получить запрос клиента на создание IPC-канала для использования службы. Параметры
Возвращаемые значения В случае успеха возвращает |
| Назначение Отклоняет запрос клиента на создание IPC-канала для использования заданной службы. Параметры
Возвращаемые значения В случае успеха возвращает |
| Назначение Принимает запрос клиента на создание IPC-канала для использования заданной службы. Параметры
Возвращаемые значения В случае успеха возвращает |