KiSaveProcessorControlState

VOID __stdcall KiSaveProcessorControlState(_KPROCESSOR_STATE *ProcessorState){
  int v1; 
  unsigned __int64 v2; 
  unsigned __int64 v3; 
  unsigned __int64 v4; 
  unsigned __int64 v5; 
  unsigned __int64 v6; 
  unsigned __int64 v7; 
  unsigned __int64 v8; 
  unsigned __int64 v9; 
  unsigned __int64 v10; 
  unsigned __int64 v11; 
  _KPROCESSOR_STATE *v12; 
  int v13; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  int v16; 
  unsigned __int64 v17; 

  v2 = __readcr0();
  ProcessorState->SpecialRegisters.Cr0 = v2;
  v3 = __readcr2();
  ProcessorState->SpecialRegisters.Cr2 = v3;
  v4 = __readcr3();
  ProcessorState->SpecialRegisters.Cr3 = v4;
  v5 = __readcr4();
  ProcessorState->SpecialRegisters.Cr4 = v5;
  ProcessorState->SpecialRegisters.Cr8 = KeGetCurrentIrql();
  ProcessorState->SpecialRegisters.Ldtr = 0;
  if( !(BYTE5(Mm64BitPhysicalAddress) | (unsigned __int8)VslVsmEnabled) )
  {
    __sgdt(&ProcessorState->SpecialRegisters.Gdtr.Limit);
    __sidt(&ProcessorState->SpecialRegisters.Idtr.Limit);
    __asm { str     word ptr [rcx+70h] }
  }
  ProcessorState->SpecialRegisters._MxCsr = _mm_getcsr();
  ProcessorState->SpecialRegisters.Xcr0 = 0i64;
  if( (ProcessorState->SpecialRegisters.Cr4 & 0x40000) != 0 )
  {
    LODWORD(ProcessorState->SpecialRegisters.Xcr0) = _xgetbv(0);
    HIDWORD(ProcessorState->SpecialRegisters.Xcr0) = v1;
  }
  v6 = __readdr(0);
  v7 = __readdr(1u);
  ProcessorState->SpecialRegisters.KernelDr0 = v6;
  ProcessorState->SpecialRegisters.KernelDr1 = v7;
  v8 = __readdr(2u);
  v9 = __readdr(3u);
  ProcessorState->SpecialRegisters.KernelDr2 = v8;
  ProcessorState->SpecialRegisters.KernelDr3 = v9;
  v10 = __readdr(6u);
  v11 = __readdr(7u);
  ProcessorState->SpecialRegisters.KernelDr6 = v10;
  ProcessorState->SpecialRegisters.KernelDr7 = v11;
  __writedr(7u, 0i64);
  if( (KeGetPcr()->Prcb.FeatureBits & 0x20000) != 0 && (v11 & 0x300) != 0 )
  {
    if( (KiCpuTracingFlags & 2) != 0 )
    {
      ProcessorState->SpecialRegisters.LastBranchFromRip = 0i64;
      ProcessorState->SpecialRegisters.LastBranchToRip = 0i64;
      ProcessorState->SpecialRegisters.LastExceptionFromRip = 0i64;
      ProcessorState->SpecialRegisters.LastExceptionToRip = 0i64;
    }
    else
    {
      v12 = ProcessorState;
      v13 = KiLastBranchTOSMSR;
      if( KiLastBranchTOSMSR )
      {
        v14 = __readmsr(KiLastBranchTOSMSR);
        v13 = v14;
      }
      v15 = __readmsr(v13 + KiLastBranchFromBaseMSR);
      LODWORD(ProcessorState->SpecialRegisters.LastBranchFromRip) = v15;
      v16 = KiLastBranchToBaseMSR;
      HIDWORD(v12->SpecialRegisters.LastBranchFromRip) = HIDWORD(v15);
      v12->SpecialRegisters.LastBranchToRip = __readmsr(v13 + v16);
      v12->SpecialRegisters.LastExceptionFromRip = __readmsr(KiLastExceptionFromBaseMSR);
      v12->SpecialRegisters.LastExceptionToRip = __readmsr(KiLastExceptionToBaseMSR);
      v17 = __readmsr(0x1D9u);
      __writemsr(0x1D9u, __PAIR64__(HIDWORD(v17), (unsigned int)v17 & 0xFFFFFFFC));
    }
  }
}

Referenced by:

ExpSystemErrorHandler
IopLiveDumpCorralDpc
IopLiveDumpEndMirroringCallback
KdpCommandString
KdpReport
KdpSymbol
KeBugCheckEx
KeSaveStateForHibernate
KiFreezeTargetExecution
KiSaveProcessorState