HvlDmaMapDeviceLogicalRange

void __fastcall HvlDmaMapDeviceLogicalRange(__int64 a1, int a2, __int64 a3, _QWORD *a4, unsigned __int64 *a5, char a6){
  bool v6; 
  unsigned __int64 *v7; 
  _QWORD *v8; 
  _DWORD *v10; 
  unsigned __int64 v11; 
  int v12; 
  unsigned __int64 v13; 
  int v14; 
  int v15; 
  _QWORD *v16; 
  unsigned int v17; 
  char v18; 
  int v19; 
  int v20; 
  unsigned __int64 *v21; 
  __int64 v22; 
  char *v23; 
  __int64 v24; 
  unsigned __int64 v25; 
  __int64 v26; 
  INT16 v27; 
  __int16 v28; 
  INT16 v29; 
  __int64 v30; 
  INT64 v31; 
  UINT64 v32; 
  NTSTATUS v33; 
  __int64 v34; 
  __int16 v37; 
  PHYSICAL_ADDRESS PageInfo[2]; 
  __int128 v40; 
  __int64 v41[14]; 

  v6 = *(_BYTE *)(a1 + 4) == 0;
  v7 = a5;
  v8 = a4;
  *(_OWORD *)&PageInfo[0].anonymous_0.LowPart = 0i64;
  v10 = (_DWORD *)a1;
  v40 = 0i64;
  if( v6 )
  {
    v11 = *a5;
    v12 = 0;
    v13 = 0i64;
    if( !*a5 )
    {
LABEL_38:
      *v7 = v13;
      return;
    }
    v14 = 0;
    v15 = 179;
    while( 1 )
    {
      if( v11 <= 9 )
      {
        v16 = v41;
        v17 = v11 >= 9 ? 9 : *(_DWORD *)v7;
        v18 = 1;
        v15 |= 0x10000u;
      }
      else
      {
        v16 = HvlpAcquireHypercallPage(PageInfo, 1ui64, 0i64, 0i64);
        v17 = *v7 >= 0x1FB ? 507 : *(_DWORD *)v7;
        v8 = a4;
        v18 = 0;
        v15 &= ~0x10000u;
      }
      LODWORD(v34) = v15;
      v16[1] = 0i64;
      v16[2] = 0i64;
      v16[3] = 0i64;
      v16[4] = 0i64;
      *v16 = -1i64;
      *((_DWORD *)v16 + 4) &= 0xFFFFFFF0;
      *((_DWORD *)v16 + 5) = *v10;
      v16[4] = a3;
      if( a2 )
      {
        v20 = (a2 & 1) != 0;
        if( (a2 & 2) != 0 )
          v20 |= 2u;
        v19 = v12 | v20;
      }
      else
      {
        v19 = 1024;
      }
      *((_DWORD *)v16 + 7) = v19;
      if( v17 )
      {
        v21 = v16 + 5;
        v22 = 0i64;
        v23 = (char *)v8 + 8 * v13 - 40 - (_QWORD)v16;
        v24 = v17;
        do
        {
          if( a2 )
          {
            if( a6 )
              v25 = v13 + v22 + *a4;
            else
              v25 = *(unsigned __int64 *)((char *)v21 + (_QWORD)v23);
          }
          else
          {
            v25 = 0i64;
          }
          *v21 = v25;
          ++v22;
          ++v21;
          --v24;
        }
        while( v24 );
        v7 = a5;
      }
      v14 ^= ((unsigned __int16)v17 ^ (unsigned __int16)v14) & 0xFFF;
      HIDWORD(v34) = v14;
      if( v18 )
      {
        v26 = HvcallFastExtended(v34, v41, 8 * v17 + 40, 0i64, 0);
        v27 = v26;
        v37 = WORD2(v26);
      }
      else
      {
        HvcallInitiateHypercall();
        v37 = v28;
        v27 = v29;
        HvlpReleaseHypercallPage((_HVLP_HYPERCALL_PAGE_INFO *)PageInfo);
      }
      v30 = v37 & 0xFFF;
      *v7 -= v30;
      v13 += v30;
      a3 += (unsigned __int16)(v37 & 0xFFF) << 12;
      if( !HvlpHvStatusIsInsufficientMemory(v27) )
        break;
      HvlpHandleInsufficientMemory(v32, v31);
      if( v33 < 0 )
      {
        if( v12 != 0x8000 )
        {
          v12 = 0x8000;
          v33 = 0;
        }
LABEL_36:
        if( v33 < 0 )
          goto LABEL_38;
      }
      v11 = *v7;
      v10 = (_DWORD *)a1;
      v8 = a4;
      if( !*v7 )
        goto LABEL_38;
    }
    v33 = HvlpHvToNtStatus(v32);
    goto LABEL_36;
  }
}

Referenced by:

No references.