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