HvlDmaUnmapDeviceSparsePages

NTSTATUS __fastcall HvlDmaUnmapDeviceSparsePages(__int64 a1, __int64 a2, unsigned __int64 *a3){
  bool v3; 
  NTSTATUS result; 
  unsigned __int64 v8; 
  unsigned __int64 v9; 
  int v10; 
  int v11; 
  _QWORD *v12; 
  unsigned int v13; 
  char v14; 
  _QWORD *v15; 
  __int64 v16; 
  __int64 v17; 
  __int64 v18; 
  UINT16 v19; 
  __int16 v20; 
  UINT16 v21; 
  __int64 v22; 
  __int64 v23; 
  __int16 v24; 
  PHYSICAL_ADDRESS PageInfo[2]; 
  __int128 v26; 
  __int64 v27[14]; 

  v3 = *(_BYTE *)(a1 + 4) == 0;
  *(_OWORD *)&PageInfo[0].anonymous_0.LowPart = 0i64;
  v26 = 0i64;
  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(PageInfo, 1ui64, 0i64, 0i64);
        if( *a3 >= 0x1FD )
          v13 = 509;
        else
          v13 = *(_DWORD *)a3;
        v14 = 0;
        v11 &= ~0x10000u;
      }
      LODWORD(v23) = 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(v23) = v10;
      if( v14 )
      {
        v18 = HvcallFastExtended(v23, v27, 8 * v13 + 24, 0i64, 0);
        v19 = v18;
        v24 = WORD2(v18);
      }
      else
      {
        HvcallInitiateHypercall();
        v24 = v20;
        v19 = v21;
        HvlpReleaseHypercallPage((_HVLP_HYPERCALL_PAGE_INFO *)PageInfo);
      }
      v22 = v24 & 0xFFF;
      v9 += v22;
      *a3 -= v22;
      result = HvlpHvToNtStatus(v19);
    }
    while( result >= 0 && v8 );
  }
  *a3 = v9;
  return result;
}

Referenced by:

No references.