HvlpGetEncryptedDataFromHypervisor

INT64 __fastcall HvlpGetEncryptedDataFromHypervisor(INT64 a1, CHAR *a2, UINT64 a3, INT64 *a4, INT64 a5){
  _DWORD *v5; 
  unsigned int v7; 
  unsigned int v10; 
  __int64 v11; 
  unsigned int v12; 
  unsigned int v13; 
  __int64 v14; 
  INT64 v15; 
  unsigned __int64 v16; 
  unsigned __int64 v17; 
  __int64 v18; 
  unsigned __int64 v19; 
  unsigned int v20; 
  int v21; 
  v21 = HIDWORD(a1);
  v5 = (_DWORD *)a5;
  v18 = 0i64;
  v20 = 0;
  v7 = a3;
  *(_DWORD *)a5 = 0;
  if( (HvlpRootFlags & 4) == 0 )
    return 3221226021i64;
  if( !(_BYTE)HvlpCrashdumpIterationState )
  {
    HvlpStartPageListIteration(1i64);
    *((_QWORD *)&HvlpCrashdumpIterationState + 1) = -1i64;
    LODWORD(xmmword_140C47310) = 0;
    LOBYTE(HvlpCrashdumpIterationState) = 1;
  }
  v10 = xmmword_140C47310;
  if( (_DWORD)xmmword_140C47310 )
  {
    v11 = *((_QWORD *)&HvlpCrashdumpIterationState + 1);
    v18 = *((_QWORD *)&HvlpCrashdumpIterationState + 1);
    v20 = xmmword_140C47310;
  }
  else
  {
    if( !(unsigned int)HvlpGetPageList((int)xmmword_140C47310 + 1, &v18, &v20) )
    {
      qword_140C471E8 = 0i64;
      HvlpIteratorCrashdump = 0;
      LOBYTE(HvlpCrashdumpIterationState) = 0;
      *((_QWORD *)&HvlpCrashdumpIterationState + 1) = -1i64;
      LODWORD(xmmword_140C47310) = 0;
      return 3221226021i64;
    }
    v11 = v18;
    v10 = v20;
  }
  v12 = v7 >> 12;
  v13 = v10;
  if( v12 < v10 )
    v13 = v12;
  if( v13 )
  {
    v14 = v11 << 12;
    v15 = v11;
    a5 = v13;
    do
    {
      v19 = v14 & 0xFFFFFFFFF000i64 | 0x8000000000000001ui64;
      *((_QWORD *)MmGetPteBase() + (((unsigned __int64)qword_140C472E8 >> 12) & 0xFFFFFFFFFi64)) = v19;
      v16 = __readcr4();
      if( (v16 & 0x20080) != 0 )
      {
        __writecr4(v16 ^ 0x80);
        __writecr4(v16);
      }
      else
      {
        v17 = __readcr3();
        __writecr3(v17);
      }
      memmove((UINT8 *)a2, qword_140C472E8, 0x1000ui64);
      *a4 = v15;
      a2 += 4096;
      v14 += 4096i64;
      ++a4;
      ++v15;
      --a5;
    }
    while( a5 );
  }
  *v5 = v13 << 12;
  LODWORD(xmmword_140C47310) = v10 - v13;
  *((_QWORD *)&HvlpCrashdumpIterationState + 1) = v11 + v13;
  return 0i64;
}

Referenced by:

HvlGetEncryptedData