xref: /reactos/sdk/lib/rtl/amd64/except.c (revision 83e741c6)
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