# Описание функций API лицензирования

API системы лицензирования является продолжением API VMProtect и входит в его SDK. API позволяет задать серийный номер и получить информацию о нем: подходит он к программе или нет, истек ли срок действия, на кого зарегистрирован продукт и т.п. Также API позволяет получить идентификатор оборудования, на котором выполняется программа.

VMProtectSetSerialNumber

Функция предназначена для загрузки серийного номера в систему лицензирования. Полный формат вызова представлен ниже:

    int VMProtectSetSerialNumber(const char *SerialNumber);

Входной параметр SerialNumber должен содержать указатель на текстовую строку с серийным номером в кодировке base-64 и завершаемую нулем ('\0'). Функция возвращает битовую маску флагов состояния серийного номера, аналогичную той, что возвращает VMProtectGetSerialNumberState(), подробнее о флагах будет написано ниже. Серийный номер считается "хорошим", если функция вернула значение 0.

VMProtectGetSerialNumberState

Функция возвращает флаги состояния серийного номера, предварительно установленного вызовом VMProtectSetSerialNumber().

    int VMProtectGetSerialNumberState();

Наличие хотя бы одного установленного флага говорит о проблемах с серийным номером: программа не должна работать, если установлен хотя бы один бит. Подробные значениях флагов описаны в таблице:

Флаг | Значение | Описание
--- | --- | ---
SERIAL_STATE_FLAG_CORRUPTED | 0x00000001 | Система лицензирования повреждена. Возможные причины: некорректная настройка проекта защиты, попытка взлома программы.
SERIAL_STATE_FLAG_INVALID | 0x00000002 | Серийный номер некорректен. Флаг выставляется, если система лицензирования не может расшифровать серийный номер.
SERIAL_STATE_FLAG_BLACKLISTED | 0x00000004 | Серийный номер подходит к продукту, однако занесен в черный список в VMProtect.
SERIAL_STATE_FLAG_DATE_EXPIRED | 0x00000008 | Срок действия серийного номера истек. Подробную информацию о сроке действия можно получить вызовом VMProtectGetSerialNumberData()
SERIAL_STATE_FLAG_RUNNING_TIME_OVER | 0x00000010 | Время работы программы истекло. Подробную информацию о времени работы программы можно получить вызовом VMProtectGetSerialNumberData()
SERIAL_STATE_FLAG_BAD_HWID | 0x00000020 | Идентификатор оборудования не совпадает с тем, что записан в серийном номере.
SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED | 0x00000040 | Серийный номер не предназначен для работы с этой версией защищаемой программы. Максимальную дату сборки программы, к которой подходит этот серийный номер, можно узнать вызовом VMProtectGetSerialNumberData().

VMProtectGetSerialNumberData

Функция предназначена для получения информации о содержимом серийного номера, установленного вызовом VMProtectSetSerialNumber(). Формат вызова представлен ниже:

    bool VMProtectGetSerialNumberData(VMProtectSerialNumberData *Data, int Size);

Первый параметр - указатель на структуру VMProtectSerialNumberData, в которую будет записана вся необходимая информация. Второй параметр - размер структуры, передаваемой в первом параметре - служит для контроля формата структуры. Функция возвращает FALSE в случаях, если система лицензирования повреждена (см. флаг состояния SERIAL_STATE_FLAG_CORRUPTED), если на вход подан нулевой адрес структуры или если переданный размер структуры некорректен. Во всех остальных случаях функция возвращает TRUE и записывает всю информацию о серийном номере по указанном адресу. Ниже описываются все элементы структуры:

Элемент | Тип | Описание
--- | --- | ---
nState | int | Битовая маска флагов проверки ключа. Аналогична той, что возвращает VMProtectGetSerialNumberState().
wUserName | wchar_t[256] | Имя покупателя в кодировке UNICODE, завершаемое нулем.
wEMail | wchar_t[256] | E-Mail покупателя в кодировке UNICODE, завершаемый нулем.
dtExpire | VMProtectDate | Дата окончания срока действия ключа. Формат структуры VMProtectDate описан ниже.
dtMaxBuild | VMProtectDate | Максимальная дата сборки продукта, с которой будет работать этот ключ. Формат структуры VMProtectDate описан ниже.
bRunningTime | int | Количество минут, которое программа будет работать (максимальная длина сессии). Измеряется в минутах, отсчитывается с момента запуска программы.
nUserDataLength | unsigned char | Длина пользовательских данных, размещенных в поле bUserData.
bUserData | unsigned char[255] | Пользовательские данные, записанные в ключ. Количество актуальных байт указано в поле nUserDataLength.

Структура VMProtectDate предназначена для компактного хранения даты. Ее поля описаны в таблице:

Элемент | Тип | Описание
--- | --- | ---
wYear | unsigned short | Год.
bMonth | unsigned char | Месяц, нумерация начинается с единицы.
bDay | unsigned char | День, нумерация начинается с единицы.

VMProtectGetCurrentHWID

Функция предназначена для получения идентификатора оборудования, на котором работает программа. Формат вызова следующий:

    int VMProtectGetCurrentHWID(char * HWID, int Size);

Первый параметр - указатель на область памяти, куда будет записан идентификатор. Второй параметр - размер области данных. Функция возвращает количество записанных байт с учетом завершающего нуля ('\0'). Если вместо первого параметра подать NULL, то функция вернет необходимое количество байт для записи номера. Наиболее правильный способ вызова функции следующий:

    int nSize = VMProtectGetCurrentHWID(NULL, 0); // получим необходимый размер буфера
    char *pBuf = new char[nSize]; // выделим буфер
    VMProtectGetCurrentHWID(pBuf, nSize); // получим идентификатор
    // используем его
    delete [] pBuf; // освободим память

© 2006-2015 Copyright VMProtect Software