HvlDmaUnmapDeviceSparsePages

NTSTATUS __fastcall HvlDmaUnmapDeviceSparsePages(INT64 a1, INT64 a2, UINT64 *a3){
  bool v3; 
  NTSTATUS result; 
  UINT64 v8; 
  UINT64 v9; 
  int v10; 
  int v11; 
  __int64 *v12; 
  unsigned int v13; 
  char v14; 
  _QWORD *v15; 
  INT64 v16; 
  __int64 v17; 
  INT64 v18; 
  UINT16 v19; 
  __int16 v20; 
  UINT16 v21; 
  __int64 v22; 
  UINT64 v23; 
  INT64 a1a; 
  __int16 v25; 
  __int128 v26[2]; 
  __int64 v27[14]; 
  v3 = *(_BYTE *)(a1 + 4) == 0;
  memset(v26, 0, sizeof(v26));
  if( !v3 )
    return -1073741637;
  v8 = *a3;
  result = 0;
  v9 = 0i64;
  if( *a3 )
  {
    v10 = 0;
    v11 = 200;
    do
    {
      if( v8 <= 0xB )
      {
        v12 = v27;
        if( v8 >= 0xB )
          v13 = 11;
        else
          v13 = *(_DWORD *)a3;
        v14 = 1;
        v11 |= 0x10000u;
      }
      else
      {
        v12 = HvlpAcquireHypercallPage((PHYSICAL_ADDRESS *)v26, 1, 0i64, 0i64);
        if( *a3 >= 0x1FD )
          v13 = 509;
        else
          v13 = *(_DWORD *)a3;
        v14 = 0;
        v11 &= ~0x10000u;
      }
      LODWORD(a1a) = v11;
      v12[1] = 0i64;
      v12[2] = 0i64;
      *v12 = -1i64;
      *((_DWORD *)v12 + 4) &= 0xFFFFFFF0;
      *((_DWORD *)v12 + 5) = *(_DWORD *)a1;
      if( v13 )
      {
        v15 = v12 + 3;
        v16 = a2 + 8 * v9 - 24 - (_QWORD)v12;
        v17 = v13;
        do
        {
          *v15 = *(_QWORD *)((char *)v15 + v16) << 12;
          ++v15;
          --v17;
        }
        while( v17 );
      }
      v10 ^= ((unsigned __int16)v13 ^ (unsigned __int16)v10) & 0xFFF;
      HIDWORD(a1a) = v10;
      if( v14 )
      {
        LODWORD(v23) = 0;
        v18 = HvcallFastExtended(a1a, v27, 8 * v13 + 24, 0i64, v23);
        v19 = v18;
        v25 = WORD2(v18);
      }
      else
      {
        HvcallInitiateHypercall();
        v25 = v20;
        v19 = v21;
        HvlpReleaseHypercallPage((unsigned int *)v26);
      }
      v22 = v25 & 0xFFF;
      v9 += v22;
      *a3 -= v22;
      result = HvlpHvToNtStatus(v19);
    }
    while( result >= 0 && v8 );
  }
  *a3 = v9;
  return result;
}

Referenced by:

No references.