MiReferenceIoPages

INT64 __fastcall MiReferenceIoPages(UINT64 a1, INT64 a2, INT64 a3, INT64 a4, _DWORD *a5, _RTL_BALANCED_NODE **a6){
  __int64 v8; 
  unsigned __int64 v9; 
  RTL_BALANCED_NODE **v10; 
  INT64 *v11; 
  unsigned __int64 v12; 
  __int64 v13; 
  char *v14; 
  unsigned __int8 CurrentIrql; 
  _QWORD *v16; 
  INT64 v17; 
  bool v18; 
  RTL_BALANCED_NODE *v19; 
  RTL_BALANCED_NODE *v20; 
  INT64 v21; 
  unsigned __int64 v22; 
  _RTL_BALANCED_NODE *v23; 
  unsigned __int16 *v24; 
  __int64 v25; 
  unsigned __int64 v26; 
  _DWORD *v27; 
  int v28; 
  unsigned __int16 v29; 
  int v30; 
  unsigned __int64 ParentValue; 
  RTL_BALANCED_NODE *v33; 
  int v34; 
  int v35; 
  _RTL_BALANCED_NODE *v36; 
  _RTL_BALANCED_NODE *v37; 
  signed __int64 v38; 
  int v39; 
  int v40; 
  unsigned int v41; 
  unsigned int v42; 
  INT64 v43; 
  unsigned __int64 v44; 
  unsigned __int64 *v45; 
  RTL_BALANCED_NODE **v46; 
  unsigned __int8 v47; 
  INT64 result[6]; 
  char v49; 
  v8 = (int)a1;
  v43 = a3;
  v41 = a1;
  v40 = a4;
  memset((INT64)result, 0i64);
  if( a5 )
    *a5 = 0;
  if( a6 )
    *a6 = 0i64;
  v42 = 0;
  v39 = 0;
  v9 = a2 & 0xFFFFFFFFFi64;
  v44 = v9;
  v45 = (unsigned __int64 *)&xmmword_140C4E988 + v8;
  v10 = &qword_140C4E998;
  v11 = 0i64;
  v12 = v9;
  if( (_DWORD)v8 != 1 )
    v10 = 0i64;
  v13 = -1i64;
  v46 = v10;
  v14 = 0i64;
  CurrentIrql = KeGetCurrentIrql();
  v47 = CurrentIrql;
  __writecr8(2ui64);
  if( v41 == 1 )
  {
    v16 = MiIoSpaceIsConstant(v9, a3);
    if( v16 )
      v40 = *((_DWORD *)v16 + 10);
  }
  ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)&dword_140C4E980);
  v17 = a3;
  if( a3 )
  {
    while( 1 )
    {
      v18 = 0;
      v19 = (RTL_BALANCED_NODE *)*v45;
      if( *v45 )
      {
        while( 1 )
        {
          ParentValue = v19[1].ParentValue;
          if( v9 < ParentValue )
          {
            v33 = v19->Children[0];
            if( !v19->Children[0] )
              break;
          }
          else
          {
            if( v9 < ParentValue + 512 )
            {
              v20 = v19;
              goto LABEL_18;
            }
            v33 = v19->Children[1];
            if( !v33 )
            {
              v18 = 1;
              break;
            }
          }
          v19 = v33;
        }
      }
      if( !v46 || (v20 = MiRemoveUnmappedIoNode(v46, v9)) == 0i64 )
      {
        LODWORD(v21) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
        v20 = (RTL_BALANCED_NODE *)v21;
        if( !v21 )
        {
          ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&dword_140C4E980);
          __writecr8(CurrentIrql);
          MiDereferenceIoPages(v41, v44, v9 - v44);
          return 3221225626i64;
        }
        *(_QWORD *)(v21 + 40) = v9 & 0xFFFFFFFFFFFFFE00ui64;
        *(_QWORD *)(v21 + 48) = v21 + 64;
        MiInitializeIoPageNodeArray(v21);
      }
      RtlAvlInsertNodeEx(v45, (__int64)v19, v18, v20);
      v17 = v43;
LABEL_18:
      if( a6 && !*a6 )
        *a6 = v20;
      v22 = v20[1].ParentValue;
      v23 = v20[2].Children[0];
      v24 = (unsigned __int16 *)((char *)v23 + 2 * (v9 - v22));
      if( v22 == -512i64 || v17 + v9 <= v22 + 512 )
        v25 = 2 * (v17 + v9 - v22);
      else
        v25 = 1024i64;
      v26 = (unsigned __int64)v23 + v25;
      if( v24 < (unsigned __int16 *)((char *)v23 + v25) )
        break;
LABEL_33:
      if( v39 )
      {
        v36 = v20[2].Children[0];
        v37 = (_RTL_BALANCED_NODE *)((char *)v36 + 1024);
        if( v36 < (_RTL_BALANCED_NODE *)&v36[42].16 )
        {
          do
          {
            if( ((__int64)v36->Children[0] & 0x3FFF) == 0 )
              LOWORD(v36->Children[0]) |= 0xC000u;
            v36 = (_RTL_BALANCED_NODE *)((char *)v36 + 2);
          }
          while( v36 < v37 );
          CurrentIrql = v47;
          v17 = v43;
        }
      }
      if( !v17 )
      {
        v12 = v44;
        goto LABEL_36;
      }
    }
    v27 = a5;
    v28 = v39;
    while( 1 )
    {
      v29 = *v24;
      if( (*v24 & 0x3FFF) == 0x3FFF )
        break;
      v30 = *v24 >> 14;
      if( (v29 & 0x3FFF) != 0 )
      {
        if( v30 == v40 )
          ++dword_140C4E9C0;
        else
          ++dword_140C4E9C4;
      }
      else
      {
        ++v20[2].Children[1];
        if( v30 == v40 )
        {
          ++dword_140C4E9CC;
        }
        else
        {
          if( v46 && (v29 & 0xC000) == 0x4000 && !v28 )
          {
            ++dword_140C4E9D0;
            if( !v11 )
            {
              v11 = result;
              v14 = &v49;
            }
            *(_QWORD *)v14 = v9;
            v14 += 8;
            if( v14 == (char *)(v11 + 22) )
            {
              ++dword_140C4E9C8;
              *v11 = 0i64;
              *((_DWORD *)v11 + 2) = 131248;
              v11[4] = 0i64;
              v11[5] = 0x10000i64;
              v34 = MiFlushCacheMdl();
              v35 = v39;
              v17 = v43;
              v11 = 0i64;
              if( v34 )
                v35 = 1;
              v39 = v35;
              v28 = v35;
            }
          }
          v27 = a5;
          v29 = (_WORD)v40 << 14;
        }
      }
      if( v27 )
        *v27 |= 1 << (v29 >> 14);
      --v17;
      ++v9;
      v43 = v17;
      *v24++ = (v29 ^ (v29 + 1)) & 0x3FFF ^ v29;
      if( (unsigned __int64)v24 >= v26 )
        goto LABEL_33;
    }
    v12 = v44;
    v42 = -1073741670;
    if( v9 != v44 )
      v13 = v9;
LABEL_36:
    if( v11 )
    {
      ++dword_140C4E9C8;
      v38 = v14 - (char *)v11;
      *v11 = 0i64;
      v11[4] = 0i64;
      *((_DWORD *)v11 + 11) = 0;
      *((_WORD *)v11 + 5) = 2;
      *((_DWORD *)v11 + 10) = (unsigned int)((v38 - 48) >> 3) << 12;
      *((_WORD *)v11 + 4) = 8 * (((v38 - 48) >> 3) + 6);
      MiFlushCacheMdl();
    }
  }
  ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&dword_140C4E980);
  __writecr8(CurrentIrql);
  if( v13 != -1 )
    MiDereferenceIoPages(v41, v12, v13 - v12);
  return v42;
}

Referenced by:

MiAddLoaderHalIoPte
MiFillSystemPtes
MiMapContiguousMemoryLarge
MiMapLockedPagesInUserSpace
MiMapViewOfPhysicalSection
MiProbeLockFrame
MmRotatePhysicalView