Обработчик конкретного языка
Относительный адрес обработчика языка присутствует в UNWIND_INFO, когда бы ни были установлены флаги UNW_FLAG_EHANDLER или UNW_FLAG_UHANDLER.Как описано в предыдущем разделе, обработчик языка вызывается как часть поиска обработчика исключения или часть раскрутки.Он имеет следующий прототип:
typedef EXCEPTION_DISPOSITION (*PEXCEPTION_ROUTINE) (
IN PEXCEPTION_RECORD ExceptionRecord,
IN ULONG64 EstablisherFrame,
IN OUT PCONTEXT ContextRecord,
IN OUT PDISPATCHER_CONTEXT DispatcherContext
);
ExceptionRecord предоставляет указатель на запись исключения, имеющий стандартное определение Win64.
EstablisherFrame представляет собой адрес базы фиксированного расположения стека для данной функции.
ContextRecord указывает на контекст исключения во время его возникновения (в случае если задействован обработчик событий) или текущий контекст "раскрутки" (в случае если задействован обработчик завершения).
DispatcherContext указывает на контекст диспетчера для данной функции.Он имеет следующее определение:
typedef struct _DISPATCHER_CONTEXT {
ULONG64 ControlPc;
ULONG64 ImageBase;
PRUNTIME_FUNCTION FunctionEntry;
ULONG64 EstablisherFrame;
ULONG64 TargetIp;
PCONTEXT ContextRecord;
PEXCEPTION_ROUTINE LanguageHandler;
PVOID HandlerData;
} DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
ControlPc представляет собой значение RIP в рамках данной функции.Это может быть адрес исключения или адрес, на котором элемент прекратил функцию установления.Этот RIP будет использоваться для определения, находится ли элемент управления в рамках защищенной конструкции в данной функции (например, блок __try для __try/__except или __try/__finally).
ImageBase представляет собой основу образа (адрес загрузки) модуля, содержащего данную функцию, которую необходимо добавить в 32-битные смещения, используемые в записи функции, а также в информации раскрутки для записи относительных адресов.
FunctionEntry предоставляет указатель записи функции RUNTIME_FUNCTION, содержащей саму функцию и относительные адреса информации раскрутки основного образа для данной функции.
EstablisherFrame представляет собой адрес базы фиксированного расположения стека для данной функции.
TargetIp предоставляет адреса выборочных инструкций, указывающие дополнительные адреса раскрутки.Этот адрес пропускается, если не было указано EstablisherFrame.
ContextRecord указывает на контекст исключения, используемый кодом диспетчеризации или раскрутки системного исключения.
LanguageHandler указывает на подпрограмму вызванного языкового обработчика.
HandlerData указывает на данные языкового обработчика для данной функции.