ViAllocateMapRegistersFromFile

UINT64 __stdcall ViAllocateMapRegistersFromFile(
        _MAP_REGISTER_FILE *MapRegisterFile,
        VOID *CurrentSa,
        UINT64 Length,
        UINT8 WriteToDevice,
        UINT64 *MapRegisterNumber){
  _MAP_REGISTER_FILE *v5; 
  _MAP_REGISTER_FILE *v6; 
  unsigned int v7; 
  unsigned __int64 v8; 
  unsigned __int64 v9; 
  int v10; 
  ULONG_PTR v11; 
  unsigned __int8 v12; 
  unsigned int v13; 
  _MAP_REGISTER_FILE *v14; 
  UINT64 v15; 
  UINT64 *v16; 
  UINT64 Param3; 
  unsigned __int64 v18; 
  ULONG_PTR v19; 
  _MAP_REGISTER_FILE *v20; 
  UINT8 v21; 
  int v22; 
  unsigned int v23; 
  int v24; 
  UINT64 a7; 
  UINT64 *SpinLock; 
  unsigned int v30; 

  v30 = Length;
  v5 = MapRegisterFile + 22;
  v6 = MapRegisterFile;
  v7 = 0;
  v8 = (((unsigned __int16)CurrentSa & 0xFFF) + (unsigned __int64)(unsigned int)Length + 4095) >> 12;
  SpinLock = (UINT64 *)(MapRegisterFile + 20);
  v9 = (unsigned __int64)CurrentSa;
  v10 = 0;
  v11 = 0;
  v12 = KeAcquireSpinLockRaiseToDpc((UINT64 *)MapRegisterFile + 10);
  LOBYTE(a7) = v12;
  if( !v6[8] )
  {
LABEL_10:
    v13 = v30;
    goto LABEL_11;
  }
  v13 = v30;
  v14 = &v5[8 * v6[7]];
  v15 = v9 + v30;
  v16 = (UINT64 *)v5;
  if( v5 < v14 )
  {
    Param3 = v15;
    do
    {
      v18 = *v16;
      if( *v16 && v18 >= (unsigned __int64)CurrentSa && v18 < Param3 )
      {
        ViHalPreprocessOptions(
          &unk_140C12CE8,
          (PSTR)"Driver is trying to map an address range(%p-%p) that is already mapped    at %p",
          0x1Dui64,
          (UINT64)CurrentSa,
          Param3,
          *v16,
          a7);
        VfReportIssueWithOptions(0xE6ui64, 0x1Du, (ULONG_PTR)CurrentSa, Param3, *v16, &unk_140C12CE8);
      }
      v16 += 4;
    }
    while( v16 < (UINT64 *)v14 );
    v12 = a7;
    v10 = 0;
    v9 = (unsigned __int64)CurrentSa;
    v11 = 0;
    v6 = MapRegisterFile;
    goto LABEL_10;
  }
  v9 = (unsigned __int64)CurrentSa;
  v6 = MapRegisterFile;
LABEL_11:
  if( (_DWORD)v8 )
  {
    while( v10 != v6[7] )
    {
      v19 = v11 + 1;
      v11 = 0;
      if( !*(_QWORD *)v5 )
        v11 = v19;
      v5 += 8;
      ++v10;
      if( v11 >= (unsigned int)v8 )
        goto LABEL_16;
    }
    ViHalPreprocessOptions(
      (UINT64 *)((char *)&qword_140C12CEC + 4),
      (PSTR)"Map registers needed: %x available: %x",
      0x10000000ui64,
      2ui64,
      (unsigned int)v8,
      v11,
      a7);
    VfReportIssueWithOptions(0xE6ui64, 0, 2u, v8, v11, (UINT64 *)((char *)&qword_140C12CEC + 4));
    KxReleaseSpinLock(SpinLock);
  }
  else
  {
LABEL_16:
    v20 = &v5[-8 * (unsigned int)v8];
    *(_DWORD *)MapRegisterNumber = v10 - v8;
    if( (_DWORD)v8 )
    {
      v21 = WriteToDevice;
      v22 = 4095;
      do
      {
        *(_QWORD *)v20 = v9;
        *((_QWORD *)v20 + 3) = v9;
        v23 = 4096 - (v22 & v9);
        if( v23 >= v13 )
          v23 = v13;
        v20[2] = v23;
        v20[3] = 2 - (v21 != 0);
        _InterlockedIncrement(v6 + 8);
        ViTagBuffer((VOID *)((v22 & (unsigned int)v9) + *((_QWORD *)v20 + 2) + 4096i64), (unsigned int)v20[2], 3u);
        v13 = v24 - v20[2];
        v20 += 8;
        v9 = (v9 + 4096) & 0xFFFFFFFFFFFFF000ui64;
        LODWORD(v8) = v8 - 1;
      }
      while( (_DWORD)v8 );
    }
    KxReleaseSpinLock(SpinLock);
    v7 = 1;
  }
  __writecr8(v12);
  return v7;
}

Referenced by:

ViMapDoubleBuffer