KiCopyXStateArea

VOID __fastcall KiCopyXStateArea(INT64 a1, INT64 a2, INT64 a3){
  unsigned int v3; 
  unsigned int v6; 
  unsigned __int64 v7; 
  unsigned __int64 v8; 
  _OWORD *v9; 
  __int64 v10; 
  _OWORD *v11; 
  __int128 v12; 
  unsigned int v13; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  _DWORD *v16; 
  unsigned __int64 v17; 
  unsigned int *v18; 
  unsigned __int64 v19; 
  if( a2 )
  {
    v3 = 0;
    v6 = 2;
    v7 = a2 & KUSER_SHARED_DATA.XState.EnabledFeatures & *(_QWORD *)(a3 + 512);
    *(_QWORD *)(a1 + 512) = v7 | *(_QWORD *)(a1 + 512) & ~a2;
    if( (v7 & 2) != 0 )
      *(_DWORD *)(a1 + 24) = *(_DWORD *)(a3 + 24);
    if( (KUSER_SHARED_DATA.XState.ControlFlags & 2) != 0 )
    {
      *(_QWORD *)(a1 + 520) = KUSER_SHARED_DATA.XState.EnabledFeatures | 0x8000000000000000ui64;
      v8 = *(_QWORD *)(a3 + 520);
      if( (v7 & 1) != 0 )
      {
        *(_OWORD *)a1 = *(_OWORD *)a3;
        *(_OWORD *)(a1 + 16) = *(_OWORD *)(a3 + 16);
        *(_OWORD *)(a1 + 32) = *(_OWORD *)(a3 + 32);
        *(_OWORD *)(a1 + 48) = *(_OWORD *)(a3 + 48);
        *(_OWORD *)(a1 + 64) = *(_OWORD *)(a3 + 64);
        *(_OWORD *)(a1 + 80) = *(_OWORD *)(a3 + 80);
        *(_OWORD *)(a1 + 96) = *(_OWORD *)(a3 + 96);
        *(_OWORD *)(a1 + 112) = *(_OWORD *)(a3 + 112);
        *(_OWORD *)(a1 + 128) = *(_OWORD *)(a3 + 128);
        *(_OWORD *)(a1 + 144) = *(_OWORD *)(a3 + 144);
      }
      if( (v7 & 2) != 0 )
      {
        v9 = (_OWORD *)(a1 + 160);
        v10 = 2i64;
        v11 = (_OWORD *)(a3 + 160);
        do
        {
          *v9 = *v11;
          v9[1] = v11[1];
          v9[2] = v11[2];
          v9[3] = v11[3];
          v9[4] = v11[4];
          v9[5] = v11[5];
          v9[6] = v11[6];
          v9 += 8;
          v12 = v11[7];
          v11 += 8;
          *(v9 - 1) = v12;
          --v10;
        }
        while( v10 );
      }
      v13 = 576;
      v14 = v8 >> 2;
      v15 = v7 >> 2;
      v16 = (_DWORD *)(&KUSER_SHARED_DATA + 1028);
      v17 = KUSER_SHARED_DATA.XState.AlignedFeatures >> 2;
      v19 = v14;
      do
      {
        if( (v14 & 1) != 0 )
        {
          if( (v17 & 1) != 0 )
            v13 = (v13 + 63) & 0xFFFFFFC0;
          if( (v15 & 1) != 0 )
          {
            memmove((UINT8 *)(a1 + (unsigned int)*(v16 - 1)), (UINT8 *)(a3 + v13), (unsigned int)*v16);
            v14 = v19;
          }
          v13 += *v16;
        }
        v14 >>= 1;
        v17 >>= 1;
        v15 >>= 1;
        v19 = v14;
        if( !v15 )
          break;
        ++v6;
        v16 += 2;
      }
      while( v6 < 0x40 );
    }
    else
    {
      v18 = (_DWORD *)(&KUSER_SHARED_DATA + 1012);
      do
      {
        if( (v7 & 1) != 0 )
          memmove((UINT8 *)(*(v18 - 1) + a1), (UINT8 *)(*(v18 - 1) + a3), *v18);
        v7 >>= 1;
        if( !v7 )
          break;
        ++v3;
        v18 += 2;
      }
      while( v3 < 0x40 );
    }
  }
}

Referenced by:

KeContextFromKframes
KeCopyContextFromUch
KeCopyContextFromUmsContext
KeCopyContextToUch
KeCopyContextToUmsContext
KiCopyUchToStagingArea
KiRestoreUchFromUmsContext
KxContextToKframes
PspGetContext
PspSetContext