HvlDmaMapDeviceSparsePages

INT64 __fastcall HvlDmaMapDeviceSparsePages(INT64 rcx0, INT64 a2, UINT64 *a3){
  unsigned int *v3; 
  unsigned int *v4; 
  UINT64 *v5; 
  int v6; 
  unsigned __int64 v9; 
  unsigned int v10; 
  __int64 v11; 
  int v12; 
  int v13; 
  __int64 *v14; 
  unsigned int v15; 
  char v16; 
  int v17; 
  UINT64 *v18; 
  _QWORD *v19; 
  __int64 v20; 
  __int64 v21; 
  INT64 v22; 
  INT16 v23; 
  __int16 v24; 
  INT16 v25; 
  __int64 v26; 
  UINT16 v27; 
  NTSTATUS v28; 
  UINT64 a5; 
  INT64 a1; 
  __int16 v31; 
  __int128 v33[2]; 
  __int64 v34[14]; 
  v4 = v3;
  v5 = a3;
  v6 = a2;
  memset(v33, 0, sizeof(v33));
  if( *(_BYTE *)(rcx0 + 4) )
    return 3221225659i64;
  v9 = *(_QWORD *)v3;
  v10 = 0;
  v11 = 0i64;
  if( *(_QWORD *)v3 )
  {
    v12 = 0;
    v13 = 199;
    do
    {
      if( v9 <= 5 )
      {
        v14 = v34;
        if( v9 >= 5 )
          v15 = 5;
        else
          v15 = *v4;
        v16 = 1;
        v13 |= 0x10000u;
      }
      else
      {
        v14 = HvlpAcquireHypercallPage((PHYSICAL_ADDRESS *)v33, 1, 0i64, 0i64);
        if( *(_QWORD *)v4 >= 0xFEui64 )
          v15 = 254;
        else
          v15 = *v4;
        v5 = a3;
        v16 = 0;
        v13 &= ~0x10000u;
      }
      LODWORD(a1) = v13;
      v14[1] = 0i64;
      v14[2] = 0i64;
      v14[3] = 0i64;
      *v14 = -1i64;
      *((_DWORD *)v14 + 4) &= 0xFFFFFFF0;
      *((_DWORD *)v14 + 5) = *(_DWORD *)rcx0;
      v17 = 1024;
      if( v6 )
        v17 = v6;
      *((_BYTE *)v14 + 24) = 0;
      *((_DWORD *)v14 + 7) = v17;
      if( v15 )
      {
        v18 = &v5[v11];
        v19 = v14 + 5;
        v20 = v15;
        do
        {
          *(v19 - 1) = *v18 << 12;
          v21 = *v18++;
          *v19 = v21;
          v19 += 2;
          --v20;
        }
        while( v20 );
      }
      v12 ^= ((unsigned __int16)v15 ^ (unsigned __int16)v12) & 0xFFF;
      HIDWORD(a1) = v12;
      if( v16 )
      {
        LODWORD(a5) = 0;
        v22 = HvcallFastExtended(a1, v34, 16 * (v15 + 2), 0i64, a5);
        v23 = v22;
        v31 = WORD2(v22);
      }
      else
      {
        HvcallInitiateHypercall();
        v31 = v24;
        v23 = v25;
        HvlpReleaseHypercallPage((unsigned int *)v33);
      }
      v26 = v31 & 0xFFF;
      *(_QWORD *)v4 -= v26;
      v11 += v26;
      if( HvlpHvStatusIsInsufficientMemory(v23) )
        v28 = HvlpHandleInsufficientMemory();
      else
        v28 = HvlpHvToNtStatus(v27);
      v10 = v28;
      if( v28 < 0 )
        break;
      v9 = *(_QWORD *)v4;
      v5 = a3;
    }
    while( *(_QWORD *)v4 );
  }
  *(_QWORD *)v4 = v11;
  return v10;
}

Referenced by:

No references.