KeCopyContextFromUch

INT64 __stdcall KeCopyContextFromUch(CONTEXT *ContextFrame, INT64 a2){
  unsigned int ContextFlags; 
  __int64 P3Home_low; 
  INT64 result; 
  $A4EAF4AB0A1E48B90F4960D2627C8AED *v7; 
  _OWORD *v8; 
  __int64 v9; 
  __int128 v10; 
  unsigned int v11; 
  char v12; 
  int v13; 
  UINT64 v14; 
  ContextFlags = ContextFrame->ContextFlags;
  LODWORD(v14) = ContextFlags & 0x100013;
  RtlpSanitizeContextFlags(&v14, 1);
  ContextFrame->ContextFlags = v14;
  KeContextFromKframes(*(_KTRAP_FRAME **)(a2 + 80), *(_KEXCEPTION_FRAME **)(a2 + 88), ContextFrame);
  if( (ContextFlags & 0x100040) == 1048640 && KUSER_SHARED_DATA.XState.EnabledFeatures )
  {
    ContextFrame->ContextFlags |= 0x100040u;
    P3Home_low = SLODWORD(ContextFrame[1].P3Home);
    if( (*(_BYTE *)(a2 + 72) & 1) != 0 )
      KiCopyXStateArea(
        (INT64)&ContextFrame->1 + P3Home_low + 464,
        KUSER_SHARED_DATA.XState.EnabledFeatures & 0xFFFFFFFFFFFFFFFCui64,
        *(_QWORD *)(a2 + 64));
    else
      *(unsigned __int64 *)((char *)&ContextFrame[1].P1Home + P3Home_low) = 0i64;
  }
  result = ContextFlags & 0x100008;
  if( (_DWORD)result == 1048584 )
  {
    ContextFrame->ContextFlags |= 0x100008u;
    v7 = &ContextFrame->256;
    if( (*(_BYTE *)(a2 + 72) & 1) != 0 )
    {
      v8 = *(_OWORD **)(a2 + 64);
      v9 = 4i64;
      do
      {
        *(_OWORD *)&v7->FltSave.ControlWord = *v8;
        v7->Header[1] = (_M128A)v8[1];
        v7->Legacy[0] = (_M128A)v8[2];
        v7->Legacy[1] = (_M128A)v8[3];
        v7->Legacy[2] = (_M128A)v8[4];
        v7->Legacy[3] = (_M128A)v8[5];
        v7->Legacy[4] = (_M128A)v8[6];
        v7 = ($A4EAF4AB0A1E48B90F4960D2627C8AED *)((char *)v7 + 128);
        v10 = v8[7];
        v8 += 8;
        *((_OWORD *)&v7[-1].1 + 31) = v10;
        --v9;
      }
      while( v9 );
      ContextFrame->Xmm0 = *(_M128A *)(*(_QWORD *)(a2 + 80) + 112i64);
      ContextFrame->Xmm1 = *(_M128A *)(*(_QWORD *)(a2 + 80) + 128i64);
      ContextFrame->Xmm2 = *(_M128A *)(*(_QWORD *)(a2 + 80) + 144i64);
      ContextFrame->Xmm3 = *(_M128A *)(*(_QWORD *)(a2 + 80) + 160i64);
      ContextFrame->Xmm4 = *(_M128A *)(*(_QWORD *)(a2 + 80) + 176i64);
      ContextFrame->Xmm5 = *(_M128A *)(*(_QWORD *)(a2 + 80) + 192i64);
    }
    else
    {
      memset((INT64)&ContextFrame->256, 0i64);
      v7->FltSave.ControlWord = **(_WORD **)(a2 + 64);
    }
    ContextFrame->Xmm6 = *(_M128A *)(*(_QWORD *)(a2 + 88) + 48i64);
    ContextFrame->Xmm7 = *(_M128A *)(*(_QWORD *)(a2 + 88) + 64i64);
    ContextFrame->Xmm8 = *(_M128A *)(*(_QWORD *)(a2 + 88) + 80i64);
    ContextFrame->Xmm9 = *(_M128A *)(*(_QWORD *)(a2 + 88) + 96i64);
    ContextFrame->Xmm10 = *(_M128A *)(*(_QWORD *)(a2 + 88) + 112i64);
    ContextFrame->Xmm11 = *(_M128A *)(*(_QWORD *)(a2 + 88) + 128i64);
    ContextFrame->Xmm12 = *(_M128A *)(*(_QWORD *)(a2 + 88) + 144i64);
    ContextFrame->Xmm13 = *(_M128A *)(*(_QWORD *)(a2 + 88) + 160i64);
    ContextFrame->Xmm14 = *(_M128A *)(*(_QWORD *)(a2 + 88) + 176i64);
    ContextFrame->Xmm15 = *(_M128A *)(*(_QWORD *)(a2 + 88) + 192i64);
    ContextFrame->FltSave.MxCsr = *(_DWORD *)(*(_QWORD *)(a2 + 80) + 44i64);
    result = *(_QWORD *)(a2 + 80);
    ContextFrame->MxCsr = *(_DWORD *)(result + 44);
  }
  if( (ContextFlags & 0x40000000) != 0 )
  {
    v11 = ContextFrame->ContextFlags | 0x80000000;
    ContextFrame->ContextFlags = v11;
    result = *(_QWORD *)(a2 + 80);
    v12 = *(_BYTE *)(result + 43);
    if( v12 == 1 )
    {
      v13 = v11 | 0x8000000;
    }
    else
    {
      if( v12 != 2 )
        return result;
      v13 = v11 | 0x10000000;
    }
    ContextFrame->ContextFlags = v13;
  }
  return result;
}

Referenced by:

PspGetSetContextInternal