MiUpdateLargePageBitMap

VOID __stdcall MiUpdateLargePageBitMap(
        UINT64 PageFrameIndex,
        UINT64 NumberOfPages,
        UINT64 SettingBits,
        UINT64 BitsMustBeChanged,
        UINT64 BitsMustBeChangeda){
  int v7; 
  UINT64 v8; 
  int v9; 
  __int64 v10; 
  int v11; 
  INT64 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; 
  __int64 v24; 
  __int64 *v25; 
  __int64 v26; 
  __int64 *v27; 
  bool i; 
  unsigned __int8 v29; 
  unsigned __int64 v30; 
  __int64 v31; 
  unsigned __int64 v32; 
  __int64 *v33; 
  __int64 v34; 
  __int64 *v35; 
  bool j; 
  __int64 v37; 
  __int64 *v38; 
  __int64 v39; 
  __int64 *v40; 
  bool v41; 
  __int64 v42; 
  __int64 *v43; 
  __int64 v44; 
  __int64 *v45; 
  unsigned __int8 v46; 
  struct _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 = 16i64 * (unsigned int)v10 + v8 + 5064;
      if( !*(_QWORD *)v12 )
      {
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(&qword_140C4DD80, &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 >= *(_QWORD *)v12 )
        goto LABEL_28;
      if( v18 <= 1 )
      {
        if( v18 != 1 )
          goto LABEL_28;
        v29 = _bittest64(*(const signed __int64 **)(v12 + 8), v22);
LABEL_27:
        if( !v29 )
          goto LABEL_28;
      }
      else
      {
        if( *(_QWORD *)v12 - v22 < v18 )
          goto LABEL_28;
        v24 = *(_QWORD *)(v12 + 8);
        v25 = (__int64 *)(v24 + 8 * (v22 >> 6));
        v26 = *v25;
        v27 = (__int64 *)(v24 + 8 * ((v22 + v18 - 1) >> 6));
        if( v25 != v27 )
        {
          for( i = ((-1i64 << v22) & v26) == -1i64 << v22; i; i = *v25 == -1 )
          {
            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 < *(_QWORD *)v12 )
      {
        if( v19 <= 1 )
        {
          if( v19 == 1 )
          {
            v46 = _bittest64(*(const signed __int64 **)(v12 + 8), v30);
LABEL_77:
            if( v46 )
              goto LABEL_34;
          }
        }
        else if( *(_QWORD *)v12 - v30 >= v19 )
        {
          v31 = *(_QWORD *)(v12 + 8);
          v32 = v21 - 1;
          v33 = (__int64 *)(v31 + 8 * (v30 >> 6));
          v34 = *v33;
          v35 = (__int64 *)(v31 + 8 * (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 == -1 )
            {
              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 < *(_QWORD *)v12 )
      {
        if( v16 <= 1 )
        {
          if( v16 == 1 )
          {
            v17 = _bittest64(*(const signed __int64 **)(v12 + 8), v13);
            goto LABEL_10;
          }
          goto LABEL_54;
        }
        if( *(_QWORD *)v12 - v13 >= v16 )
        {
          v37 = *(_QWORD *)(v12 + 8);
          v38 = (__int64 *)(v37 + 8 * (v13 >> 6));
          v39 = *v38;
          v40 = (__int64 *)(v37 + 8 * ((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 != -1 )
                goto LABEL_54;
            }
            v41 = ((0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)v14 - 1)) & *v38) == 0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)v14 - 1);
            goto LABEL_66;
          }
        }
      }
    }
    else if( v13 < *(_QWORD *)v12 )
    {
      if( v16 <= 1 )
      {
        if( v16 == 1 )
        {
          v17 = !_bittest64(*(const signed __int64 **)(v12 + 8), v13);
          goto LABEL_10;
        }
        goto LABEL_54;
      }
      if( *(_QWORD *)v12 - v13 >= v16 )
      {
        v42 = *(_QWORD *)(v12 + 8);
        v43 = (__int64 *)(v42 + 8 * (v13 >> 6));
        v44 = *v43;
        v45 = (__int64 *)(v42 + 8 * ((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