Компилятор 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 <SYSROOT_INCLUDE_PATH> [-I <PATH>]... [-o <PATH>] [--types]
[--interface] [--endpoints] [--client] [--server] [--extended-errors]
[(--deprecated-no-extended-errors)] [--trace-client-ipc {headers|dump}]
[--trace-server-ipc {headers|dump}] [--ipc-trace-method-filter <METHOD 1>[,<METHOD 2>]...]
[-h|--help] [--version] <FILE>
Базовые параметры:
FILEПуть к IDL-, CDL- или EDL-файлу, для которого необходимо сгенерировать транспортный код.
-I <SYSROOT_INCLUDE_PATH>Путь к директории sysroot-*-kos/include из состава KasperskyOS SDK.
-I <PATH>Эти параметры нужно использовать, чтобы задать пути к директориям, содержащим IDL-, CDL-файлы, на которые ссылается файл, заданный через параметр FILE.
-o <PATH>Путь к существующей директории, в которую будут помещены созданные файлы. Если этот параметр не указан, созданные файлы будут помещены в текущую директорию.
-h|--helpВыводит текст справки.
--versionВыводит версию компилятора nk-gen-c.
--extended-errorsЭто параметр дает возможность использовать интерфейсные методы с одним или несколькими error-параметрами произвольных IDL-типов. (Клиент работает с error-параметрами как с выходными параметрами.)
Если не указывать параметр --extended-errors, можно использовать интерфейсные методы только с одним error-параметром status IDL-типа UInt16, значение которого клиент получает через код возврата интерфейсного метода. Такой способ передачи error-параметров является устаревшим и перестанет поддерживаться в будущем, поэтому рекомендуется всегда указывать параметр --extended-errors.
--deprecated-no-extended-errorsЭтот параметр является параметром по умолчанию и дает возможность использовать интерфейсные методы только с одним error-параметром status IDL-типа UInt16, значение которого клиент получает через код возврата интерфейсного метода. Если параметр --deprecated-no-extended-errors не указан, и при этом не указан параметр --extended-errors, то также можно использовать этот способ передачи error-параметров, но будет выведено предупреждение о необходимости указать параметр --extended-errors либо параметр --deprecated-no-extended-errors. (Указать один из этих параметров нужно потому, что в будущем параметр --deprecated-no-extended-errors перестанет быть параметром по умолчанию, и без явного задания способа передачи error-параметров работа компилятора nk-gen-c будет завершаться с ошибкой.)
Выборочная генерация транспортного кода
Чтобы уменьшить объем генерируемого транспортного кода, можно использовать флаги выборочной генерации транспортного кода. Например, для программ, реализующих службы, можно использовать флаг --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 1>[,<METHOD 2>]...Вывод диагностических данных выполняется, если только вызваны заданные интерфейсные методы. В качестве значения METHOD можно использовать имя интерфейсного метода либо конструкцию <имя пакета>:<имя интерфейсного метода>. Имя пакета и имя интерфейсного метода указаны в IDL-файле.
Если этот параметр не указан, вывод диагностических данных выполняется при вызове любого интерфейсного метода.
Параметр можно указать многократно. Например, можно указать все требуемые интерфейсные методы в одном параметре или каждый требуемый интерфейсные метод в отдельном параметре.