Защита DLL

Добрый день, не могу понять нормально ли поведение защищенных функций в DLL, когда функция вызывается из одного потока getserailstate возвращает 0 т.е. все ок.
Как только эту функцию вызываю из нескольких потоков одновременно то второй и последующие getserailstate возвращают что лицензия не верна!
Подскажите на что обратить внимание при изучении данной проблемы, какие рекомендации! Или её решить не получится?

Присылайте тестовый проект (EXE+оригинал DLL+MAP файлы), на котором воспроизводится эта проблема.

исходники + защищенные EXE+DLL здесь(http://rusfolder.com/42596561)
пароль:2212

Проблема заключается в том, что текущая реализация VMProtectSetSerialNumber не является потокобезопасной, поэтому вызов этого API нужно завернуть в общую критическую секцию, создаваемую в initialization DLL-ки. В версии 3.0 все API лицензирования будут потокобезопасными.

3 версия приобретается отдельно?

Для зарегистрированных пользователей обновление будет доступно по годовой подписке.

Критические секции сильно тормозят процесс. Получается что все вызовы API в том числе VMProtectGetSerialNumberState также необходимо заворачивать в критическую секцию, иначе не смог добиться стабильности!

Если честно, то мне совершенно непонятен вот такой подход:

function  DllFunc(li:PAnsiChar): Integer; stdcall;
begin
  Result := 0;
  with TDllClass.Create do
  begin
    try

      VMProtectSetSerialNumber(li);
      Result:=GetResult;

    finally
      Free;
    end;
  end;
end;

Зачем потоки постоянно дергают VMProtectSetSerialNumber если можно было бы сделать вызов VMProtectSetSerialNumber всего один раз (я бы вообще это сделал в initialization)?

function  DllFunc(li:PAnsiChar): Integer; stdcall;
begin
  Result := 0;
  with TDllClass.Create do
  begin
    try

      Result:=GetResult;

    finally
      Free;
    end;
  end;
end;

initialization
// здесь читаем ключ из файла, имя EXE-ника можно получить через GetModuleFileName(0, ...)
VMProtectSetSerialNumber(lic)