IDL-описание
IDL-описания помещаются в отдельные файлы *.idl
и содержат декларации на языке IDL (Interface Definition Language):
- Имя пакета. Используется декларация:package <имя пакета>
- [Опционально] Пакеты, из которых импортируются типы данных для параметров интерфейсных методов. Используется декларация:import <имя пакета>
- [Опционально] Определения типов данных для параметров интерфейсных методов.
- [Опционально] Сигнатуры интерфейсных методов. Используется декларация:interface { <имя интерфейсного метода([параметры])>; [...] }
Каждая сигнатура метода указывается отдельной строкой. Имя метода не может содержать символов подчеркивания
_
. Каждый метод в списке имеет уникальное имя. Параметры методов разделяются на входные (in
), выходные (out
) и параметры для передачи сведений об ошибках (error
). Порядок описания параметров важен: сначала указываются входные, затем выходные и, далее, error-параметры. Методы интерфейса безопасности не могут иметь выходные и error-параметры.Входные и выходные параметры передаются в IPC-запросах и IPC-ответах соответственно. Error-параметры передаются в IPC-ответах, если сервер не может корректно обработать соответствующие IPC-запросы.
Сервер может информировать клиента об ошибках обработки IPC-запросов как через error-параметры, так и через выходные параметры интерфейсных методов. Если при возникновении ошибки сервер устанавливает флаг ошибки в IPC-ответе, то этот IPC-ответ содержит error-параметры и не содержит выходных параметров. В противном случае этот IPC-ответ содержит выходные параметры так же, как и при корректной обработке запросов. (Для установки флага ошибки в IPC-ответах используется макрос
nk_err_reset()
, определенный в заголовочном файлеnk/types.h
из состава KasperskyOS SDK.)Отправка IPC-ответа с установленным флагом ошибки и отправка IPC-ответа со снятым флагом ошибки являются разными видами событий для модуля безопасности Kaspersky Security Module. При описании политики безопасности решения это позволяет удобно разделять обработку событий, которые связаны с корректным и некорректным выполнением IPC-запросов. Если сервер не устанавливает флаг ошибки в IPC-ответах, то для обработки событий, связанных с некорректным выполнением IPC-запросов, модулю безопасности требуется проверять значения выходных параметров, которые сигнализируют об ошибках. (Клиент может проверить состояние флага ошибки в IPC-ответе, даже если соответствующий интерфейсный метод не содержит error-параметров. Для этого клиент использует макрос
nk_msg_check_err()
, определенный в заголовочном файлеnk/types.h
из состава KasperskyOS SDK.)Сигнатуры интерфейсных методов не могут импортироваться из других IDL-файлов.
Язык IDL чувствителен к регистру символов.
В IDL-описании могут использоваться однострочные и многострочные комментарии.
В IDL-описании используется как минимум одна опциональная декларация. Если в IDL-описании не использовать ни одной опциональной декларации, то этому описанию будет соответствовать "пустой" пакет, который не задает ни интерфейсных методов, ни типов данных (в том числе из других IDL-описаний).
Некоторые IDL-файлы из состава KasperskyOS SDK не описывают интерфейсные методы, а только содержат определения типов данных. Такие IDL-файлы используются только как экспортеры типов данных.
Если пакет содержит описание интерфейсных методов, то имя интерфейса соответствует имени пакета.
Примеры IDL-файлов
Env.idl
Kpm.idl
MessageBusSubs.idl
WaylandTypes.idl
Типы данных в языке IDL
В языке IDL поддерживаются как примитивные, так и составные типы данных. Набор поддерживаемых составных типов включает объединения, структуры, массивы и последовательности.
Примитивные типы
В языке IDL поддерживаются следующие примитивные типы:
SInt8
,SInt16
,SInt32
,SInt64
– знаковое целое число.UInt8
,UInt16
,UInt32
,UInt64
–беззнаковое целое число.Handle
– значение, двоичное представление которого состоит из нескольких полей, включая поле дескриптора и поле маски прав дескриптора.bytes<
<размер в байтах
>>
– байтовый буфер, представляющий собой область памяти с размером, не превышающим заданного числа байт.string<
<размер в байтах
>>
– строковый буфер, представляющий собой байтовый буфер, последний байт которого является терминирующим нулем. Максимальный размер строкового буфера на единицу больше заданного из-за наличия дополнительного байта с терминирующим нулем.
Целочисленные литералы можно указывать в десятичном, шестнадцатеричном (например, 0x2f
, 0X2f
, 0x2F
, 0X2F
) или восьмеричном (например, 0O123
, 0o123
) представлении.
С помощью ключевого слова const
можно определять именованные целочисленные константы, задавая их значения целочисленными литералами или целочисленными выражениями.
Примеры определений именованных целочисленных констант:
Именованные целочисленные константы можно использовать, чтобы избежать проблемы "магических чисел". К примеру, если в IDL-описании определены именованные целочисленные константы для кодов возврата интерфейсного метода, то при описании политики можно интерпретировать эти коды без дополнительных сведений. Также именованные целочисленные константы и целочисленные выражения могут применяться в определениях байтовых и строковых буферов, а также составных типов, чтобы задать размер данных или число элементов данных.
Конструкции bytes<
<размер в байтах
>>
и string<
<размер в байтах
>>
используются в определениях составных типов, сигнатурах интерфейсных методов и при создании псевдонимов типов, так как сами по себе они определяют анонимные типы (типы без имени).
Объединения
Объединение позволяет хранить данные разных типов в одной области памяти. В IPC-сообщении объединение снабжается дополнительным полем tag
, позволяющим определить, какой именно член объединения используется.
Для определения объединения используется следующая конструкция:
Пример определения объединения:
Структуры
Для определения структуры используется следующая конструкция:
Пример определения структуры:
Массивы
Для определения массива используется следующая конструкция:
Эта конструкция используется в определениях других составных типов, сигнатурах интерфейсных методов и при создании псевдонимов типов, так как сама по себе она определяет анонимный тип.
Тип Handle
можно использовать в качестве типа элементов массива, если этот массив не входит в другой составной тип данных. При этом суммарное число дескрипторов в IPC-сообщении не может превышать 255.
Последовательности
Последовательность представляет собой массив переменного размера. При определении последовательности указывается максимальное число ее элементов.
Для определения последовательности используется следующая конструкция:
Эта конструкция используется в определениях других составных типов, сигнатурах интерфейсных методов и при создании псевдонимов типов, так как сама по себе она определяет анонимный тип.
Тип Handle
нельзя использовать в качестве типа элементов последовательности.
Типы переменного и фиксированного размера
Типы bytes
, string
и sequence
являются типами переменного размера, то есть при определении этих типов задается максимальное число элементов, а фактически может использоваться меньше, в том числе ноль. Данные типов bytes
, string
и sequence
хранятся в арене IPC-сообщений. Остальные типы являются типами фиксированного размера. Данные типов фиксированного размера хранятся в фиксированной части IPC-сообщений.
Типы на основе составных типов
На основе составных типов могут быть определены другие составные типы. При этом определение массива или последовательности может быть вложено в определение другого типа.
Пример определения структуры с вложенными определениями массива и последовательности:
Определение объединения или структуры не может быть вложено в определение другого типа. Однако в определение типа могут быть включены уже определенные объединения и структуры. Это выполняется посредством указания в определении типа имен включаемых типов.
Пример определения структуры, включающей объединение и структуру:
Создание псевдонимов типов
Псевдонимы типов используются для повышения удобства работы с типами. Псевдонимы типов могут применяться, например, для того, чтобы задать типам с абстрактными именами мнемонические имена. Также назначение псевдонимов для анонимных типов позволяет получить именованные типы.
Для создания псевдонима типа используется следующая конструкция:
Пример создания мнемонических псевдонимов:
Пример создания псевдонима определению массива:
Пример создания псевдонима определению последовательности:
Пример создания псевдонима определению объединения:
Определение анонимных типов в сигнатурах интерфейсных методов
Анонимные типы могут быть определены в сигнатурах интерфейсных методов.
Пример определения последовательности в сигнатуре интерфейсного метода:
Целочисленные выражения в языке IDL
Целочисленные выражения в языке IDL составляются из именованных целочисленных констант, целочисленных литералов, операторов (см. таблицу ниже) и группирующих круглых скобок.
Пример использования целочисленных выражений:
Если при вычислении выражения возникнет целочисленное переполнение, генератор исходного кода, использующий IDL-файл, завершит работу с ошибкой.
Сведения об операторах целочисленных выражений в языке IDL
Синтаксис |
Операция |
Приоритет |
Ассоциативность |
Особенности |
---|---|---|---|---|
|
Смена знака |
1 |
Нет |
Нет. |
|
Побитовое отрицание |
1 |
Нет |
Нет. |
|
Возведение в степень |
2 |
Нет |
Имеет следующие особенности:
|
|
Умножение |
3 |
Левая |
Нет. |
|
Целочисленное деление |
3 |
Левая |
Имеет следующие особенности:
|
|
Остаток от деления |
3 |
Левая |
Имеет следующие особенности:
|
|
Сложение |
4 |
Левая |
Нет. |
|
Вычитание |
4 |
Левая |
Нет. |
|
Битовый сдвиг влево |
2* |
Нет |
Имеет следующие особенности:
|
|
Битовый сдвиг вправо |
2* |
Нет |
Имеет следующие особенности:
|