KiRaiseException
NTSTATUS __stdcall KiRaiseException(
_EXCEPTION_RECORD *ExceptionRecord,
_CONTEXT *ContextRecord,
_KEXCEPTION_FRAME *ExceptionFrame,
_KTRAP_FRAME *TrapFrame,
UINT8 FirstChance){
CHAR PreviousMode;
__int64 p_ContextFlags;
NTSTATUS ExtendedContextLength;
unsigned int v10;
unsigned __int64 v11;
signed __int64 v12;
void *v13;
void *v14;
UINT64 *v15;
INT64 *v16;
_CONTEXT *v17;
__int64 v18;
unsigned int v19;
char *v20;
_KTHREAD *CurrentThread;
int v22;
unsigned __int8 CurrentIrql;
bool v24;
_KEXCEPTION_FRAME *v25;
_EXCEPTION_RECORD *v26;
UINT64 v27;
unsigned __int8 v28;
UINT64 ContextFlags;
void *Src;
BYTE *v31;
__int64 a3;
_KEXCEPTION_FRAME *ExceptionFramea;
unsigned int v34;
__int128 v35;
__int64 v36;
INT64 result[3];
unsigned int v38;
ExceptionFramea = ExceptionFrame;
Src = ExceptionRecord;
v31 = 0i64;
a3 = 0i64;
ContextFlags = 0i64;
memset((INT64)result, 0i64);
PreviousMode = *((_BYTE *)KeGetCurrentThread() + 562);
if( !PreviousMode )
{
LABEL_18:
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v22 = 1;
CurrentIrql = KeGetCurrentIrql();
if( !CurrentIrql )
{
KeGetCurrentIrql();
__writecr8(1ui64);
}
if( PreviousMode )
{
if( (*((_DWORD *)CurrentThread + 29) & 0x100000) != 0 )
{
if( (int)KeVerifyContextXStateCetU((INT64)CurrentThread, ContextRecord, &a3) < 0
|| (v35 = 0i64, v36 = 0i64, KeVerifyContextRecord((_KTHREAD *)CurrentThread, ContextRecord) < 0) )
{
*((_DWORD *)Src + 1) |= 1u;
v22 = 0;
}
}
}
v24 = v22 == 0;
v25 = ExceptionFramea;
if( !v24 )
KeContextToKframes(TrapFrame, ExceptionFramea, ContextRecord, ContextRecord->ContextFlags, PreviousMode);
if( !CurrentIrql )
__writecr8(0i64);
v26 = (_EXCEPTION_RECORD *)Src;
*(_DWORD *)Src &= ~0x10000000u;
KiDispatchException(v26, v25, TrapFrame, PreviousMode, FirstChance);
if( PreviousMode
&& (*((_BYTE *)CurrentThread + 3) & 2) != 0
&& TrapFrame->Rip != *(_QWORD *)(*((_QWORD *)CurrentThread + 68) + 984i64) )
{
v28 = KeGetCurrentIrql();
__writecr8(1ui64);
KiSetupForInstrumentationReturn(TrapFrame, v27);
__writecr8(v28);
}
return 0;
}
p_ContextFlags = (__int64)&ContextRecord->ContextFlags;
if( (unsigned __int64)&ContextRecord->ContextFlags >= 0x7FFFFFFF0000i64 )
p_ContextFlags = 0x7FFFFFFF0000i64;
LODWORD(ContextFlags) = *(_DWORD *)p_ContextFlags;
ExtendedContextLength = RtlpSanitizeContextFlags(&ContextFlags, PreviousMode);
if( ExtendedContextLength >= 0 )
{
v10 = ContextFlags;
ExtendedContextLength = RtlGetExtendedContextLength(
(unsigned int)ContextFlags,
(UINT64 *)((char *)&ContextFlags + 4));
if( ExtendedContextLength >= 0 )
{
v11 = HIDWORD(ContextFlags) + 15i64;
if( v11 <= HIDWORD(ContextFlags) )
v11 = 0xFFFFFFFFFFFFFF0i64;
v12 = v11 & 0xFFFFFFFFFFFFFFF0ui64;
v13 = alloca(v12);
v14 = alloca(v12);
ExtendedContextLength = RtlInitializeExtendedContext((INT64)&ContextFlags, v10, &v31);
if( ExtendedContextLength >= 0 )
{
v17 = (_CONTEXT *)(v31 - 1232);
LOBYTE(v15) = 1;
ExtendedContextLength = RtlpReadExtendedContext(v16, v15, v31);
if( ExtendedContextLength >= 0 )
{
ContextRecord = v17;
v18 = (__int64)Src + 24;
if( (unsigned __int64)Src + 24 >= 0x7FFFFFFF0000i64 )
v18 = 0x7FFFFFFF0000i64;
v19 = *(_DWORD *)v18;
v34 = v19;
if( v19 > 0xF )
return -1073741811;
HIDWORD(ContextFlags) = 8 * v19 + 32;
v20 = (char *)Src + HIDWORD(ContextFlags);
if( (unsigned __int64)v20 > 0x7FFFFFFF0000i64 || v20 < Src )
MEMORY[0x7FFFFFFF0000] = 0;
memmove((UINT8 *)result, (UINT8 *)Src, 8 * v19 + 32);
Src = result;
v38 = v19;
goto LABEL_18;
}
}
}
}
return ExtendedContextLength;
}Referenced by:
NtRaiseException