HvlDmaMapDeviceLogicalRange

NTSTATUS __fastcall HvlDmaMapDeviceLogicalRange(INT64 a1, INT64 a2, INT64 a3, _QWORD *a4, _QWORD *a5, CHAR a6){
  bool v6; 
  unsigned __int64 *v7; 
  _QWORD *v8; 
  int v9; 
  _DWORD *v10; 
  NTSTATUS result; 
  unsigned __int64 v12; 
  int v13; 
  unsigned __int64 v14; 
  int v15; 
  int v16; 
  __int64 *v17; 
  unsigned int v18; 
  char v19; 
  int v20; 
  int v21; 
  unsigned __int64 *v22; 
  __int64 v23; 
  char *v24; 
  __int64 v25; 
  unsigned __int64 v26; 
  INT64 v27; 
  INT16 v28; 
  __int16 v29; 
  INT16 v30; 
  __int64 v31; 
  UINT16 v32; 
  UINT64 v33; 
  INT64 a1a; 
  __int16 v37; 
  __int128 v39[2]; 
  __int64 v40[14]; 
  v6 = *(_BYTE *)(a1 + 4) == 0;
  v7 = a5;
  v8 = a4;
  v9 = a2;
  memset(v39, 0, sizeof(v39));
  v10 = (_DWORD *)a1;
  if( !v6 )
    return -1073741637;
  v12 = *a5;
  result = 0;
  v13 = 0;
  v14 = 0i64;
  if( *a5 )
  {
    v15 = 0;
    v16 = 179;
    while( 1 )
    {
      if( v12 <= 9 )
      {
        v17 = v40;
        v18 = v12 >= 9 ? 9 : *(_DWORD *)v7;
        v19 = 1;
        v16 |= 0x10000u;
      }
      else
      {
        v17 = HvlpAcquireHypercallPage((PHYSICAL_ADDRESS *)v39, 1, 0i64, 0i64);
        v18 = *v7 >= 0x1FB ? 507 : *(_DWORD *)v7;
        v8 = a4;
        v19 = 0;
        v16 &= ~0x10000u;
      }
      LODWORD(a1a) = v16;
      v17[1] = 0i64;
      v17[2] = 0i64;
      v17[3] = 0i64;
      v17[4] = 0i64;
      *v17 = -1i64;
      *((_DWORD *)v17 + 4) &= 0xFFFFFFF0;
      *((_DWORD *)v17 + 5) = *v10;
      v17[4] = a3;
      if( v9 )
      {
        v21 = (v9 & 1) != 0;
        if( (v9 & 2) != 0 )
          v21 |= 2u;
        v20 = v13 | v21;
      }
      else
      {
        v20 = 1024;
      }
      *((_DWORD *)v17 + 7) = v20;
      if( v18 )
      {
        v22 = (unsigned __int64 *)(v17 + 5);
        v23 = 0i64;
        v24 = (char *)v8 + 8 * v14 - 40 - (_QWORD)v17;
        v25 = v18;
        do
        {
          if( v9 )
          {
            if( a6 )
              v26 = v14 + v23 + *a4;
            else
              v26 = *(unsigned __int64 *)((char *)v22 + (_QWORD)v24);
          }
          else
          {
            v26 = 0i64;
          }
          *v22 = v26;
          ++v23;
          ++v22;
          --v25;
        }
        while( v25 );
        v7 = a5;
      }
      v15 ^= ((unsigned __int16)v18 ^ (unsigned __int16)v15) & 0xFFF;
      HIDWORD(a1a) = v15;
      if( v19 )
      {
        LODWORD(v33) = 0;
        v27 = HvcallFastExtended(a1a, v40, 8 * v18 + 40, 0i64, v33);
        v28 = v27;
        v37 = WORD2(v27);
      }
      else
      {
        HvcallInitiateHypercall();
        v37 = v29;
        v28 = v30;
        HvlpReleaseHypercallPage((unsigned int *)v39);
      }
      v31 = v37 & 0xFFF;
      *v7 -= v31;
      v14 += v31;
      a3 += (unsigned __int16)(v37 & 0xFFF) << 12;
      if( !HvlpHvStatusIsInsufficientMemory(v28) )
        break;
      result = HvlpHandleInsufficientMemory();
      if( result < 0 )
      {
        if( v13 != 0x8000 )
        {
          v13 = 0x8000;
          result = 0;
        }
LABEL_36:
        if( result < 0 )
          goto LABEL_38;
      }
      v12 = *v7;
      v10 = (_DWORD *)a1;
      v8 = a4;
      if( !*v7 )
        goto LABEL_38;
    }
    result = HvlpHvToNtStatus(v32);
    goto LABEL_36;
  }
LABEL_38:
  *v7 = v14;
  return result;
}

Referenced by:

No references.