KiRaiseException
VOID __fastcall KiRaiseException(
_EXCEPTION_RECORD *ExceptionRecord,
_CONTEXT *ContextRecord,
_KEXCEPTION_FRAME *ExceptionFrame,
_KTRAP_FRAME *TrapFrame,
UINT8 FirstChance){
_KPROCESSOR_MODE v7;
char v8;
__int64 p_ContextFlags;
unsigned int v10;
unsigned __int64 v11;
signed __int64 v12;
void *v13;
void *v14;
_CONTEXT_EX *v15;
CHAR v16;
_CONTEXT *p_XState;
__int64 v18;
unsigned int v19;
char *v20;
_ETHREAD *CurrentThread;
int v22;
unsigned __int8 CurrentIrql;
bool v24;
_KTRAP_FRAME *v25;
_EXCEPTION_RECORD *v26;
UINT64 v27;
unsigned __int8 v28;
__int64 *PreviousMode;
UINT64 ContextFlags;
VOID *Src;
_CONTEXT_EX *ContextEx;
__int64 v33;
_KTRAP_FRAME *ExceptionFramea;
unsigned int v35;
__int128 v36;
__int64 v37;
int v38[40];
ExceptionFramea = (_KTRAP_FRAME *)ExceptionFrame;
Src = ExceptionRecord;
ContextEx = 0i64;
v33 = 0i64;
ContextFlags = 0i64;
memset(v38, 0i64, 0x98u);
v8 = KeGetCurrentThread()->PreviousMode;
if( !v8 )
{
LABEL_17:
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v22 = 1;
CurrentIrql = KeGetCurrentIrql();
if( !CurrentIrql )
{
KeGetCurrentIrql();
__writecr8(1ui64);
}
if( v8 )
{
if( (CurrentThread->Tcb._bf_0 & 0x100000) != 0 )
{
if( (int)KeVerifyContextXStateCetU((__int64)CurrentThread, ContextRecord, &v33) < 0
|| (v36 = 0i64, v37 = 0i64, PreviousMode = &v33, KeVerifyContextRecord(&CurrentThread->Tcb, ContextRecord) < 0) )
{
*((_DWORD *)Src + 1) |= 1u;
v22 = 0;
}
}
}
v24 = v22 == 0;
v25 = ExceptionFramea;
if( !v24 )
{
LOBYTE(PreviousMode) = v8;
KeContextToKframes(
TrapFrame,
ExceptionFramea,
ContextRecord,
ContextRecord->ContextFlags,
(_KPROCESSOR_MODE)PreviousMode);
}
if( !CurrentIrql )
__writecr8(0i64);
v26 = (_EXCEPTION_RECORD *)Src;
*(_DWORD *)Src &= ~0x10000000u;
LOBYTE(v7) = v8;
KiDispatchException(v26, (PKEXCEPTION_FRAME)v25, TrapFrame, v7, FirstChance);
if( v8
&& (CurrentThread->Tcb.gap0[3] & 2) != 0
&& (void *)TrapFrame->_Rip != CurrentThread->Tcb.Process->Pcb.InstrumentationCallback )
{
v28 = KeGetCurrentIrql();
__writecr8(1ui64);
KiSetupForInstrumentationReturn(TrapFrame, v27);
__writecr8(v28);
}
return;
}
p_ContextFlags = (__int64)&ContextRecord->ContextFlags;
if( (unsigned __int64)&ContextRecord->ContextFlags >= 0x7FFFFFFF0000i64 )
p_ContextFlags = 0x7FFFFFFF0000i64;
LODWORD(ContextFlags) = *(_DWORD *)p_ContextFlags;
if( RtlpSanitizeContextFlags(&ContextFlags, v8) >= 0 )
{
v10 = ContextFlags;
if( RtlGetExtendedContextLength((unsigned int)ContextFlags, (UINT64 *)((char *)&ContextFlags + 4)) >= 0 )
{
v11 = HIDWORD(ContextFlags) + 15i64;
if( v11 <= HIDWORD(ContextFlags) )
v11 = 0xFFFFFFFFFFFFFF0i64;
v12 = v11 & 0xFFFFFFFFFFFFFFF0ui64;
v13 = alloca(v12);
v14 = alloca(v12);
if( RtlInitializeExtendedContext(&ContextFlags, v10, &ContextEx) >= 0 )
{
p_XState = (_CONTEXT *)&ContextEx[-52].XState;
LOBYTE(v15) = 1;
if( RtlpReadExtendedContext(v16, v15, (UINT64)ContextEx, (VOID *)v10, (_CONTEXT_EX *)ContextRecord) >= 0 )
{
ContextRecord = p_XState;
v18 = (__int64)Src + 24;
if( (unsigned __int64)Src + 24 >= 0x7FFFFFFF0000i64 )
v18 = 0x7FFFFFFF0000i64;
v19 = *(_DWORD *)v18;
v35 = v19;
if( v19 <= 0xF )
{
HIDWORD(ContextFlags) = 8 * v19 + 32;
v20 = (char *)Src + HIDWORD(ContextFlags);
if( (unsigned __int64)v20 > 0x7FFFFFFF0000i64 || v20 < Src )
MEMORY[0x7FFFFFFF0000] = 0;
memmove(v38, Src, 8 * v19 + 32);
Src = v38;
v38[6] = v19;
goto LABEL_17;
}
}
}
}
}
}Referenced by:
NtRaiseException