KiMcheckFastForward

NTSTATUS __stdcall KiMcheckFastForward(PVOID BugCheckParameter4){
  char v1; 
  char v2; 
  char *v3; 
  unsigned int v4; 
  UINT64 v5; 
  unsigned __int64 v6; 
  struct _KPRCB *CurrentPrcb; 
  __int64 v8; 
  int v9; 
  __int64 v10; 
  __int64 v11; 
  __int64 v12; 
  __int64 v13; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  v2 = v1;
  v3 = (char *)BugCheckParameter4;
  v4 = 0;
  if( (*((_BYTE *)BugCheckParameter4 + 368) & 1) == 0 )
  {
    if( KiRspInIstStack(3ui64, *((_QWORD *)BugCheckParameter4 + 48)) )
      _InterlockedAdd(&KiMcheckRecursive, 1u);
    if( KiRspInIstStack(2ui64, v5) )
    {
      v4 |= 2u;
      _InterlockedAdd(&dword_140C2AD64, 1u);
    }
    v6 = *((_QWORD *)v3 + 45);
    if( v6 >= (unsigned __int64)&KiMcheckExitMceTailMceBegin && v6 < (unsigned __int64)&KiMcheckExitMceTailMceEnd )
    {
      v4 |= 4u;
      _InterlockedAdd(&dword_140C2AD68, 1u);
    }
    if( v6 >= (unsigned __int64)&KiMcheckExitMceTailNmiBegin && v6 < (unsigned __int64)KiMcheckExitMceTailNmiEnd )
    {
      v4 |= 4u;
      _InterlockedAdd(&dword_140C2AD68, 1u);
    }
    if( (_BYTE)KiKvaShadow )
    {
      if( v6 >= (unsigned __int64)&KiKernelIstMceExitMceTailMceBegin
        && v6 < (unsigned __int64)&KiKernelIstMceExitMceTailMceEnd )
      {
        v4 |= 4u;
        _InterlockedAdd(&dword_140C2AD6C, 1u);
      }
      if( (_BYTE)KiKvaShadow
        && v6 >= (unsigned __int64)&KiKernelIstMceExitMceTailNmiBegin
        && v6 < (unsigned __int64)&KiKernelIstMceExitMceTailNmiEnd )
      {
        v4 |= 4u;
        _InterlockedAdd(&dword_140C2AD6C, 1u);
      }
    }
  }
  CurrentPrcb = KeGetCurrentPrcb();
  LODWORD(v8) = v4 & 1;
  if( v2 || (v4 & 1) != 0 )
  {
    _InterlockedAdd(&dword_140C2AD78, 1u);
    if( (v4 & 1) != 0 )
      _InterlockedAdd(&dword_140C2AD80, 1u);
    v9 = 1;
  }
  else
  {
    _InterlockedAdd(&dword_140C2AD7C, 1u);
    v9 = 0;
  }
  v10 = 0i64;
  if( (_BYTE)KiKvaShadow )
  {
    v11 = *((_QWORD *)CurrentPrcb - 47);
    if( !v2 )
    {
      v10 = *(_QWORD *)(v11 + 44);
      goto LABEL_29;
    }
    v10 = *(_QWORD *)(v11 + 52);
  }
  if( !v2 )
  {
LABEL_29:
    v12 = 36048i64;
    if( v9 )
      goto LABEL_31;
    goto LABEL_30;
  }
  if( (v4 & 1) != 0 )
    KeBugCheckEx(0x111u, v4, *((_QWORD *)v3 + 48), *((_QWORD *)v3 + 45), (ULONG_PTR)v3);
LABEL_30:
  v12 = 35968i64;
LABEL_31:
  if( (v4 & 4) != 0 )
  {
    _InterlockedAdd(&dword_140C2AD84, 1u);
    v13 = *(_QWORD *)((char *)CurrentPrcb + v12 + 64);
    if( (_BYTE)KiKvaShadow )
    {
      *(_QWORD *)(v10 + 16) = v13;
      *(_QWORD *)(v10 + 24) = *(_QWORD *)((char *)CurrentPrcb + v12 + 72);
      if( (*((_BYTE *)CurrentPrcb + v12 + 72) & 3) != 0
        && *(_BYTE *)(*(_QWORD *)(*((_QWORD *)CurrentPrcb + 1) + 544i64) + 912i64) != 1 )
      {
        _InterlockedAdd(&dword_140C2AD88, 1u);
        _interlockedbittestandreset((volatile signed __int32 *)CurrentPrcb + 9126, 0);
        v14 = __readcr4();
        if( (v14 & 0x20080) != 0 )
        {
          __writecr4(v14 ^ 0x80);
          __writecr4(v14);
        }
        else
        {
          v15 = __readcr3();
          __writecr3(v15);
        }
      }
    }
    else
    {
      *((_QWORD *)v3 + 13) = v13;
    }
    *(_OWORD *)(v3 + 360) = *(_OWORD *)((char *)CurrentPrcb + v12);
    *(_OWORD *)(v3 + 376) = *(_OWORD *)((char *)CurrentPrcb + v12 + 16);
    *((_QWORD *)v3 + 49) = *(_QWORD *)((char *)CurrentPrcb + v12 + 32);
    *((_QWORD *)v3 + 6) = *(_QWORD *)((char *)CurrentPrcb + v12 + 40);
    *((_QWORD *)v3 + 7) = *(_QWORD *)((char *)CurrentPrcb + v12 + 48);
    v8 = *(_QWORD *)((char *)CurrentPrcb + v12 + 56);
    *((_QWORD *)v3 + 8) = v8;
    _InterlockedAdd(&dword_140C2AD74, 1u);
    *(_WORD *)((char *)CurrentPrcb + v12 + 8) = 0;
  }
  if( !v2 )
  {
    _InterlockedAdd(&dword_140C2AD70, 1u);
    *(_OWORD *)((char *)CurrentPrcb + v12) = *(_OWORD *)(v3 + 360);
    *(_OWORD *)((char *)CurrentPrcb + v12 + 16) = *(_OWORD *)(v3 + 376);
    *(_QWORD *)((char *)CurrentPrcb + v12 + 32) = *((_QWORD *)v3 + 49);
    *(_QWORD *)((char *)CurrentPrcb + v12 + 40) = *((_QWORD *)v3 + 6);
    *(_QWORD *)((char *)CurrentPrcb + v12 + 48) = *((_QWORD *)v3 + 7);
    *(_QWORD *)((char *)CurrentPrcb + v12 + 56) = *((_QWORD *)v3 + 8);
    v8 = *((_QWORD *)v3 + 13);
    *(_QWORD *)((char *)CurrentPrcb + v12 + 64) = v8;
    if( (_BYTE)KiKvaShadow )
    {
      *(_QWORD *)((char *)CurrentPrcb + v12 + 64) = *(_QWORD *)(v10 + 16);
      v8 = *(_QWORD *)(v10 + 24);
      *(_QWORD *)((char *)CurrentPrcb + v12 + 72) = v8;
    }
  }
  return v8;
}

Referenced by:

KiMcheckAbort
KiNmiInterruptStart