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