MiInitializeDriverPtes

NTSTATUS __stdcall MiInitializeDriverPtes(INT64 LoaderBlock){
  _RTL_BALANCED_NODE *v1; 
  INT64 v2; 
  _RTL_BALANCED_NODE *v3; 
  BOOL v4; 
  _RTL_BALANCED_NODE *Pool; 
  _RTL_BALANCED_NODE *v6; 
  _RTL_BALANCED_NODE *v7; 
  _RTL_BALANCED_NODE *v8; 
  _RTL_BALANCED_NODE *v9; 
  _RTL_BALANCED_NODE *v10; 
  _QWORD *Children; 
  _QWORD *v12; 
  _MMPTE *PteBase; 
  _QWORD *v14; 
  _QWORD *v15; 
  PVOID i; 
  unsigned int v17; 
  unsigned int v18; 
  unsigned int v19; 
  unsigned int v20; 
  int v21; 
  __int64 v22; 
  unsigned int v23; 
  unsigned int v24; 
  __int64 *v25; 
  __int64 j; 
  unsigned __int64 v27; 
  unsigned int v28; 
  __int64 v29; 
  unsigned int v30; 
  unsigned int v31; 
  unsigned int v32; 
  unsigned int v33; 
  int v34; 
  __int64 v35; 
  unsigned int v36; 
  unsigned int v37; 
  _QWORD *v38; 
  __int64 k; 
  unsigned __int64 v40; 
  unsigned int v41; 
  INT64 v42; 
  int v43; 
  __int64 v44; 
  int v45; 
  _RTL_BALANCED_NODE *v46; 
  INT64 *m; 
  INT64 *v48; 
  INT64 **v49; 
  INT64 *v50; 
  INT64 *v51; 
  unsigned int v53; 
  _RTL_BALANCED_NODE *Tree; 

  v1 = 0i64;
  v2 = LoaderBlock + 16;
  v3 = *(_RTL_BALANCED_NODE **)(LoaderBlock + 16);
  Tree = 0i64;
  while( v3 != (_RTL_BALANCED_NODE *)v2 )
  {
    if( !MI_IS_PHYSICAL_ADDRESS(v3[2].Children[0]) )
    {
      Pool = (_RTL_BALANCED_NODE *)MiAllocatePool(64i64, 0x20ui64, 0x70446D4Dui64);
      v6 = Pool;
      if( !Pool )
        return 0;
      v4 = 0;
      Pool[1].Children[0] = v3;
      v7 = v3[2].Children[0];
      if( v1 )
      {
        while( 1 )
        {
          v8 = v1[1].Children[0];
          v9 = v8[2].Children[0];
          if( v7 <= (_RTL_BALANCED_NODE *)((char *)v9 + (unsigned int)(*(_DWORD *)&v8[2]._bf_0 - 1)) && v7 < v9 )
          {
            v10 = v1->Children[0];
            if( !v1->Children[0] )
              break;
          }
          else
          {
            v10 = v1->Children[1];
            if( !v10 )
            {
              v4 = 1;
              break;
            }
          }
          v1 = v10;
        }
      }
      RtlAvlInsertNodeEx(&Tree, (UINT64)v1, v4, v6);
      v1 = Tree;
    }
    v3 = v3->Children[0];
  }
  Children = 0i64;
  while( v1 )
  {
    Children = v1->Children;
    v1 = v1->Children[0];
  }
  while( 1 )
  {
    PteBase = MmGetPteBase();
    if( !Children )
      break;
    if( !MiReserveBootDriverPtes(
            (UINT64)PteBase + ((*(_QWORD *)(Children[3] + 48i64) >> 9) & 0x7FFFFFFFF8i64),
            *(_DWORD *)(Children[3] + 64i64) >> 12) )
      return 0;
    v14 = (_QWORD *)Children[1];
    v15 = Children;
    if( v14 )
    {
      v12 = (_QWORD *)*v14;
      Children = (_QWORD *)Children[1];
      if( *v14 )
      {
        do
        {
          Children = v12;
          v12 = (_QWORD *)*v12;
        }
        while( v12 );
      }
    }
    else
    {
      while( 1 )
      {
        Children = (_QWORD *)(Children[2] & 0xFFFFFFFFFFFFFFFCui64);
        if( !Children || (_QWORD *)*Children == v15 )
          break;
        v15 = Children;
      }
    }
  }
  for( i = qword_140C4CA70; i; i = *(PVOID *)i )
  {
    v17 = 0;
    do
    {
      v18 = *((_DWORD *)i + 4);
      v19 = v17 < v18 ? v17 : 0;
      v20 = v18 - 1;
      v21 = (*((_DWORD *)i + 6) & 4) != 0i64 ? 0x20 : 0;
      v22 = *((_QWORD *)i + 3) - ((*((_QWORD *)i + 3) & 4i64) != 0 ? 4 : 0);
      while( 1 )
      {
        v23 = v21 + v20;
        v24 = v21 + v19;
        if( v20 - v19 == -1 )
          goto LABEL_65;
        v25 = (__int64 *)(v22 + 8 * ((unsigned __int64)v24 >> 6));
        for( j = *v25 | ((1i64 << (v24 & 0x3F)) - 1); j == -1; j = *v25 )
        {
          if( (unsigned __int64)++v25 > v22 + 8 * ((unsigned __int64)v23 >> 6) )
            goto LABEL_65;
        }
        _BitScanForward64(&v27, ~j);
        v28 = v27 + ((unsigned int)(((__int64)v25 - v22) >> 3) << 6);
        if( v28 > v23 )
        {
LABEL_65:
          v28 = -1;
        }
        else if( v28 != -1 )
        {
          break;
        }
        if( !v19 )
          break;
        v53 = v17 + 1;
        if( v17 + 1 > v18 )
          v53 = *((_DWORD *)i + 4);
        v20 = v53 - 1;
        v19 = 0;
      }
      v29 = v28 - v21;
      if( v28 == -1 )
        v29 = 0xFFFFFFFFi64;
      if( (unsigned int)v29 < v17 || (_DWORD)v29 == -1 )
        break;
      v30 = *((_DWORD *)i + 4);
      v31 = v29 + 1;
      v32 = v31 < v30 ? v31 : 0;
      v33 = v30 - 1;
      v34 = (*((_DWORD *)i + 6) & 4) != 0i64 ? 0x20 : 0;
      v35 = *((_QWORD *)i + 3) - ((*((_QWORD *)i + 3) & 4i64) != 0 ? 4 : 0);
      while( 1 )
      {
        v36 = v34 + v33;
        v37 = v34 + v32;
        if( v33 - v32 == -1 )
          goto LABEL_60;
        v38 = (_QWORD *)(v35 + 8 * ((unsigned __int64)v37 >> 6));
        for( k = ~*v38 | ((1i64 << (v37 & 0x3F)) - 1); k == -1; k = ~*v38 )
        {
          if( (unsigned __int64)++v38 > v35 + 8 * ((unsigned __int64)v36 >> 6) )
            goto LABEL_60;
        }
        _BitScanForward64(&v40, ~k);
        v41 = v40 + ((unsigned int)(((__int64)v38 - v35) >> 3) << 6);
        if( v41 > v36 )
        {
LABEL_60:
          v41 = -1;
        }
        else if( v41 != -1 )
        {
          break;
        }
        if( !v32 )
          break;
        v45 = v29 + 2;
        if( (int)v29 + 2 > v30 )
          v45 = *((_DWORD *)i + 4);
        v33 = v45 - 1;
        v32 = 0;
      }
      v17 = v41 - v34;
      if( v41 == -1 )
        v17 = -1;
      if( v17 < v31 || v17 == -1 )
        v17 = *((_DWORD *)i + 4);
      v42 = *((_QWORD *)i + 1) + 8 * v29;
      v43 = v17 - v29;
      if( v17 != (_DWORD)v29 )
      {
        do
        {
          LODWORD(v44) = MI_READ_PTE_LOCK_FREE(v42);
          if( v44 )
            _bittestandset(*((signed __int32 **)i + 3), v29);
          LODWORD(v29) = v29 + 1;
          v42 += 8i64;
          --v43;
        }
        while( v43 );
      }
    }
    while( v17 < *((_DWORD *)i + 4) );
  }
  if( (KiSpeculationFeatures & 0x4000000) != 0 )
    *(&stru_140C4DB30 + 97) = (unsigned __int64)(((__int64)((*((_QWORD *)qword_140C4CA70 + 1) << 25)
                                                          + ((unsigned __int64)*((unsigned int *)qword_140C4CA70 + 4) << 28)
                                                          - ((_QWORD)MmGetPteBase() << 25)) >> 16)
                                               - *(&stru_140C4DB30 + 98)) >> 21;
  v46 = Tree;
  m = 0i64;
  while( v46 )
  {
    m = (INT64 *)v46;
    v46 = v46->Children[0];
  }
  while( m )
  {
    v49 = (INT64 **)m[1];
    v50 = m;
    v51 = m;
    if( v49 )
    {
      v48 = *v49;
      for( m = (INT64 *)m[1]; v48; v48 = (INT64 *)*v48 )
        m = v48;
    }
    else
    {
      while( 1 )
      {
        m = (INT64 *)(m[2] & 0xFFFFFFFFFFFFFFFCui64);
        if( !m || (INT64 *)*m == v51 )
          break;
        v51 = m;
      }
    }
    RtlAvlRemoveNode((UINT64 *)&Tree, v50);
    ExFreePoolWithTag(v50, 0);
  }
  return 1;
}

Referenced by:

MiInitializeDriverImages