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