# Шаг 1.3: Получаем флаги состояния серийного номера

Удобная функция для печати флагов

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

    #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().

Следующий шаг

© 2006-2015 Copyright VMProtect Software