HvlpStartSecurePageListIteration

INT64 __fastcall HvlpStartSecurePageListIteration(INT64 a1, UINT64 a2, CHAR *a3, VOID *a4, UINT64 a5, LONGLONG **a6){
  int v6; 
  int v8; 
  INT64 *v9; 
  INT64 result; 
  LONGLONG **v11; 
  LONGLONG *v12; 
  unsigned int v13; 
  __int128 v14; 
  INT64 v15; 
  LONGLONG v16; 
  unsigned int v17; 
  CHAR *v18; 
  __int64 v19; 
  PHYSICAL_ADDRESS PhysicalAddress; 
  PHYSICAL_ADDRESS v21; 
  int *v22; 
  UINT64 v23; 
  __int64 v24; 
  v6 = a2;
  v8 = a1;
  v9 = HvlpSetupPageListIteration(a1, 1);
  if( !v9 )
    return 3221225473i64;
  v11 = a6;
  v12 = (LONGLONG *)v9[1];
  v13 = 0;
  v14 = v9[2];
  *a6 = v12;
  v24 = v14 / 4096;
  v15 = v24;
  v16 = 0i64;
  if( a3 )
  {
    v17 = 0x200000;
    v18 = a3;
    if( (unsigned int)a5 <= 0x200000 )
      v17 = a5;
    v13 = v17 >> 12;
    if( v13 )
    {
      v19 = v13;
      do
      {
        PhysicalAddress = MmGetPhysicalAddress(v18);
        v18 += 4096;
        *v12++ = PhysicalAddress.QuadPart / 4096;
        --v19;
      }
      while( v19 );
      v11 = a6;
      v15 = v24;
    }
    v21 = MmGetPhysicalAddress(a4);
    *v11 = (LONGLONG *)a3;
    v16 = v21.QuadPart / 4096;
  }
  LODWORD(v23) = v6;
  result = VslStartSecurePageIteration(v8 == 0, v15, v16, v13, v23);
  if( (int)result < 0 )
  {
    v22 = &HvlpIteratorCrashdump;
    if( !v8 )
      v22 = &HvlpIteratorHibernate;
    *v22 = 0;
    *((_QWORD *)v22 + 1) = 0i64;
  }
  return result;
}

Referenced by:

HvlAddSecurePagesCallbackRoutine
HvlDiscardSecurePagesFromHibernation
HvlIterateSecurePagesForHibernation
HvlpGetEncryptedDataFromSecureKernel