KiFreezeTargetExecution

VOID __stdcall KiFreezeTargetExecution(_KTRAP_FRAME *TrapFrame, _KEXCEPTION_FRAME *ExceptionFrame){
  __int16 v4; 
  bool v5; 
  unsigned __int8 CurrentIrql; 
  struct _KPRCB *CurrentPrcb; 
  __int64 v8; 
  volatile signed __int32 *v9; 
  __int64 v10; 
  volatile signed __int32 *v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  _EXCEPTION_RECORD result; 
  int v15; 
  memset((INT64)&result, 0i64);
  if( KiFreezeExecutionLock || KiFreezeLockBackup || (KiBugCheckActive & 3) != 0 )
  {
    if( ViVerifierEnabled )
      VfStopBranchTracing();
    v4 = v15;
    _disable();
    v5 = (v4 & 0x200) != 0;
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(0xFui64);
    CurrentPrcb = KeGetCurrentPrcb();
    KeSaveSupervisorState(*((_QWORD *)CurrentPrcb + 216), KUSER_SHARED_DATA.XState.EnabledSupervisorFeatures | 0x100);
    KiStartDebugAccumulation((__int64)CurrentPrcb);
    *((_DWORD *)CurrentPrcb + 2914) = 2;
    LOBYTE(v8) = 1;
    ((void(__fastcall *)(__int64, _QWORD))off_140C00738[0])(v8, 0i64);
    if( TrapFrame )
    {
      KiSaveProcessorState(TrapFrame, (KTRAP_FRAME *)ExceptionFrame);
    }
    else
    {
      RtlCaptureContext(*((PCONTEXT *)CurrentPrcb + 4280));
      KiSaveProcessorControlState((_KPROCESSOR_STATE *)((char *)CurrentPrcb + 256));
    }
    v9 = (volatile signed __int32 *)*((_QWORD *)CurrentPrcb + 4247);
    if( v9 )
      _InterlockedOr(v9, 0x20000u);
    KeQueryPerformanceCounter(0i64);
    while( (*((_DWORD *)CurrentPrcb + 2914) & 0xF) == 2 )
    {
      if( CurrentPrcb == (struct _KPRCB *)KiDebuggerOwner )
      {
        memset((INT64)&result, 0i64);
        result.ExceptionCode = -2147483641;
        result.ExceptionRecord = &result;
        result.ExceptionAddress = *(void **)(*((_QWORD *)CurrentPrcb + 4280) + 248i64);
        if( KdpReportExceptionStateChange(&result, *((_CONTEXT **)CurrentPrcb + 4280), 0) != 3 )
          KiSetDebuggerOwner(KiFreezeOwner);
      }
      KiCheckStall(CurrentPrcb, 1u);
    }
    v11 = (volatile signed __int32 *)*((_QWORD *)CurrentPrcb + 4247);
    if( v11 )
      _InterlockedAnd(v11, 0xFFFDFFFF);
    LOBYTE(v10) = KiResumeForReboot;
    ((void(__fastcall *)(_QWORD, __int64))off_140C00738[0])(0i64, v10);
    if( TrapFrame )
      KiRestoreProcessorState(TrapFrame);
    else
      KiRestoreProcessorControlState((INT64)CurrentPrcb + 256);
    v12 = __readcr4();
    if( (v12 & 0x20080) != 0 )
    {
      __writecr4(v12 ^ 0x80);
      __writecr4(v12);
    }
    else
    {
      v13 = __readcr3();
      __writecr3(v13);
    }
    *((_DWORD *)CurrentPrcb + 2914) = 0;
    KiEndDebugAccumulation(CurrentPrcb);
    KeRestoreSupervisorState(*((_QWORD *)CurrentPrcb + 216), KUSER_SHARED_DATA.XState.EnabledSupervisorFeatures | 0x100);
    __writecr8(CurrentIrql);
    if( v5 )
      _enable();
    if( ViVerifierEnabled )
      VfStartBranchTracing();
  }
}

Referenced by:

KiCheckForFreezeExecution