В Windows x64 используется обработка исключений на основе таблиц (в отличие от x86, где используется обработка на основе фреймов).
Каждое изображение имеет таблицу связанных с ним структур (обычно генерируемых компилятором). Структура в основном описывает функцию (или ее часть) на изображении и содержит информацию о том, как разматывать стек в этой функции. Он также может содержать информацию об обработчике исключений, которая должна быть вызвана внутри функции.
При возникновении исключения система находит таблицу, которая принадлежит изображению, в котором произошло исключение, и использует таблицу для перемещения/разматывания стека до тех пор, пока она не удалит обработчик исключений, который мог бы обрабатывать исключение.
Это означает, что вы не можете использовать [fs:0]
для регистрации обработчика исключений.
Хотя можно создать таблицы RUNTIME_FUNCTION
для загруженного/сгенерированного изображения, а затем зарегистрировать его через RtlAddFunctionTable
или RtlInstallFunctionTableCallback
API.
Вы можете найти хорошие статьи об обработке исключений Windows x64 по адресу Nynaeve's blog.
Также в MSDN содержится статья о структурах, используемых для Exception Handling (x64).
Возможно, вы ищете функцию [AddVectoredExceptionHandler] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms679274.aspx)? – Jester
Да, это пропало, это было слишком полезно для использования вредоносными программами. SAFESEH - это большая тема, найдите помощь по поиску «обработка исключений ml64». –