Переопределение реализации CRT _purecall - PullRequest
1 голос
/ 18 марта 2011

В настоящее время я работаю над DLL, которая является расширением закрытого рабочего проекта.

Я хочу перехватить каждую ошибку, связанную с чистым вызовом, поэтому я нашел ее и выяснил, что такое обработчик _purecall. Мой вопрос о его реализации. Что происходит за кулисами? Сам компилятор берет мой адрес функции-обработчика (если я его определил) и записывает его значение по умолчанию в каждую строку в v-таблице, прежде чем он будет переопределен самим адресом функции класса (после инициализации) или чем-то более сложным, включая CRT и глобальные указатели?

Я спрашиваю это, потому что я не хочу, чтобы моя библиотека плагинов перезаписывала все обработчики _purecall приложения, конечно. Могу ли я быть уверен, что мой обработчик purecall будет обрабатывать только чистые вызовы в моем модуле?

Спасибо!

1 Ответ

1 голос
/ 18 марта 2011

Ответ сильно зависит от того, как ваш компилятор реализует обработчик purecall. Если компилятор просто заменяет «чистые» указатели функций в ваших таблицах виртуальных функций, тогда вы не можете изменить поведение родительского процесса.

Но некоторые компиляторы реализуют пользовательские обработчики purecall, вызывая ваш обработчик из обработчика CRT. В этом случае поведение будет зависеть от того, как вы создали свою DLL. Если вы статически связаны с CRT, то у вашей DLL будет свой экземпляр всех состояний CRT. В этом случае реализация компилятора не имеет значения. Ваш обработчик purecall не будет вмешиваться в родительский процесс.

С другой стороны, если вы динамически связаны с CRT, поведение будет зависеть от того, как был построен хост-процесс. Если бы он был динамически связан с той же версией CRT, что и ваша DLL, тогда ваш обработчик purecall действительно мог бы помешать. Но опять же, это зависит от реализации компилятора. Даже если он вызывает ваш хук из CRT, вы можете быть в безопасности, если CRT поддерживает разные хуки для каждого модуля.

В любом случае, если вы хотите быть уверенным в безопасности, вы должны либо статически связать свою DLL с CRT, либо избегать использования обработчика purecall (альтернативой может быть использование конкретных базовых классов вместо абстрактных).

...