Компилятор NK (nk-gen-c
) генерирует транспортный код на основе IDL-, CDL-, EDL-описаний.
Компилятор nk-gen-c
принимает IDL-, CDL- или EDL-файл и создает следующие файлы:
*.*dl.h
, содержащий транспортный код.*.*dl.nk.d
, в котором перечислены зависимости созданного файла *.*dl.h
от IDL- и CDL-файлов. Файл *.*dl.nk.d
создается для системы сборки.Синтаксис shell-команды для запуска компилятора nk-gen-c
:
nk-gen-c [-I <PATH>]... [-o <PATH>] [--types] [--interface] [--endpoints]
[--client] [--server] [--extended-errors] [--trace-client-ipc {headers|dump}]
[--trace-server-ipc {headers|dump}] [--ipc-trace-method-filter <METHOD>[,METHOD]...]
[-h|--help] [--version] <FILE>
Базовые параметры:
FILE
Путь к IDL-, CDL- или EDL-файлу, для которого необходимо сгенерировать транспортный код.
-I
<PATH
>Через эти параметры задаются пути к директориям, которые содержат вспомогательные файлы, необходимые для генерации транспортного кода. (Вспомогательные файлы располагаются в директории sysroot-*-kos/include
из состава KasperskyOS SDK.) Также через эти параметры можно задать пути к директориям, содержащим IDL-, CDL-файлы, на которые ссылается файл, заданный через параметр FILE
.
-o
<PATH
>Путь к существующей директории, в которую будут помещены созданные файлы. Если этот параметр не указан, созданные файлы будут помещены в текущую директорию.
-h
|--help
Выводит текст справки.
--version
Выводит версию компилятора nk-gen-c
.
--extended-errors
Это параметр обеспечивает возможность использовать интерфейсные методы с одним или несколькими error-параметрами произвольных IDL-типов. (Клиент работает с error-параметрами как с выходными параметрами.)
Если не указывать параметр --extended-errors
, можно использовать интерфейсные методы только с одним error-параметром status
IDL-типа UInt16
, значение которого передается клиенту через код возврата интерфейсного метода. Такой способ является устаревшим и перестанет поддерживаться в будущем, поэтому рекомендуется всегда указывать параметр --extended-errors
.
Выборочная генерация транспортного кода
Чтобы уменьшить объем генерируемого транспортного кода, можно использовать флаги выборочной генерации транспортного кода. Например, для программ, реализующих службы, можно использовать флаг --server
, а для программ, использующих службы, можно использовать флаг --client
.
Если ни один из флагов выборочной генерации транспортного кода не указан, компилятор nk-gen-c
генерирует для заданного IDL-, CDL- или EDL-файла транспортный код со всеми возможными методами и типами.
Флаги выборочной генерации транспортного кода для IDL-файла:
--types
Транспортный код включает типы, соответствующие IDL-типам из заданного IDL-файла, а также импортируемым в этот файл IDL-типам, которые используются в IDL-типах заданного IDL-файла. При этом типы, соответствующие импортируемым IDL-константам и псевдонимам импортируемых IDL-типов, не включаются в файл *.idl.h
. Чтобы использовать типы, соответствующие импортируемым IDL-константам и псевдонимам импортируемых IDL-типов, нужно отдельно сгенерировать транспортный код для IDL-файлов, из которых осуществляется импорт.
--interface
Транспортный код соответствует флагу --types
, а также включает типы структур фиксированной части IPC-запросов и IPC-ответов для интерфейсных методов, сигнатуры которых указаны в заданном IDL-файле. Кроме того, транспортный код содержит константы с размерами арен IPC-сообщений.
--client
Транспортный код соответствует флагу --interface
, а также включает тип прокси-объекта, метод инициализации прокси-объекта и интерфейсные методы, указанные в заданном IDL-файле.
--server
Транспортный код соответствует флагу --interface
, а также включает типы и диспетчер (dispatch-метод), используемые для обработки IPC-запросов, соответствующих интерфейсным методам, указанным в заданном IDL-файле.
Флаги выборочной генерации транспортного кода для CDL- или EDL-файла:
--types
Транспортный код включает типы, соответствующие IDL-типам, которые используются в параметрах методов служб, предоставляемых компонентом (для заданного CDL-файла) или классом процессов (для заданного EDL-файла).
--endpoints
Транспортный код соответствует флагу --types
, а также включает типы структур фиксированной части IPC-запросов и IPC-ответов для методов служб, предоставляемых компонентом (для заданного CDL-файла) или классом процессов (для заданного EDL-файла). Кроме того, транспортный код содержит константы с размерами арен IPC-сообщений.
--client
Транспортный код соответствует флагу --types
, а также включает типы структур фиксированной части IPC-запросов и IPC-ответов для методов служб, предоставляемых компонентом (для заданного CDL-файла) или классом процессов (для заданного EDL-файла). Кроме того, транспортный код содержит константы с размерами арен IPC-сообщений, а также типы прокси-объектов, методы инициализации прокси-объектов и методы служб, предоставляемых компонентом (для заданного CDL-файла) или классом процессов (для заданного EDL-файла).
--server
Транспортный код соответствует флагу --types
, а также включает типы и диспетчеры (dispatch-методы), используемые для обработки IPC-запросов, соответствующих службам, предоставляемым компонентом (для заданного CDL-файла) или классом процессов (для заданного EDL-файла). Кроме того, транспортный код содержит константы с размерами арен IPC-сообщений, а также типы стабов, методы инициализации стабов и типы структур фиксированной части IPC-запросов и IPC-ответов для методов служб, предоставляемых компонентом (для заданного CDL-файла) или классом процессов (для заданного EDL-файла).
Вывод диагностических данных об отправке и приеме IPC-сообщений
Транспортный код может формировать диагностические данные об отправке и приеме IPC-сообщений и выводить эти данные через стандартный вывод ошибок. Чтобы генерировать транспортный код с такими возможностями, нужно использовать следующие параметры:
--trace-client-ipc
{headers
|dump
}Код вывода диагностических данных исполняется непосредственно перед выполнением системного вызова Call()
и сразу после его выполнения. Если указано значение headers
, диагностические данные включают идентификатор метода службы (MID), идентификатор службы (RIID), размер фиксированной части IPC-сообщения в байтах, содержимое дескриптора арены IPC-сообщения, размер арены IPC-сообщения в байтах и размер использованной части арены IPC-сообщения в байтах. Если указано значение dump
, диагностические данные дополнительно включают содержимое фиксированной части и арены IPC-сообщения в шестнадцатеричном представлении.
При использовании этого параметра нужно указать флаг выборочной генерации транспортного кода --client
либо не указывать флаги выборочной генерации транспортного кода.
--trace-server-ipc
{headers
|dump
}Код вывода диагностических данных исполняется непосредственно перед вызовом функции, реализующей интерфейсный метод, и сразу после выполнения этой функции, то есть при вызове диспетчера (dispatch-метода) в промежутке между выполнением системных вызовов Recv()
и Reply()
. Если указано значение headers
, диагностические данные включают идентификатор метода службы (MID), идентификатор службы (RIID), размер фиксированной части IPC-сообщения в байтах, содержимое дескриптора арены IPC-сообщения, размер арены IPC-сообщения в байтах и размер использованной части арены IPC-сообщения в байтах. Если указано значение dump
, диагностические данные дополнительно включают содержимое фиксированной части и арены IPC-сообщения в шестнадцатеричном представлении.
При использовании этого параметра нужно указать флаг выборочной генерации транспортного кода --server
либо не указывать флаги выборочной генерации транспортного кода.
--ipc-trace-method-filter
<METHOD
>[,METHOD
]...Вывод диагностических данных выполняется, если только вызваны заданные интерфейсные методы. В качестве значения METHOD
можно использовать имя интерфейсного метода либо конструкцию <имя пакета
>:
<имя интерфейсного метода
>. Имя пакета и имя интерфейсного метода указаны в IDL-файле.
Если этот параметр не указан, вывод диагностических данных выполняется при вызове любого интерфейсного метода.
Параметр можно указать многократно. Например, можно указать все требуемые интерфейсные методы в одном параметре или каждый требуемый интерфейсные метод в отдельном параметре.