From ee106783d06113971880f2f9e32e9437bfc1a01a Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Thu, 28 Aug 2003 03:07:56 +0000 Subject: [PATCH] Renamed EXCEPTION_FRAME to EXCEPTION_REGISTRATION_RECORD since that seems to be the official name. --- dlls/kernel/wowthunk.c | 4 ++-- dlls/msvcrt/cppexcept.c | 26 +++++++++++++------------- dlls/msvcrt/cppexcept.h | 10 +++++----- dlls/msvcrt/except.c | 20 ++++++++++---------- dlls/ntdll/exception.c | 36 ++++++++++++++++++------------------ include/stackframe.h | 2 +- include/thread.h | 3 +-- include/wine/exception.h | 20 ++++++++++---------- include/winnt.h | 12 ++++++------ programs/winedbg/info.c | 2 +- 10 files changed, 67 insertions(+), 68 deletions(-) diff --git a/dlls/kernel/wowthunk.c b/dlls/kernel/wowthunk.c index c1e76800bf1..a281efc96e7 100644 --- a/dlls/kernel/wowthunk.c +++ b/dlls/kernel/wowthunk.c @@ -157,8 +157,8 @@ static BOOL fix_selector( CONTEXT *context ) * * Handler for exceptions occurring in 16-bit code. */ -static DWORD call16_handler( EXCEPTION_RECORD *record, EXCEPTION_FRAME *frame, - CONTEXT *context, EXCEPTION_FRAME **pdispatcher ) +static DWORD call16_handler( EXCEPTION_RECORD *record, EXCEPTION_REGISTRATION_RECORD *frame, + CONTEXT *context, EXCEPTION_REGISTRATION_RECORD **pdispatcher ) { if (record->ExceptionFlags & (EH_UNWINDING | EH_EXIT_UNWIND)) { diff --git a/dlls/msvcrt/cppexcept.c b/dlls/msvcrt/cppexcept.c index b0437f7217d..36fdc240584 100644 --- a/dlls/msvcrt/cppexcept.c +++ b/dlls/msvcrt/cppexcept.c @@ -39,8 +39,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(seh); #ifdef __i386__ /* CxxFrameHandler is not supported on non-i386 */ static DWORD cxx_frame_handler( PEXCEPTION_RECORD rec, cxx_exception_frame* frame, - PCONTEXT exc_context, EXCEPTION_FRAME** dispatch, - cxx_function_descr *descr, EXCEPTION_FRAME* nested_frame, + PCONTEXT exc_context, EXCEPTION_REGISTRATION_RECORD** dispatch, + cxx_function_descr *descr, EXCEPTION_REGISTRATION_RECORD* nested_frame, int nested_trylevel, CONTEXT86 *context ); /* call a function with a given ebp */ @@ -226,16 +226,16 @@ static void cxx_local_unwind( cxx_exception_frame* frame, cxx_function_descr *de /* exception frame for nested exceptions in catch block */ struct catch_func_nested_frame { - EXCEPTION_FRAME frame; /* standard exception frame */ - EXCEPTION_RECORD *prev_rec; /* previous record to restore in thread data */ - cxx_exception_frame *cxx_frame; /* frame of parent exception */ - cxx_function_descr *descr; /* descriptor of parent exception */ - int trylevel; /* current try level */ + EXCEPTION_REGISTRATION_RECORD frame; /* standard exception frame */ + EXCEPTION_RECORD *prev_rec; /* previous record to restore in thread data */ + cxx_exception_frame *cxx_frame; /* frame of parent exception */ + cxx_function_descr *descr; /* descriptor of parent exception */ + int trylevel; /* current try level */ }; /* handler for exceptions happening while calling a catch function */ -static DWORD catch_function_nested_handler( EXCEPTION_RECORD *rec, EXCEPTION_FRAME *frame, - CONTEXT *context, EXCEPTION_FRAME **dispatcher ) +static DWORD catch_function_nested_handler( EXCEPTION_RECORD *rec, EXCEPTION_REGISTRATION_RECORD *frame, + CONTEXT *context, EXCEPTION_REGISTRATION_RECORD **dispatcher ) { struct catch_func_nested_frame *nested_frame = (struct catch_func_nested_frame *)frame; @@ -323,8 +323,8 @@ inline static void *call_catch_block( PEXCEPTION_RECORD rec, cxx_exception_frame * Implementation of __CxxFrameHandler. */ static DWORD cxx_frame_handler( PEXCEPTION_RECORD rec, cxx_exception_frame* frame, - PCONTEXT exc_context, EXCEPTION_FRAME** dispatch, - cxx_function_descr *descr, EXCEPTION_FRAME* nested_frame, + PCONTEXT exc_context, EXCEPTION_REGISTRATION_RECORD** dispatch, + cxx_function_descr *descr, EXCEPTION_REGISTRATION_RECORD* nested_frame, int nested_trylevel, CONTEXT86 *context ) { cxx_exception_type *exc_type; @@ -379,8 +379,8 @@ static DWORD cxx_frame_handler( PEXCEPTION_RECORD rec, cxx_exception_frame* fram /********************************************************************* * __CxxFrameHandler (MSVCRT.@) */ -void __CxxFrameHandler( PEXCEPTION_RECORD rec, EXCEPTION_FRAME* frame, - PCONTEXT exc_context, EXCEPTION_FRAME** dispatch, +void __CxxFrameHandler( PEXCEPTION_RECORD rec, EXCEPTION_REGISTRATION_RECORD* frame, + PCONTEXT exc_context, EXCEPTION_REGISTRATION_RECORD** dispatch, CONTEXT86 *context ) { cxx_function_descr *descr = (cxx_function_descr *)context->Eax; diff --git a/dlls/msvcrt/cppexcept.h b/dlls/msvcrt/cppexcept.h index 4d2213c9980..3a822ed9ec0 100644 --- a/dlls/msvcrt/cppexcept.h +++ b/dlls/msvcrt/cppexcept.h @@ -37,9 +37,9 @@ typedef struct __type_info /* the exception frame used by CxxFrameHandler */ typedef struct __cxx_exception_frame { - EXCEPTION_FRAME frame; /* the standard exception frame */ - int trylevel; - DWORD ebp; + EXCEPTION_REGISTRATION_RECORD frame; /* the standard exception frame */ + int trylevel; + DWORD ebp; } cxx_exception_frame; /* info about a single catch {} block */ @@ -106,9 +106,9 @@ typedef struct __cxx_type_info_table } cxx_type_info_table; typedef DWORD (*cxx_exc_custom_handler)( PEXCEPTION_RECORD, cxx_exception_frame*, - PCONTEXT, struct __EXCEPTION_FRAME**, + PCONTEXT, EXCEPTION_REGISTRATION_RECORD**, cxx_function_descr*, int nested_trylevel, - EXCEPTION_FRAME *nested_frame, DWORD unknown3 ); + EXCEPTION_REGISTRATION_RECORD *nested_frame, DWORD unknown3 ); /* type information for an exception object */ typedef struct __cxx_exception_type diff --git a/dlls/msvcrt/except.c b/dlls/msvcrt/except.c index f281e3e51ab..2c0dbf5ea65 100644 --- a/dlls/msvcrt/except.c +++ b/dlls/msvcrt/except.c @@ -53,8 +53,8 @@ typedef struct _SCOPETABLE typedef struct _MSVCRT_EXCEPTION_FRAME { - EXCEPTION_FRAME *prev; - void (*handler)(PEXCEPTION_RECORD, PEXCEPTION_FRAME, + EXCEPTION_REGISTRATION_RECORD *prev; + void (*handler)(PEXCEPTION_RECORD, PEXCEPTION_REGISTRATION_RECORD, PCONTEXT, PEXCEPTION_RECORD); PSCOPETABLE scopetable; int trylevel; @@ -83,9 +83,9 @@ inline static DWORD call_filter( void *func, void *arg, void *ebp ) #endif static DWORD MSVCRT_nested_handler(PEXCEPTION_RECORD rec, - struct __EXCEPTION_FRAME* frame, + EXCEPTION_REGISTRATION_RECORD* frame, PCONTEXT context WINE_UNUSED, - struct __EXCEPTION_FRAME** dispatch) + EXCEPTION_REGISTRATION_RECORD** dispatch) { if (rec->ExceptionFlags & 0x6) return ExceptionContinueSearch; @@ -123,7 +123,7 @@ __ASM_GLOBAL_FUNC(_EH_prolog, /******************************************************************* * _global_unwind2 (MSVCRT.@) */ -void _global_unwind2(PEXCEPTION_FRAME frame) +void _global_unwind2(PEXCEPTION_REGISTRATION_RECORD frame) { TRACE("(%p)\n",frame); RtlUnwind( frame, 0, 0, 0 ); @@ -135,7 +135,7 @@ void _global_unwind2(PEXCEPTION_FRAME frame) void _local_unwind2(MSVCRT_EXCEPTION_FRAME* frame, int trylevel) { MSVCRT_EXCEPTION_FRAME *curframe = frame; - EXCEPTION_FRAME reg; + EXCEPTION_REGISTRATION_RECORD reg; TRACE("(%p,%d,%d)\n",frame, frame->trylevel, trylevel); @@ -165,9 +165,9 @@ void _local_unwind2(MSVCRT_EXCEPTION_FRAME* frame, int trylevel) * _except_handler2 (MSVCRT.@) */ int _except_handler2(PEXCEPTION_RECORD rec, - PEXCEPTION_FRAME frame, + PEXCEPTION_REGISTRATION_RECORD frame, PCONTEXT context, - PEXCEPTION_FRAME* dispatcher) + PEXCEPTION_REGISTRATION_RECORD* dispatcher) { FIXME("exception %lx flags=%lx at %p handler=%p %p %p stub\n", rec->ExceptionCode, rec->ExceptionFlags, rec->ExceptionAddress, @@ -227,7 +227,7 @@ int _except_handler3(PEXCEPTION_RECORD rec, if (retval == EXCEPTION_EXECUTE_HANDLER) { /* Unwind all higher frames, this one will handle the exception */ - _global_unwind2((PEXCEPTION_FRAME)frame); + _global_unwind2((PEXCEPTION_REGISTRATION_RECORD)frame); _local_unwind2(frame, trylevel); /* Set our trylevel to the enclosing block, and call the __finally @@ -343,7 +343,7 @@ void _MSVCRT_longjmp(_JUMP_BUFFER *jmp, int retval, CONTEXT86* context) TRACE("cur_frame=%lx\n",cur_frame); if (cur_frame != jmp->Registration) - _global_unwind2((PEXCEPTION_FRAME)jmp->Registration); + _global_unwind2((PEXCEPTION_REGISTRATION_RECORD)jmp->Registration); if (jmp->Registration) { diff --git a/dlls/ntdll/exception.c b/dlls/ntdll/exception.c index c0a6f939a22..97ba89167c7 100644 --- a/dlls/ntdll/exception.c +++ b/dlls/ntdll/exception.c @@ -37,8 +37,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(seh); /* Exception record for handling exceptions happening inside exception handlers */ typedef struct { - EXCEPTION_FRAME frame; - EXCEPTION_FRAME *prevFrame; + EXCEPTION_REGISTRATION_RECORD frame; + EXCEPTION_REGISTRATION_RECORD *prevFrame; } EXC_NESTED_FRAME; #ifdef __i386__ @@ -52,7 +52,7 @@ typedef struct #endif void WINAPI EXC_RtlRaiseException( PEXCEPTION_RECORD, PCONTEXT ); -void WINAPI EXC_RtlUnwind( PEXCEPTION_FRAME, LPVOID, +void WINAPI EXC_RtlUnwind( PEXCEPTION_REGISTRATION_RECORD, LPVOID, PEXCEPTION_RECORD, DWORD, PCONTEXT ); void WINAPI EXC_NtRaiseException( PEXCEPTION_RECORD, PCONTEXT, BOOL, PCONTEXT ); @@ -62,8 +62,8 @@ void WINAPI EXC_NtRaiseException( PEXCEPTION_RECORD, PCONTEXT, * * Handler for exceptions happening inside a handler. */ -static DWORD EXC_RaiseHandler( EXCEPTION_RECORD *rec, EXCEPTION_FRAME *frame, - CONTEXT *context, EXCEPTION_FRAME **dispatcher ) +static DWORD EXC_RaiseHandler( EXCEPTION_RECORD *rec, EXCEPTION_REGISTRATION_RECORD *frame, + CONTEXT *context, EXCEPTION_REGISTRATION_RECORD **dispatcher ) { if (rec->ExceptionFlags & (EH_UNWINDING | EH_EXIT_UNWIND)) return ExceptionContinueSearch; @@ -78,8 +78,8 @@ static DWORD EXC_RaiseHandler( EXCEPTION_RECORD *rec, EXCEPTION_FRAME *frame, * * Handler for exceptions happening inside an unwind handler. */ -static DWORD EXC_UnwindHandler( EXCEPTION_RECORD *rec, EXCEPTION_FRAME *frame, - CONTEXT *context, EXCEPTION_FRAME **dispatcher ) +static DWORD EXC_UnwindHandler( EXCEPTION_RECORD *rec, EXCEPTION_REGISTRATION_RECORD *frame, + CONTEXT *context, EXCEPTION_REGISTRATION_RECORD **dispatcher ) { if (!(rec->ExceptionFlags & (EH_UNWINDING | EH_EXIT_UNWIND))) return ExceptionContinueSearch; @@ -97,8 +97,8 @@ static DWORD EXC_UnwindHandler( EXCEPTION_RECORD *rec, EXCEPTION_FRAME *frame, * Please do not change the first 4 parameters order in any way - some exceptions handlers * rely on Base Pointer (EBP) to have a fixed position related to the exception frame */ -static DWORD EXC_CallHandler( EXCEPTION_RECORD *record, EXCEPTION_FRAME *frame, - CONTEXT *context, EXCEPTION_FRAME **dispatcher, +static DWORD EXC_CallHandler( EXCEPTION_RECORD *record, EXCEPTION_REGISTRATION_RECORD *frame, + CONTEXT *context, EXCEPTION_REGISTRATION_RECORD **dispatcher, PEXCEPTION_HANDLER handler, PEXCEPTION_HANDLER nested_handler) { EXC_NESTED_FRAME newframe; @@ -179,7 +179,7 @@ static void EXC_DefaultHandling( EXCEPTION_RECORD *rec, CONTEXT *context ) DEFINE_REGS_ENTRYPOINT_1( RtlRaiseException, EXC_RtlRaiseException, EXCEPTION_RECORD * ); void WINAPI EXC_RtlRaiseException( EXCEPTION_RECORD *rec, CONTEXT *context ) { - PEXCEPTION_FRAME frame, dispatch, nested_frame; + PEXCEPTION_REGISTRATION_RECORD frame, dispatch, nested_frame; EXCEPTION_RECORD newrec; DWORD res, c; @@ -195,7 +195,7 @@ void WINAPI EXC_RtlRaiseException( EXCEPTION_RECORD *rec, CONTEXT *context ) frame = NtCurrentTeb()->except; nested_frame = NULL; - while (frame != (PEXCEPTION_FRAME)0xFFFFFFFF) + while (frame != (PEXCEPTION_REGISTRATION_RECORD)~0UL) { /* Check frame address */ if (((void*)frame < NtCurrentTeb()->stack_low) || @@ -250,12 +250,12 @@ void WINAPI EXC_RtlRaiseException( EXCEPTION_RECORD *rec, CONTEXT *context ) */ DEFINE_REGS_ENTRYPOINT_4( RtlUnwind, EXC_RtlUnwind, PVOID, PVOID, PEXCEPTION_RECORD, PVOID ); -void WINAPI EXC_RtlUnwind( PEXCEPTION_FRAME pEndFrame, LPVOID unusedEip, +void WINAPI EXC_RtlUnwind( PEXCEPTION_REGISTRATION_RECORD pEndFrame, LPVOID unusedEip, PEXCEPTION_RECORD pRecord, DWORD returnEax, CONTEXT *context ) { EXCEPTION_RECORD record, newrec; - PEXCEPTION_FRAME frame, dispatch; + PEXCEPTION_REGISTRATION_RECORD frame, dispatch; #ifdef __i386__ context->Eax = returnEax; @@ -278,7 +278,7 @@ void WINAPI EXC_RtlUnwind( PEXCEPTION_FRAME pEndFrame, LPVOID unusedEip, /* get chain of exception frames */ frame = NtCurrentTeb()->except; - while ((frame != (PEXCEPTION_FRAME)0xffffffff) && (frame != pEndFrame)) + while ((frame != (PEXCEPTION_REGISTRATION_RECORD)~0UL) && (frame != pEndFrame)) { /* Check frame address */ if (pEndFrame && (frame > pEndFrame)) @@ -357,8 +357,8 @@ void WINAPI RtlRaiseStatus( NTSTATUS status ) * * Exception handler for exception blocks declared in Wine code. */ -DWORD __wine_exception_handler( EXCEPTION_RECORD *record, EXCEPTION_FRAME *frame, - CONTEXT *context, LPVOID pdispatcher ) +DWORD __wine_exception_handler( EXCEPTION_RECORD *record, EXCEPTION_REGISTRATION_RECORD *frame, + CONTEXT *context, EXCEPTION_REGISTRATION_RECORD **pdispatcher ) { __WINE_FRAME *wine_frame = (__WINE_FRAME *)frame; @@ -397,8 +397,8 @@ DWORD __wine_exception_handler( EXCEPTION_RECORD *record, EXCEPTION_FRAME *frame * * Exception handler for try/finally blocks declared in Wine code. */ -DWORD __wine_finally_handler( EXCEPTION_RECORD *record, EXCEPTION_FRAME *frame, - CONTEXT *context, LPVOID pdispatcher ) +DWORD __wine_finally_handler( EXCEPTION_RECORD *record, EXCEPTION_REGISTRATION_RECORD *frame, + CONTEXT *context, EXCEPTION_REGISTRATION_RECORD **pdispatcher ) { if (record->ExceptionFlags & (EH_UNWINDING | EH_EXIT_UNWIND)) { diff --git a/include/stackframe.h b/include/stackframe.h index c880adbe241..80e3f39e8f5 100644 --- a/include/stackframe.h +++ b/include/stackframe.h @@ -34,7 +34,7 @@ typedef struct _STACK32FRAME { DWORD restore_addr; /* 00 return address for restoring code selector */ DWORD codeselector; /* 04 code selector to restore */ - EXCEPTION_FRAME frame; /* 08 Exception frame */ + EXCEPTION_REGISTRATION_RECORD frame; /* 08 Exception frame */ SEGPTR frame16; /* 10 16-bit frame from last CallFrom16() */ DWORD edi; /* 14 saved registers */ DWORD esi; /* 18 */ diff --git a/include/thread.h b/include/thread.h index 37fcc5ec032..f955336675d 100644 --- a/include/thread.h +++ b/include/thread.h @@ -24,7 +24,6 @@ #include "winternl.h" #include "wine/windef16.h" -struct __EXCEPTION_FRAME; struct _SECURITY_ATTRIBUTES; struct tagSYSLEVEL; struct server_buffer_info; @@ -55,7 +54,7 @@ struct debug_info typedef struct _TEB { /* start of NT_TIB */ - struct __EXCEPTION_FRAME *except; /* 12- 00 Head of exception handling chain */ + EXCEPTION_REGISTRATION_RECORD *except; /* 12- 00 Head of exception handling chain */ void *stack_top; /* 12- 04 Top of thread stack */ void *stack_low; /* 12- 08 Stack low-water mark */ HTASK16 htask16; /* 1-- 0c Win16 task handle */ diff --git a/include/wine/exception.h b/include/wine/exception.h index eca4527724f..c5b58ec085d 100644 --- a/include/wine/exception.h +++ b/include/wine/exception.h @@ -86,7 +86,7 @@ __wine_pop_frame( &__f.frame ); \ break; \ } else { \ - __f.frame.Handler = (PEXCEPTION_HANDLER)__wine_exception_handler; \ + __f.frame.Handler = __wine_exception_handler; \ __f.u.filter = (func); \ __wine_push_frame( &__f.frame ); \ if (setjmp( __f.jmp)) { \ @@ -107,7 +107,7 @@ (func)(1); \ break; \ } else { \ - __f.frame.Handler = (PEXCEPTION_HANDLER)__wine_finally_handler; \ + __f.frame.Handler = __wine_finally_handler; \ __f.u.finally_func = (func); \ __wine_push_frame( &__f.frame ); \ __first = 0; \ @@ -127,7 +127,7 @@ typedef void (CALLBACK *__WINE_FINALLY)(BOOL); typedef struct __tagWINE_FRAME { - EXCEPTION_FRAME frame; + EXCEPTION_REGISTRATION_RECORD frame; union { /* exception data */ @@ -141,17 +141,17 @@ typedef struct __tagWINE_FRAME const struct __tagWINE_FRAME *ExceptionRecord; } __WINE_FRAME; -extern DWORD __wine_exception_handler( PEXCEPTION_RECORD record, EXCEPTION_FRAME *frame, - CONTEXT *context, LPVOID pdispatcher ); -extern DWORD __wine_finally_handler( PEXCEPTION_RECORD record, EXCEPTION_FRAME *frame, - CONTEXT *context, LPVOID pdispatcher ); +extern DWORD __wine_exception_handler( PEXCEPTION_RECORD record, EXCEPTION_REGISTRATION_RECORD *frame, + CONTEXT *context, EXCEPTION_REGISTRATION_RECORD **pdispatcher ); +extern DWORD __wine_finally_handler( PEXCEPTION_RECORD record, EXCEPTION_REGISTRATION_RECORD *frame, + CONTEXT *context, EXCEPTION_REGISTRATION_RECORD **pdispatcher ); #endif /* USE_COMPILER_EXCEPTIONS */ -static inline EXCEPTION_FRAME * WINE_UNUSED __wine_push_frame( EXCEPTION_FRAME *frame ) +static inline EXCEPTION_REGISTRATION_RECORD *__wine_push_frame( EXCEPTION_REGISTRATION_RECORD *frame ) { #if defined(__GNUC__) && defined(__i386__) - EXCEPTION_FRAME *prev; + EXCEPTION_REGISTRATION_RECORD *prev; __asm__ __volatile__(".byte 0x64\n\tmovl (0),%0" "\n\tmovl %0,(%1)" "\n\t.byte 0x64\n\tmovl %1,(0)" @@ -165,7 +165,7 @@ static inline EXCEPTION_FRAME * WINE_UNUSED __wine_push_frame( EXCEPTION_FRAME * #endif } -static inline EXCEPTION_FRAME * WINE_UNUSED __wine_pop_frame( EXCEPTION_FRAME *frame ) +static inline EXCEPTION_REGISTRATION_RECORD *__wine_pop_frame( EXCEPTION_REGISTRATION_RECORD *frame ) { #if defined(__GNUC__) && defined(__i386__) __asm__ __volatile__(".byte 0x64\n\tmovl %0,(0)" diff --git a/include/winnt.h b/include/winnt.h index 667d193823c..ac7e9f2e55e 100644 --- a/include/winnt.h +++ b/include/winnt.h @@ -1570,16 +1570,16 @@ typedef struct _EXCEPTION_POINTERS * larger exception frames for their own use. */ -struct __EXCEPTION_FRAME; +struct _EXCEPTION_REGISTRATION_RECORD; -typedef DWORD (*PEXCEPTION_HANDLER)(PEXCEPTION_RECORD,struct __EXCEPTION_FRAME*, - PCONTEXT,struct __EXCEPTION_FRAME **); +typedef DWORD (*PEXCEPTION_HANDLER)(PEXCEPTION_RECORD,struct _EXCEPTION_REGISTRATION_RECORD*, + PCONTEXT,struct _EXCEPTION_REGISTRATION_RECORD **); -typedef struct __EXCEPTION_FRAME +typedef struct _EXCEPTION_REGISTRATION_RECORD { - struct __EXCEPTION_FRAME *Prev; + struct _EXCEPTION_REGISTRATION_RECORD *Prev; PEXCEPTION_HANDLER Handler; -} EXCEPTION_FRAME, *PEXCEPTION_FRAME; +} EXCEPTION_REGISTRATION_RECORD, *PEXCEPTION_REGISTRATION_RECORD; /* * function pointer to a exception filter diff --git a/programs/winedbg/info.c b/programs/winedbg/info.c index ac2ab2f7b80..a6dad14a4c6 100644 --- a/programs/winedbg/info.c +++ b/programs/winedbg/info.c @@ -570,7 +570,7 @@ void DEBUG_WalkExceptions(DWORD tid) while (next_frame != (void *)-1) { - EXCEPTION_FRAME frame; + EXCEPTION_REGISTRATION_RECORD frame; DEBUG_Printf( DBG_CHN_MESG, "%p: ", next_frame ); if (!DEBUG_READ_MEM(next_frame, &frame, sizeof(frame)))