MiUpdateLargePageBitMap

VOID __stdcall MiUpdateLargePageBitMap(
        UINT64 PageFrameIndex,
        UINT64 NumberOfPages,
        UINT64 SettingBits,
        UINT64 BitsMustBeChanged,
        UINT64 BitsMustBeChangeda){
  int v7; 
  UINT64 v8; 
  int v9; 
  __int64 v10; 
  int v11; 
  _RTL_BITMAP_EX *v12; 
  UINT64 v13; 
  UINT64 v14; 
  UINT64 v15; 
  UINT64 v16; 
  unsigned __int8 v17; 
  unsigned __int64 v18; 
  unsigned __int64 v19; 
  __int64 v20; 
  __int64 v21; 
  unsigned __int64 v22; 
  unsigned __int64 v23; 
  unsigned __int64 *Buffer; 
  unsigned __int64 *v25; 
  unsigned __int64 v26; 
  unsigned __int64 *v27; 
  bool i; 
  unsigned __int8 v29; 
  unsigned __int64 v30; 
  unsigned __int64 *v31; 
  unsigned __int64 v32; 
  unsigned __int64 *v33; 
  unsigned __int64 v34; 
  unsigned __int64 *v35; 
  bool j; 
  unsigned __int64 *v37; 
  unsigned __int64 *v38; 
  unsigned __int64 v39; 
  unsigned __int64 *v40; 
  bool v41; 
  unsigned __int64 *v42; 
  unsigned __int64 *v43; 
  unsigned __int64 v44; 
  unsigned __int64 *v45; 
  unsigned __int8 v46; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  unsigned __int64 v49; 

  v7 = BitsMustBeChanged;
  v8 = PageFrameIndex;
  memset(&LockHandle, 0, sizeof(LockHandle));
  if( SettingBits >= 0x200 )
  {
    v9 = BitsMustBeChangeda;
    LODWORD(v10) = 2;
    v11 = 0;
    while( 1 )
    {
      v10 = (unsigned int)(v10 - 1);
      v12 = (_RTL_BITMAP_EX *)(16i64 * (unsigned int)v10 + v8 + 5064);
      if( !v12->SizeOfBitMap )
      {
LABEL_29:
        if( v11 == 1 )
        {
          KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
          __writecr8(LockHandle.OldIrql);
        }
        return;
      }
      v49 = MiLargePageSizes[v10];
      v13 = NumberOfPages / v49;
      v14 = (~(v49 - 1) & (SettingBits + v49 + NumberOfPages - 1)) / v49;
      v15 = v14;
      v16 = v14 - NumberOfPages / v49;
      if( v9 != 1 )
        break;
LABEL_11:
      if( !v11 )
      {
        v11 = 1;
        KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C4DB30 + 74, &LockHandle);
      }
      if( v7 == 1 )
        RtlSetBitsEx(v12, v13, v16);
      else
        RtlClearBitsEx(v12, v13, v16);
      if( !(_DWORD)v10 )
        goto LABEL_29;
      v18 = MiLargePageSizes[(unsigned int)(v10 - 1)] / v49;
      v19 = v18;
      v20 = ~(v18 - 1);
      v21 = v20 & (v18 + v15 - 1);
      v22 = v20 & v13;
      v23 = v21 - v22;
      if( v7 != 1 )
        goto LABEL_34;
      if( v22 >= v12->SizeOfBitMap )
        goto LABEL_28;
      if( v18 <= 1 )
      {
        if( v18 != 1 )
          goto LABEL_28;
        v29 = _bittest64((const signed __int64 *)v12->Buffer, v22);
LABEL_27:
        if( !v29 )
          goto LABEL_28;
      }
      else
      {
        if( v12->SizeOfBitMap - v22 < v18 )
          goto LABEL_28;
        Buffer = v12->Buffer;
        v25 = &Buffer[v22 >> 6];
        v26 = *v25;
        v27 = &Buffer[(v22 + v18 - 1) >> 6];
        if( v25 != v27 )
        {
          for( i = ((-1i64 << v22) & v26) == -1i64 << v22; i; i = *v25 == -1i64 )
          {
            if( ++v25 == v27 )
            {
              if( ((0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)v22 + (unsigned __int8)v18 - 1)) & *v25) == 0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)v22 + (unsigned __int8)v18 - 1) )
                goto LABEL_39;
              v29 = 0;
              goto LABEL_27;
            }
          }
LABEL_28:
          v23 -= v19;
          if( !v23 )
            goto LABEL_29;
          v22 += v19;
          goto LABEL_39;
        }
        if( ((0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v18) << v22) & v26) != 0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v18) << v22 )
          goto LABEL_28;
      }
LABEL_39:
      v30 = v21 - v19;
      if( v21 - v19 < v12->SizeOfBitMap )
      {
        if( v19 <= 1 )
        {
          if( v19 == 1 )
          {
            v46 = _bittest64((const signed __int64 *)v12->Buffer, v30);
LABEL_77:
            if( v46 )
              goto LABEL_34;
          }
        }
        else if( v12->SizeOfBitMap - v30 >= v19 )
        {
          v31 = v12->Buffer;
          v32 = v21 - 1;
          v33 = &v31[v30 >> 6];
          v34 = *v33;
          v35 = &v31[v32 >> 6];
          if( v33 == v35 )
          {
            if( ((0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v19) << v30) & v34) == 0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v19) << v30 )
              goto LABEL_34;
          }
          else
          {
            for( j = ((-1i64 << v30) & v34) == -1i64 << v30; j; j = *v33 == -1i64 )
            {
              if( ++v33 == v35 )
              {
                if( ((0xFFFFFFFFFFFFFFFFui64 >> ~(_BYTE)v32) & *v33) == 0xFFFFFFFFFFFFFFFFui64 >> ~(_BYTE)v32 )
                  goto LABEL_34;
                v46 = 0;
                goto LABEL_77;
              }
            }
          }
        }
      }
      v23 -= v19;
      if( !v23 )
        goto LABEL_29;
LABEL_34:
      v8 = PageFrameIndex;
      NumberOfPages = v49 * v22;
      SettingBits = v49 * v23;
      v9 = v7;
    }
    if( v7 == 1 )
    {
      if( v13 < v12->SizeOfBitMap )
      {
        if( v16 <= 1 )
        {
          if( v16 == 1 )
          {
            v17 = _bittest64((const signed __int64 *)v12->Buffer, v13);
            goto LABEL_10;
          }
          goto LABEL_54;
        }
        if( v12->SizeOfBitMap - v13 >= v16 )
        {
          v37 = v12->Buffer;
          v38 = &v37[v13 >> 6];
          v39 = *v38;
          v40 = &v37[(v14 - 1) >> 6];
          if( v38 == v40 )
          {
            v41 = ((0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v16) << v13) & v39) == 0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v16) << v13;
LABEL_66:
            v17 = v41;
LABEL_10:
            if( v17 == 1 )
              goto LABEL_29;
            goto LABEL_11;
          }
          if( ((-1i64 << v13) & v39) == -1i64 << v13 )
          {
            while( ++v38 != v40 )
            {
              if( *v38 != -1i64 )
                goto LABEL_54;
            }
            v41 = ((0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)v14 - 1)) & *v38) == 0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)v14 - 1);
            goto LABEL_66;
          }
        }
      }
    }
    else if( v13 < v12->SizeOfBitMap )
    {
      if( v16 <= 1 )
      {
        if( v16 == 1 )
        {
          v17 = !_bittest64((const signed __int64 *)v12->Buffer, v13);
          goto LABEL_10;
        }
        goto LABEL_54;
      }
      if( v12->SizeOfBitMap - v13 >= v16 )
      {
        v42 = v12->Buffer;
        v43 = &v42[v13 >> 6];
        v44 = *v43;
        v45 = &v42[(v14 - 1) >> 6];
        if( v43 == v45 )
        {
          v41 = (v44 & (0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v16) << v13)) == 0;
          goto LABEL_66;
        }
        if( (v44 & (-1i64 << v13)) == 0 )
        {
          while( ++v43 != v45 )
          {
            if( *v43 )
              goto LABEL_54;
          }
          v41 = ((0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)v14 - 1)) & *v43) == 0;
          goto LABEL_66;
        }
      }
    }
LABEL_54:
    v17 = 0;
    goto LABEL_10;
  }
}

Referenced by:

MiActOnPartitionNodePages
MiAddPhysicalMemory
MiAssembleLargePagePfnList
MiCreateBootSlabEntries
MiCreateEnclaveRegions
MiDeleteSubsectionLargePages
MiDemotePfnListChain
MiDemoteValidLargePageOneLevel
MiFindContiguousPages
MiFindLargeNodePage
MiFreeLargePageMemory
MiFreeLargeZeroPages
MiFreeMdlPageRun
MiFreeSmallPageFromMdl
MiGetFastLargePages
MiInitializeDynamicPfns
MiLinkPoolCommitChain
MiMarkLargePagePte
MiMarkLargePageRanges
MiRebuildLargePage