KiSaveDebugRegisterState

INT64 __fastcall KiSaveDebugRegisterState(){
  __int64 v0; 
  KPCR *Pcr; 
  unsigned __int64 v2; 
  unsigned __int64 v3; 
  unsigned __int64 v4; 
  unsigned __int64 v5; 
  unsigned __int64 v6; 
  unsigned __int64 v7; 
  INT64 result; 
  int v9; 
  unsigned __int64 v10; 
  unsigned __int64 v11; 
  int v12; 
  unsigned __int64 v13; 
  unsigned int v14; 
  unsigned __int64 v15; 
  unsigned __int64 v16; 
  unsigned __int64 v17; 
  int v18; 
  unsigned __int64 v19; 
  unsigned int v20; 
  Pcr = KeGetPcr();
  v2 = __readdr(0);
  v3 = __readdr(1u);
  *(_QWORD *)(v0 + 88) = v2;
  *(_QWORD *)(v0 + 96) = v3;
  v4 = __readdr(2u);
  v5 = __readdr(3u);
  *(_QWORD *)(v0 + 104) = v4;
  *(_QWORD *)(v0 + 112) = v5;
  v6 = __readdr(6u);
  v7 = __readdr(7u);
  *(_QWORD *)(v0 + 120) = v6;
  *(_QWORD *)(v0 + 128) = v7;
  result = 0i64;
  __writedr(7u, 0i64);
  if( (*((_BYTE *)KeGetPcr() + 34594) & 2) != 0 && (v7 & 0x300) != 0 )
  {
    if( (KiCpuTracingFlags & 2) != 0 )
    {
      *(_QWORD *)(v0 + 152) = 0i64;
      *(_QWORD *)(v0 + 144) = 0i64;
      *(_QWORD *)(v0 + 168) = 0i64;
      *(_QWORD *)(v0 + 160) = 0i64;
    }
    else
    {
      v9 = KiLastBranchTOSMSR;
      if( KiLastBranchTOSMSR )
      {
        v10 = __readmsr(KiLastBranchTOSMSR);
        v9 = v10;
      }
      v11 = __readmsr(v9 + KiLastBranchFromBaseMSR);
      *(_DWORD *)(v0 + 152) = v11;
      v12 = KiLastBranchToBaseMSR;
      *(_DWORD *)(v0 + 156) = HIDWORD(v11);
      *(_QWORD *)(v0 + 144) = __readmsr(v9 + v12);
      *(_QWORD *)(v0 + 168) = __readmsr(KiLastExceptionFromBaseMSR);
      *(_QWORD *)(v0 + 160) = __readmsr(KiLastExceptionToBaseMSR);
      v13 = __readmsr(0x1D9u);
      v14 = HIDWORD(v13);
      result = (unsigned int)v13 & 0xFFFFFFFC;
      __writemsr(0x1D9u, __PAIR64__(v14, result));
    }
  }
  if( (*((_WORD *)Pcr + 356) & 0x355) != 0 )
  {
    v15 = *((_QWORD *)Pcr + 85);
    __writedr(0, *((_QWORD *)Pcr + 84));
    __writedr(1u, v15);
    v16 = *((_QWORD *)Pcr + 87);
    __writedr(2u, *((_QWORD *)Pcr + 86));
    __writedr(3u, v16);
    v17 = *((_QWORD *)Pcr + 89);
    result = 0i64;
    __writedr(6u, 0i64);
    __writedr(7u, v17);
    if( (*((_BYTE *)KeGetPcr() + 34594) & 2) != 0 && (v17 & 0x300) != 0 && (KiCpuTracingFlags & 2) == 0 )
    {
      if( (v17 & 0x200) != 0 )
        LODWORD(result) = 2;
      if( (v17 & 0x100) != 0 )
        LODWORD(result) = result | 1;
      v18 = result;
      v19 = __readmsr(0x1D9u);
      v20 = HIDWORD(v19);
      result = v18 | (unsigned int)v19 & 0xFFFFFFFC;
      __writemsr(0x1D9u, __PAIR64__(v20, result));
    }
  }
  return result;
}

Referenced by:

KiAlignmentFault
KiApcInterrupt
KiBoundFault
KiBreakpointTrap
KiControlProtectionFault
KiDebugServiceTrap
KiDivideErrorFault
KiDoubleFaultAbort
KiDpcInterrupt
KiFloatingErrorFault
KiGeneralProtectionFault
KiHvInterrupt
KiInvalidOpcodeFault
KiInvalidTssFault
KiIpiInterrupt
KiMcheckAbort
KiNmiInterruptStart
KiNpxNotAvailableFault
KiNpxSegmentOverrunAbort
KiOverflowTrap
KiPageFault
KiRaiseAssertion
KiRaiseSecurityCheckFailure
KiSegmentNotPresentFault
KiStackFault
KiSwInterrupt
KiSystemCall32
KiSystemCall32Shadow
KiSystemCall64
KiVirtualizationException
KiVmbusInterrupt0
KiVmbusInterrupt1
KiVmbusInterrupt2
KiVmbusInterrupt3
KiXmmException
KxDebugTrapOrFault
KxIsrLinkage
KxMcheckAlternateReturn
KyStartUserThread