KiContinueEx
NTSTATUS __stdcall KiContinueEx(
PCONTEXT ContextRecord,
BOOL TestAlert,
PKEXCEPTION_FRAME ExceptionFrame,
PKTRAP_FRAME TrapFrame){
bool v6;
unsigned __int8 CurrentIrql;
_ETHREAD *CurrentThread;
bool v10;
bool v11;
__int64 v12;
int v13;
bool v15;
NTSTATUS v16;
v6 = TestAlert;
CurrentIrql = KeGetCurrentIrql();
if( !CurrentIrql )
{
KeGetCurrentIrql();
__writecr8(1ui64);
}
v16 = 1;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( *((_BYTE *)CurrentThread + 562) )
{
v15 = 0;
if( *(_QWORD *)&TestAlert <= 0xFFui64 )
{
v10 = TestAlert;
}
else
{
if( (TestAlert & 7) != 0 )
ExRaiseDatatypeMisalignment();
if( (unsigned __int64)(*(_QWORD *)&TestAlert + 24i64) > 0x7FFFFFFF0000i64
|| (unsigned __int64)(*(_QWORD *)&TestAlert + 24i64) < *(_QWORD *)&TestAlert )
{
MEMORY[0x7FFFFFFF0000] = 0;
}
v10 = *(_DWORD *)(*(_QWORD *)&TestAlert + 4i64) & 1;
v15 = (*(_DWORD *)(*(_QWORD *)&TestAlert + 4i64) & 2) != 0;
}
v11 = !v10;
v12 = (__int64)ContextRecord;
if( v11 )
{
if( ((unsigned __int8)ContextRecord & 0xF) == 0 )
{
LABEL_11:
KiContinuePreviousModeUser(ContextRecord, ExceptionFrame, TrapFrame);
v16 = v13;
if( v13 >= 0 )
v16 = 1;
goto LABEL_23;
}
}
else if( ((unsigned __int8)ContextRecord & 0xF) == 0 )
{
if( (unsigned __int64)ContextRecord >= 0x7FFFFFFF0000i64 )
v12 = 0x7FFFFFFF0000i64;
*(_BYTE *)v12 = *(_BYTE *)v12;
*(_BYTE *)(v12 + 1231) = *(_BYTE *)(v12 + 1231);
KeTestAlertThread(1);
if( v15 && (*((_BYTE *)CurrentThread + 194) & 2) != 0 )
{
TrapFrame->FaultAddress = (unsigned __int64)ContextRecord;
TrapFrame->ErrorCode = (unsigned __int64)ExceptionFrame;
KiDeliverApc(1, 0i64, TrapFrame);
v16 = 0;
goto LABEL_23;
}
goto LABEL_11;
}
ExRaiseDatatypeMisalignment();
}
if( *(_QWORD *)&TestAlert > 0xFFui64 )
v6 = *(_BYTE *)(*(_QWORD *)&TestAlert + 4i64) & 1;
KeContextToKframes(TrapFrame, ExceptionFrame, ContextRecord, ContextRecord->ContextFlags, 0);
if( v6 )
KeTestAlertThread(0);
LABEL_23:
if( !CurrentIrql )
__writecr8(0i64);
return v16;
}Referenced by:
NtContinueEx