ViAllocateMapRegistersFromFile

__int64 __fastcall ViAllocateMapRegistersFromFile(__int64 a1, ULONG_PTR a2, unsigned int a3, char a4, _DWORD *a5){
  UINT64 *v5; 
  __int64 v6; 
  unsigned int v7; 
  ULONG_PTR v8; 
  ULONG_PTR v9; 
  int v10; 
  unsigned int v11; 
  unsigned __int8 v12; 
  unsigned __int8 v13; 
  unsigned int v14; 
  UINT64 *v15; 
  UINT64 v16; 
  UINT64 *v17; 
  UINT64 Param3; 
  ULONG_PTR v19; 
  unsigned int v20; 
  ULONG_PTR *v21; 
  char v22; 
  int v23; 
  unsigned int v24; 
  int v25; 
  UINT64 Param4; 
  UINT64 *SpinLock; 
  v5 = (UINT64 *)(a1 + 88);
  v6 = a1;
  v7 = 0;
  v8 = ((a2 & 0xFFF) + a3 + 4095i64) >> 12;
  SpinLock = (UINT64 *)(a1 + 80);
  v9 = a2;
  v10 = 0;
  v11 = 0;
  KeAcquireSpinLockRaiseToDpc((UINT64 *)(a1 + 80), a2);
  v13 = v12;
  LOBYTE(Param4) = v12;
  if( !*(_DWORD *)(v6 + 32) )
  {
LABEL_10:
    v14 = a3;
    goto LABEL_11;
  }
  v14 = a3;
  v15 = &v5[4 * *(unsigned int *)(v6 + 28)];
  v16 = v9 + a3;
  v17 = v5;
  if( v5 < v15 )
  {
    Param3 = v16;
    do
    {
      v19 = *v17;
      if( *v17 && v19 >= a2 && v19 < Param3 )
      {
        ViHalPreprocessOptions(
          &byte_140C12CE8,
          (PSTR)"Driver is trying to map an address range(%p-%p) that is already mapped    at %p",
          0x1Dui64,
          a2,
          Param3,
          *v17,
          Param4);
        VfReportIssueWithOptions(0xE6ui64, 0x1Dui64, a2, Param3, *v17, &byte_140C12CE8);
      }
      v17 += 4;
    }
    while( v17 < v15 );
    v13 = Param4;
    v10 = 0;
    v9 = a2;
    v11 = 0;
    v6 = a1;
    goto LABEL_10;
  }
  v9 = a2;
  v6 = a1;
LABEL_11:
  if( (_DWORD)v8 )
  {
    while( v10 != *(_DWORD *)(v6 + 28) )
    {
      v20 = v11 + 1;
      v11 = 0;
      if( !*v5 )
        v11 = v20;
      v5 += 4;
      ++v10;
      if( v11 >= (unsigned int)v8 )
        goto LABEL_16;
    }
    ViHalPreprocessOptions(
      &byte_140C12CF0,
      (PSTR)"Map registers needed: %x available: %x",
      0x10000000ui64,
      2ui64,
      (unsigned int)v8,
      v11,
      Param4);
    VfReportIssueWithOptions(0xE6ui64, 0i64, 2ui64, (unsigned int)v8, v11, &byte_140C12CF0);
    KxReleaseSpinLock(SpinLock);
  }
  else
  {
LABEL_16:
    v21 = &v5[-4 * (unsigned int)v8];
    *a5 = v10 - v8;
    if( (_DWORD)v8 )
    {
      v22 = a4;
      v23 = 4095;
      do
      {
        *v21 = v9;
        v21[3] = v9;
        v24 = 4096 - (v23 & v9);
        if( v24 >= v14 )
          v24 = v14;
        *((_DWORD *)v21 + 2) = v24;
        *((_DWORD *)v21 + 3) = 2 - (v22 != 0);
        _InterlockedIncrement((volatile signed __int32 *)(v6 + 32));
        ViTagBuffer((VOID *)((v23 & (unsigned int)v9) + v21[2] + 4096), *((unsigned int *)v21 + 2), 3u);
        v14 = v25 - *((_DWORD *)v21 + 2);
        v21 += 4;
        v9 = (v9 + 4096) & 0xFFFFFFFFFFFFF000ui64;
        LODWORD(v8) = v8 - 1;
      }
      while( (_DWORD)v8 );
    }
    KxReleaseSpinLock(SpinLock);
    v7 = 1;
  }
  __writecr8(v13);
  return v7;
}

Referenced by:

ViMapDoubleBuffer