MiGetPrototypePteRanges

NTSTATUS __stdcall MiGetPrototypePteRanges(UINT64 a1, _RTL_BITMAP *a2){
  UINT64 v2; 
  NTSTATUS v4; 
  unsigned __int8 v5; 
  _RTL_BALANCED_NODE *Root; 
  unsigned __int64 v7; 
  unsigned __int64 v8; 
  unsigned __int64 v9; 
  unsigned __int64 v10; 
  unsigned __int64 v11; 
  UINT64 v12; 
  UINT64 v13; 
  __int64 v14; 
  unsigned __int64 v15; 
  unsigned __int64 v16; 
  unsigned __int64 v17; 
  unsigned __int64 j; 
  _QWORD *i; 
  _QWORD *v20; 
  unsigned __int64 v21; 
  UINT64 v22; 
  __int64 v23; 
  __int64 v24; 
  unsigned __int64 v25; 
  UINT64 NumberToSet; 
  _RTL_BITMAP *BitMapHeader; 
  __int64 v29; 

  BitMapHeader = a2;
  NumberToSet = 0i64;
  v2 = a1 + 4096;
  v4 = 1;
  v5 = ExAcquireSpinLockShared(&qword_140C4C880);
  Root = RootPointer.Root;
  v7 = v5;
  while( Root )
  {
    v29 = 0i64;
    v8 = MiObtainProtoBaseFromNode(Root, &v29);
    if( v9 >= v8 )
    {
      if( a1 < v8 + 8 * v29 )
        break;
      Root = Root->Children[1];
    }
    else
    {
      Root = Root->Children[0];
    }
  }
  v10 = (unsigned __int64)Root;
  if( Root )
  {
    while( 1 )
    {
      v11 = MiObtainProtoBaseFromNode((_QWORD *)v10, &NumberToSet);
      v12 = NumberToSet;
      v13 = v11;
      if( v11 < a1 )
      {
        if( v11 + 8 * NumberToSet > a1 )
        {
          v13 = a1;
          v12 = NumberToSet - ((__int64)(a1 - v11) >> 3);
          NumberToSet = v12;
        }
        if( v13 < a1 )
          break;
      }
      if( v13 >= v2 )
        break;
      if( (*(_BYTE *)(v10 + 24) & 7) == 4 )
      {
        v4 = 0;
        break;
      }
      v14 = (__int64)(v13 - a1) >> 3;
      if( v12 + (unsigned int)v14 > 0x200 )
      {
        LODWORD(v12) = 512 - v14;
        NumberToSet = (unsigned int)(512 - v14);
      }
      RtlSetBits(BitMapHeader, (unsigned int)v14, (unsigned int)v12);
      if( (_DWORD)v14 )
      {
        v15 = *(_QWORD *)v10;
        v16 = v10;
        if( *(_QWORD *)v10 )
        {
          while( 1 )
          {
            v10 = v15;
            if( !*(_QWORD *)(v15 + 8) )
              break;
            v15 = *(_QWORD *)(v15 + 8);
          }
        }
        else
        {
          while( 1 )
          {
            v10 = *(_QWORD *)(v10 + 16) & 0xFFFFFFFFFFFFFFFCui64;
            if( !v10 || *(_QWORD *)(v10 + 8) == v16 )
              break;
            v16 = v10;
          }
        }
        if( v10 )
          continue;
      }
      break;
    }
    v17 = (unsigned __int64)Root->Children[1];
    if( v17 )
    {
      for( i = *(_QWORD **)v17; i; i = (_QWORD *)*i )
        v17 = (unsigned __int64)i;
    }
    else
    {
      for( j = Root->ParentValue; ; j = *(_QWORD *)(v17 + 16) )
      {
        v17 = j & 0xFFFFFFFFFFFFFFFCui64;
        if( !v17 || *(_RTL_BALANCED_NODE **)v17 == Root )
          break;
        Root = (_RTL_BALANCED_NODE *)v17;
      }
    }
    while( v17 )
    {
      v21 = MiObtainProtoBaseFromNode((_QWORD *)v17, &NumberToSet);
      if( v21 >= v2 || v21 < a1 )
        break;
      if( (*(_BYTE *)(v17 + 24) & 7) == 4 )
      {
        v4 = 0;
        break;
      }
      v22 = NumberToSet;
      v23 = (__int64)(v21 - a1) >> 3;
      v24 = (unsigned int)v23;
      if( (unsigned int)v23 + NumberToSet > 0x200 )
      {
        v22 = (unsigned int)(512 - v23);
        NumberToSet = v22;
      }
      RtlSetBits(BitMapHeader, (unsigned int)v23, (unsigned int)v22);
      if( v24 + v22 == 512 )
        break;
      v20 = *(_QWORD **)(v17 + 8);
      v25 = v17;
      if( v20 )
      {
        do
        {
          v17 = (unsigned __int64)v20;
          v20 = (_QWORD *)*v20;
        }
        while( v20 );
      }
      else
      {
        while( 1 )
        {
          v17 = *(_QWORD *)(v17 + 16) & 0xFFFFFFFFFFFFFFFCui64;
          if( !v17 || *(_QWORD *)v17 == v25 )
            break;
          v25 = v17;
        }
      }
    }
  }
  ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)&qword_140C4C880);
  __writecr8(v7);
  return v4;
}

Referenced by:

MiReplacePageOfProtoPool