15075f7d7STimo Kreuzer /*
25075f7d7STimo Kreuzer * PROJECT: ReactOS Run-Time Library
35075f7d7STimo Kreuzer * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
45075f7d7STimo Kreuzer * PURPOSE: User-mode exception support for AMD64
55075f7d7STimo Kreuzer * COPYRIGHT: Copyright 2018-2021 Timo Kreuzer <timo.kreuzer@reactos.org>
65075f7d7STimo Kreuzer */
75075f7d7STimo Kreuzer
85075f7d7STimo Kreuzer /* INCLUDES *****************************************************************/
95075f7d7STimo Kreuzer
105075f7d7STimo Kreuzer #include <rtl.h>
115075f7d7STimo Kreuzer #define NDEBUG
125075f7d7STimo Kreuzer #include <debug.h>
135075f7d7STimo Kreuzer
145075f7d7STimo Kreuzer /* PUBLIC FUNCTIONS **********************************************************/
155075f7d7STimo Kreuzer
165075f7d7STimo Kreuzer /*
175075f7d7STimo Kreuzer * @unimplemented
185075f7d7STimo Kreuzer */
195075f7d7STimo Kreuzer PVOID
205075f7d7STimo Kreuzer NTAPI
RtlpGetExceptionAddress(VOID)215075f7d7STimo Kreuzer RtlpGetExceptionAddress(VOID)
225075f7d7STimo Kreuzer {
235075f7d7STimo Kreuzer UNIMPLEMENTED;
245075f7d7STimo Kreuzer return NULL;
255075f7d7STimo Kreuzer }
265075f7d7STimo Kreuzer
273ec1ca9bSTimo Kreuzer BOOLEAN
283ec1ca9bSTimo Kreuzer NTAPI
29*3ba1d82cSKento Oki RtlpUnwindInternal(
303ec1ca9bSTimo Kreuzer _In_opt_ PVOID TargetFrame,
313ec1ca9bSTimo Kreuzer _In_opt_ PVOID TargetIp,
323ec1ca9bSTimo Kreuzer _In_ PEXCEPTION_RECORD ExceptionRecord,
333ec1ca9bSTimo Kreuzer _In_ PVOID ReturnValue,
343ec1ca9bSTimo Kreuzer _In_ PCONTEXT ContextRecord,
353ec1ca9bSTimo Kreuzer _In_opt_ struct _UNWIND_HISTORY_TABLE *HistoryTable,
363ec1ca9bSTimo Kreuzer _In_ ULONG Flags);
373ec1ca9bSTimo Kreuzer
385075f7d7STimo Kreuzer /*
395075f7d7STimo Kreuzer * @unimplemented
405075f7d7STimo Kreuzer */
415075f7d7STimo Kreuzer BOOLEAN
425075f7d7STimo Kreuzer NTAPI
RtlDispatchException(_In_ PEXCEPTION_RECORD ExceptionRecord,_In_ PCONTEXT ContextRecord)433ec1ca9bSTimo Kreuzer RtlDispatchException(
443ec1ca9bSTimo Kreuzer _In_ PEXCEPTION_RECORD ExceptionRecord,
453ec1ca9bSTimo Kreuzer _In_ PCONTEXT ContextRecord)
465075f7d7STimo Kreuzer {
473ec1ca9bSTimo Kreuzer BOOLEAN Handled;
483ec1ca9bSTimo Kreuzer
493ec1ca9bSTimo Kreuzer /* Perform vectored exception handling for user mode */
503ec1ca9bSTimo Kreuzer if (RtlCallVectoredExceptionHandlers(ExceptionRecord, ContextRecord))
513ec1ca9bSTimo Kreuzer {
523ec1ca9bSTimo Kreuzer /* Exception handled, now call vectored continue handlers */
533ec1ca9bSTimo Kreuzer RtlCallVectoredContinueHandlers(ExceptionRecord, ContextRecord);
543ec1ca9bSTimo Kreuzer
553ec1ca9bSTimo Kreuzer /* Continue execution */
563ec1ca9bSTimo Kreuzer return TRUE;
573ec1ca9bSTimo Kreuzer }
583ec1ca9bSTimo Kreuzer
593ec1ca9bSTimo Kreuzer /* Call the internal unwind routine */
60*3ba1d82cSKento Oki Handled = RtlpUnwindInternal(NULL, // TargetFrame
613ec1ca9bSTimo Kreuzer NULL, // TargetIp
623ec1ca9bSTimo Kreuzer ExceptionRecord,
633ec1ca9bSTimo Kreuzer 0, // ReturnValue
643ec1ca9bSTimo Kreuzer ContextRecord,
653ec1ca9bSTimo Kreuzer NULL, // HistoryTable
663ec1ca9bSTimo Kreuzer UNW_FLAG_EHANDLER);
673ec1ca9bSTimo Kreuzer
683ec1ca9bSTimo Kreuzer /* In user mode, call any registered vectored continue handlers */
693ec1ca9bSTimo Kreuzer RtlCallVectoredContinueHandlers(ExceptionRecord, ContextRecord);
703ec1ca9bSTimo Kreuzer
713ec1ca9bSTimo Kreuzer return Handled;
725075f7d7STimo Kreuzer }
73