Первым делом добавим в наш файл одну удобную функцию, которая будет печатать в человеческом виде значения флагов состояния серийного номера. Код функции приведен ниже:
#define PRINT_HELPER(state, flag) if (state & flag) printf("%s ", #flag) void print_state(INT state) { if (state == 0) { printf("state = 0\n"); return; } printf("state = "); PRINT_HELPER(state, SERIAL_STATE_FLAG_CORRUPTED); PRINT_HELPER(state, SERIAL_STATE_FLAG_INVALID); PRINT_HELPER(state, SERIAL_STATE_FLAG_BLACKLISTED); PRINT_HELPER(state, SERIAL_STATE_FLAG_DATE_EXPIRED); PRINT_HELPER(state, SERIAL_STATE_FLAG_RUNNING_TIME_OVER); PRINT_HELPER(state, SERIAL_STATE_FLAG_BAD_HWID); PRINT_HELPER(state, SERIAL_STATE_FLAG_MAX_BUILD_EXPIRED); printf("\n"); }
Несмотря на свой размер, функция очень простая - она последовательно проверяет все битовые флаги и печатает те, что присутствуют в переменной состояния. Заменим printf после проверки номера на вызов print_state, заодно временно поправим серийный номер, который подается в систему лицензирования:
char *serial = "Xserialnumber1"; // зададим номер непосредственно в коде для простоты int res = VMProtectSetSerialNumber(serial); print_state(res);
Если запустить эту программу, то на консоль выведется следующее:
state = SERIAL_STATE_FLAG_INVALID please register!
Вернем теперь старый серийный номер, убрав "1", и запустим программу еще раз:
state = 0 We are registered.
Теперь, когда мы можем видеть флаги состояние серийного номера, перейдем к получению флагов и данных из серийного номера.
Получение состояния номераСостояние номера можно получить тремя способами: вызвав VMProtectSetSerialNumber(), вызвав VMProtectGetSerialNumberState() и вызвав VMProtectGetSerialNumberData() - флаги состояния будут помещены в одно из полей структуры. Каждый из методов предназначен для использования в разное время. Первая проверка серийного номера происходит непосредственно при его установке. В этот момент нужно отсекать некорректные номера, номера с истекшим сроком действия, номера из черного списка и т.п. Некоторые ограничения - скажем, максимальное время работы продукта или срок действия номера, имеет смысл проверять и в процессе работы программы. Тут оптимально воспользоваться простым и быстрым методом VMProtectGetSerialNumberState(), а в случае, если нужно получить подробную информацию о данных в серийном номере, можно использовать более мощную функцию VMProtectGetSerialNumberData().