RtlpHpLfhSlotAllocate

INT64 __fastcall RtlpHpLfhSlotAllocate(UINT64 rcx0, INT64 a2, INT64 r8_0, UINT64 a4, UINT64 arg20){
  INT64 v5; 
  UINT64 v6; 
  int v7; 
  INT64 v8; 
  unsigned int v9; 
  signed __int64 v10; 
  signed __int64 v11; 
  unsigned __int64 v12; 
  UINT64 v13; 
  INT64 v14; 
  unsigned __int64 v15; 
  __int64 v16; 
  unsigned int v17; 
  unsigned int v18; 
  unsigned int v19; 
  unsigned int v20; 
  unsigned int v21; 
  int v22; 
  unsigned __int16 v23; 
  unsigned int v24; 
  char v25; 
  __int64 v26; 
  __int64 v27; 
  __int64 v28; 
  int v29; 
  __int64 v30; 
  __int64 v31; 
  signed __int16 *v32; 
  signed __int16 *v33; 
  unsigned __int64 v34; 
  UINT8 v35; 
  signed __int16 v36; 
  signed __int16 v37; 
  int v38; 
  int v39; 
  UINT64 v40; 
  INT64 v41; 
  INT64 v42; 
  INT64 Subsegment; 
  INT64 v45; 
  unsigned __int16 v46; 
  INT64 v47; 
  unsigned __int16 v48; 
  unsigned __int16 v49; 
  unsigned __int16 v50; 
  unsigned __int16 v51; 
  unsigned int v52; 
  __int64 *v53; 
  _QWORD *v54; 
  __int64 **v55; 
  INT64 v56; 
  INT64 *v57; 
  INT64 *v58; 
  bool v59; 
  INT64 v60; 
  unsigned __int64 v61; 
  __int64 v62; 
  unsigned int v63; 
  unsigned int v64; 
  unsigned int v65; 
  unsigned int v66; 
  unsigned __int16 v67; 
  UINT64 v68; 
  unsigned int v69; 
  unsigned int v70; 
  char v71; 
  __int64 v72; 
  INT64 v73; 
  __int64 v74; 
  __int64 v75; 
  __int64 v76; 
  signed __int16 *v77; 
  signed __int16 *v78; 
  unsigned __int64 v79; 
  signed __int16 v80; 
  signed __int16 v81; 
  int v82; 
  unsigned int v83; 
  __int64 v84; 
  unsigned int v85; 
  UINT64 v86; 
  INT64 v87; 
  INT64 v88; 
  UINT8 v89; 
  _ETHREAD *v90; 
  ULONG_PTR v91; 
  UINT8 v92; 
  _ETHREAD *v93; 
  ULONG_PTR v94; 
  char v95; 
  int v96; 
  __int64 v97; 
  bool v98; 
  __int64 v99; 
  unsigned __int64 v100; 
  __int64 v101; 
  unsigned __int8 v102; 
  char v103; 
  int(__fastcall *v104)(__int64, unsigned __int64, _QWORD, __int64); 
  int v105; 
  unsigned int v106; 
  unsigned int v107; 
  __int64 v108; 
  ULONG_PTR v109; 
  int v110; 
  __int64 v111; 
  unsigned __int64 v112; 
  unsigned __int8 v113; 
  UINT64 v114; 
  INT64 *v115; 
  UINT8 v116; 
  _ETHREAD *v117; 
  unsigned int v118; 
  _ETHREAD *CurrentThread; 
  unsigned int SessionId; 
  int v121; 
  char v122; 
  int(__fastcall *v123)(__int64, INT64, _QWORD, __int64); 
  unsigned int v124; 
  unsigned int v125; 
  __int64 v126; 
  unsigned int v127; 
  __int16 v128; 
  _ETHREAD *v129; 
  ULONG_PTR v130; 
  char v131; 
  int v132; 
  __int64 v133; 
  unsigned __int64 v134; 
  unsigned __int8 v135; 
  char v136; 
  int v137; 
  __int64 v138; 
  unsigned __int64 v139; 
  unsigned __int8 v140; 
  char v141; 
  int v142; 
  __int64 v143; 
  unsigned __int64 v144; 
  unsigned __int8 v145; 
  UINT8 v146; 
  __int64 v147; 
  UINT8 v148; 
  UINT64 v149; 
  _ETHREAD *v150; 
  unsigned int v151; 
  char v152; 
  int v153; 
  __int64 v154; 
  unsigned __int64 v155; 
  __int64 v156; 
  unsigned __int8 v157; 
  UINT64 v158; 
  _ETHREAD *v159; 
  ULONG_PTR v160; 
  char v161; 
  int v162; 
  __int64 v163; 
  unsigned __int64 v164; 
  __int64 v165; 
  _ETHREAD *v166; 
  unsigned int v167; 
  char v168; 
  int v169; 
  __int64 v170; 
  unsigned __int64 v171; 
  unsigned __int8 v172; 
  INT64 a6; 
  UINT8 v174; 
  unsigned __int8 v175; 
  UINT8 v176; 
  char v177; 
  unsigned int v178; 
  UINT8 a7; 
  UINT8 v180; 
  int v181; 
  UINT64 a3; 
  UINT64 v183; 
  unsigned int v184; 
  unsigned int v185; 
  int v186; 
  UINT64 v187; 
  INT64 v188; 
  __int64 v189; 
  int v190; 
  int v191; 
  int a5; 
  int v193; 
  int v194; 
  int v195; 
  int v196; 
  int v197; 
  int v198; 
  int v199; 
  int v200; 
  int v201; 
  int v202; 
  int v203; 
  unsigned int v204; 
  int v205; 
  int v206; 
  int v207; 
  int v208; 
  UINT64 v209[2]; 
  UINT64 v210[11]; 
  unsigned int v214; 
  v214 = a4;
  v5 = r8_0;
  v6 = rcx0;
  v174 = -1;
  v7 = 0;
  v181 = 0;
  v186 = 0;
  v8 = r8_0 + 16;
  v188 = 0i64;
  v9 = ((unsigned int)RtlpHpLfhPerfFlags >> 2) & 1;
  while( 1 )
  {
    while( 1 )
    {
      if( v9 )
      {
        while( 1 )
        {
          _m_prefetchw((const void *)(v5 + 56));
          v10 = *(_QWORD *)(v5 + 56);
          if( (v10 & 0xFFF) != 0 )
          {
            while( 1 )
            {
              v11 = _InterlockedCompareExchange64((volatile signed __int64 *)(v5 + 56), v10 - 1, v10);
              if( v10 == v11 )
                break;
              v186 = 1;
              v10 = v11;
              if( (v11 & 0xFFF) == 0 )
                goto LABEL_38;
            }
            v12 = v10 & 0xFFFFFFFFFFFFF000ui64;
            if( v12 )
              break;
          }
LABEL_38:
          if( v7 == 2 )
            goto LABEL_39;
          v88 = *(unsigned __int8 *)(v6 + 57);
          v7 = 2;
          v181 = 2;
          v89 = RtlpHpAcquireLockExclusive((INT64 *)(v5 + 16), v88);
          v6 = rcx0;
          v174 = v89;
        }
        if( v7 )
        {
          if( *(_BYTE *)(v6 + 57) )
          {
            ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v5 + 16));
            __writecr8(v174);
            v13 = 0i64;
            v181 = 0;
          }
          else
          {
            if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v5 + 16), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
              ExfTryToWakePushLock((volatile INT64 *)(v5 + 16));
            v208 = 0;
            CurrentThread = (_ETHREAD *)KeGetCurrentThread();
            if( (unsigned int)MiGetSystemRegionType(v5 + 16) == 1 )
              SessionId = MmGetSessionIdEx(*((_QWORD *)CurrentThread + 23));
            else
              SessionId = -1;
            --*((_WORD *)CurrentThread + 243);
            v136 = ++*((_BYTE *)CurrentThread + 794);
            v137 = (*((char *)CurrentThread + 792) | *((char *)CurrentThread + 870)) ^ 0x3F;
            v98 = !_BitScanReverse((unsigned int *)&v138, v137);
            v207 = v138;
            if( v98 )
              goto LABEL_222;
            while( 1 )
            {
              v139 = *((_QWORD *)CurrentThread + 100) + 96 * v138;
              v137 &= ~(1 << v138);
              if( (*(_BYTE *)(v139 + 26) & 1) != 0
                && (*(_DWORD *)(v139 + 32) & 1) == 0
                && (*(_QWORD *)(v139 + 32) & 0x7FFFFFFFFFFFFFFCi64) == ((v5 + 16) & 0x7FFFFFFFFFFFFFFCi64)
                && *(_DWORD *)(v139 + 40) == SessionId )
              {
                *(_BYTE *)(v139 + 26) &= ~1u;
                if( *(_QWORD *)(v139 + 32) )
                  break;
              }
              v98 = !_BitScanReverse((unsigned int *)&v138, v137);
              v207 = v138;
              if( v98 )
                goto LABEL_222;
            }
            if( !v139 )
            {
LABEL_222:
              if( (*((_DWORD *)CurrentThread + 30) & 0x10000) == 0 )
                KeBugCheckEx(0x162u, (ULONG_PTR)CurrentThread, v5 + 16, SessionId, 0i64);
            }
            else
            {
              *(_BYTE *)(v139 + 32) |= 2u;
              if( *(__int64 *)(v139 + 32) < 0 )
                KiAbEntryRemoveFromTree(v139);
              v208 = *(_DWORD *)(v139 + 88) & 0x1FFFF;
              *(_DWORD *)(v139 + 88) &= 0xFFFE0000;
              *(_BYTE *)(v139 + 25) &= ~1u;
              *(_QWORD *)(v139 + 32) = 0i64;
              v140 = 1 << ((__int64)(v139 - *((_QWORD *)CurrentThread + 100)) / 96);
              if( v136 == 1 )
                *((_BYTE *)CurrentThread + 792) |= v140;
              else
                _InterlockedOr8((volatile signed __int8 *)CurrentThread + 870, v140);
            }
            --*((_BYTE *)CurrentThread + 794);
            KiAbThreadRemoveBoosts((ULONG_PTR)CurrentThread, v5 + 16, (unsigned int *)&v208);
            v98 = (*((_WORD *)CurrentThread + 243))++ == 0xFFFF;
            if( v98 && *((_ETHREAD **)CurrentThread + 19) != (_ETHREAD *)((char *)CurrentThread + 152) )
              KiCheckForKernelApcDelivery();
            KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
            v13 = 0i64;
            v181 = 0;
          }
        }
        else
        {
          v13 = 0i64;
        }
        v14 = 3i64;
        v15 = 2 * (*(unsigned __int16 *)(v12 + 34) + (unsigned __int64)*(unsigned __int8 *)(v12 + 39));
        v209[1] = v12 + 48;
        v16 = *(unsigned __int8 *)(v5 + 1);
        v209[0] = v15;
        LODWORD(v183) = *((unsigned __int8 *)RtlpSearchWidth + v16);
        v178 = (unsigned int)v12 >> 12;
        v17 = (unsigned __int16)(WORD4(RtlpHpHeapGlobals) ^ *(_WORD *)(v12 + 40) ^ ((unsigned int)v12 >> 12));
        v18 = (DWORD2(RtlpHpHeapGlobals) ^ *(_DWORD *)(v12 + 40) ^ ((unsigned int)v12 >> 12)) >> 16;
        v19 = v18;
        v20 = v18;
        v184 = v17;
        if( v214 >= v17 )
          v14 = 1i64;
        if( (*(_BYTE *)(rcx0 + 62) & 2) != 0 )
        {
          v21 = v184;
          v20 = v18;
          if( v214 >= v17 )
            v20 = v18;
        }
        else
        {
          v13 = *((unsigned __int8 *)RtlpLowFragHeapRandomData + (unsigned __int16)RtlpLfhIncrementDataSlot());
          v21 = v184;
          if( v214 >= v184 )
            v20 = v19;
        }
        v22 = RtlpLfhBlockBitmapAllocate(v209, *(unsigned __int16 *)(v12 + 36), v13, (unsigned int)v183, v14);
        v23 = v178;
        LODWORD(v187) = v22;
        *(_WORD *)(v12 + 36) = v22;
        v24 = v20 + v22 * v21;
        if( *(_BYTE *)(v12 + 45) > 1u )
        {
          v25 = *(_BYTE *)(v12 + 44);
          v26 = *(unsigned __int16 *)(v12 + 46);
          v27 = 0i64;
          a5 = 0;
          v28 = v24 >> v25;
          v29 = *(unsigned __int16 *)(v12 + 40) ^ (unsigned __int16)v178;
          a7 = -1;
          v175 = -1;
          v185 = WORD4(RtlpHpHeapGlobals) ^ v29;
          v30 = 2 * v28;
          v31 = ((v24 + v185 - 1) >> v25) - (unsigned int)v28 + 1;
          v32 = (signed __int16 *)(2 * v28 + v12 + v26);
          _m_prefetchw(v32);
          v33 = &v32[v31];
          LODWORD(v183) = 0;
          v189 = 0i64;
          LODWORD(a3) = -1;
          if( v32 < v33 )
          {
            v34 = (unsigned __int64)v33;
            do
            {
              v35 = v175;
              while( 1 )
              {
                v36 = *v32;
                while( v36 > 0 )
                {
                  v37 = v36;
                  v36 = _InterlockedCompareExchange16(v32, v36 + 1, v36);
                  if( v37 == v36 )
                  {
                    v38 = v183;
                    v39 = a3;
                    goto LABEL_21;
                  }
                }
                if( (_DWORD)v27 )
                  break;
                v204 = 1;
                v92 = RtlpHpAcquireLockExclusive((INT64 *)(v12 + 24), *(unsigned __int8 *)(rcx0 + 57));
                v27 = v204;
                v35 = v92;
                v175 = v92;
              }
              v39 = a3;
              if( v36 )
              {
                v38 = v183 + 1;
                LODWORD(v183) = v183 + 1;
                v189 = v30 >> 1;
                if( (_DWORD)a3 == -1 )
                {
                  v39 = v30 >> 1;
                  LODWORD(a3) = v39;
                }
              }
              else
              {
                v38 = v183 - 1;
                LODWORD(v183) = v183 - 1;
              }
              *v32 = v36 + 1;
LABEL_21:
              ++v32;
              v30 += 2i64;
            }
            while( (unsigned __int64)v32 < v34 );
            v5 = r8_0;
            v21 = v184;
            if( v38 )
            {
              v40 = rcx0;
              if( (RtlpHpLfhPerfFlags & 0x20) != 0 )
                _InterlockedExchangeAdd64(
                  (volatile signed __int64 *)(*(__int16 *)(rcx0 + 58) + rcx0 + 24),
                  (v38 << *(_BYTE *)(v12 + 44)) / 4096);
            }
            else
            {
              v40 = rcx0;
            }
            if( v39 == -1 )
            {
              if( (_DWORD)v27 )
              {
                if( *(_BYTE *)(v40 + 57) )
                {
                  ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v12 + 24));
                  __writecr8(v175);
                }
                else
                {
                  if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v12 + 24), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
                    ExfTryToWakePushLock((volatile INT64 *)(v12 + 24));
                  v196 = 0;
                  v93 = (_ETHREAD *)KeGetCurrentThread();
                  v187 = (UINT64)v93;
                  if( (unsigned int)MiGetSystemRegionType(v12 + 24) == 1 )
                    v94 = (unsigned int)MmGetSessionIdEx(*((_QWORD *)v93 + 23));
                  else
                    v94 = 0xFFFFFFFFi64;
                  --*((_WORD *)v93 + 243);
                  v109 = (ULONG_PTR)v93;
                  v177 = ++*((_BYTE *)v93 + 794);
                  v110 = (*((char *)v93 + 792) | *((char *)v93 + 870)) ^ 0x3F;
                  v98 = !_BitScanReverse((unsigned int *)&v111, v110);
                  v195 = v111;
                  if( v98 )
                    goto LABEL_139;
                  while( 1 )
                  {
                    v112 = *(_QWORD *)(v109 + 800) + 96 * v111;
                    v110 &= ~(1 << v111);
                    if( (*(_BYTE *)(v112 + 26) & 1) != 0
                      && (*(_DWORD *)(v112 + 32) & 1) == 0
                      && (*(_QWORD *)(v112 + 32) & 0x7FFFFFFFFFFFFFFCi64) == ((v12 + 24) & 0x7FFFFFFFFFFFFFFCi64)
                      && *(_DWORD *)(v112 + 40) == (_DWORD)v94 )
                    {
                      *(_BYTE *)(v112 + 26) &= ~1u;
                      if( *(_QWORD *)(v112 + 32) )
                        break;
                    }
                    v98 = !_BitScanReverse((unsigned int *)&v111, v110);
                    v195 = v111;
                    if( v98 )
                      goto LABEL_139;
                  }
                  if( !v112 )
                  {
LABEL_139:
                    if( (*(_DWORD *)(v109 + 120) & 0x10000) == 0 )
                      KeBugCheckEx(0x162u, v109, v12 + 24, v94, 0i64);
                  }
                  else
                  {
                    *(_BYTE *)(v112 + 32) |= 2u;
                    if( *(__int64 *)(v112 + 32) < 0 )
                    {
                      KiAbEntryRemoveFromTree(v112);
                      v109 = v187;
                    }
                    v196 = *(_DWORD *)(v112 + 88) & 0x1FFFF;
                    *(_DWORD *)(v112 + 88) &= 0xFFFE0000;
                    *(_BYTE *)(v112 + 25) &= ~1u;
                    *(_QWORD *)(v112 + 32) = 0i64;
                    v113 = 1 << ((__int64)(v112 - *(_QWORD *)(v109 + 800)) / 96);
                    if( v177 == 1 )
                      *(_BYTE *)(v109 + 792) |= v113;
                    else
                      _InterlockedOr8((volatile signed __int8 *)(v109 + 870), v113);
                  }
                  --*(_BYTE *)(v109 + 794);
                  KiAbThreadRemoveBoosts(v109, v12 + 24, (unsigned int *)&v196);
                  v114 = v187;
                  v98 = (*(_WORD *)(v187 + 486))++ == 0xFFFF;
                  if( v98 && *(_QWORD *)(v114 + 152) != v114 + 152 )
                    KiCheckForKernelApcDelivery();
                  KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
                }
              }
              v23 = v178;
            }
            else
            {
              v103 = *(_BYTE *)(v12 + 44);
              v104 = (int(__fastcall *)(__int64, unsigned __int64, _QWORD, __int64))(v40 ^ RtlpHpHeapGlobals ^ *(_QWORD *)(v40 + 24));
              v105 = v189 - v39;
              a7 = v35;
              v106 = v39 << v103;
              a5 = v105 + 1;
              v107 = (v105 + 1) << v103;
              v108 = *(_QWORD *)v40;
              LODWORD(a3) = v106;
              if( v104(v108, v12 + v106, v107, v27) < 0 )
              {
                v149 = v24;
                v42 = rcx0;
                RtlpHpLfhSubsegmentDecBlockCounts(rcx0, v12, v149, v185);
                if( *(_BYTE *)(rcx0 + 57) )
                {
                  ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v12 + 24));
                  __writecr8(v175);
                }
                else
                {
                  if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v12 + 24), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
                    ExfTryToWakePushLock((volatile INT64 *)(v12 + 24));
                  v194 = 0;
                  v150 = (_ETHREAD *)KeGetCurrentThread();
                  if( (unsigned int)MiGetSystemRegionType(v12 + 24) == 1 )
                    v151 = MmGetSessionIdEx(*((_QWORD *)v150 + 23));
                  else
                    v151 = -1;
                  --*((_WORD *)v150 + 243);
                  v152 = ++*((_BYTE *)v150 + 794);
                  v153 = (*((char *)v150 + 792) | *((char *)v150 + 870)) ^ 0x3F;
                  v98 = !_BitScanReverse((unsigned int *)&v154, v153);
                  v193 = v154;
                  if( v98 )
                  {
LABEL_313:
                    if( (*((_DWORD *)v150 + 30) & 0x10000) == 0 )
                      KeBugCheckEx(0x162u, (ULONG_PTR)v150, v12 + 24, v151, 0i64);
                  }
                  else
                  {
                    while( 1 )
                    {
                      v155 = *((_QWORD *)v150 + 100) + 96 * v154;
                      v153 &= ~(1 << v154);
                      if( (*(_BYTE *)(v155 + 26) & 1) != 0
                        && (*(_DWORD *)(v155 + 32) & 1) == 0
                        && (*(_QWORD *)(v155 + 32) & 0x7FFFFFFFFFFFFFFCi64) == ((v12 + 24) & 0x7FFFFFFFFFFFFFFCi64)
                        && *(_DWORD *)(v155 + 40) == v151 )
                      {
                        *(_BYTE *)(v155 + 26) &= ~1u;
                        if( *(_QWORD *)(v155 + 32) )
                          break;
                      }
                      v98 = !_BitScanReverse((unsigned int *)&v154, v153);
                      v193 = v154;
                      if( v98 )
                        goto LABEL_312;
                    }
                    if( !v155 )
                    {
LABEL_312:
                      v42 = rcx0;
                      goto LABEL_313;
                    }
                    *(_BYTE *)(v155 + 32) |= 2u;
                    if( *(__int64 *)(v155 + 32) < 0 )
                      KiAbEntryRemoveFromTree(v155);
                    v194 = *(_DWORD *)(v155 + 88) & 0x1FFFF;
                    *(_DWORD *)(v155 + 88) &= 0xFFFE0000;
                    *(_BYTE *)(v155 + 25) &= ~1u;
                    *(_QWORD *)(v155 + 32) = 0i64;
                    v156 = (unsigned __int128)((__int64)(v155 - *((_QWORD *)v150 + 100))
                                             * (__int128)0x2AAAAAAAAAAAAAABi64) >> 64;
                    v42 = rcx0;
                    v157 = 1 << ((v156 >> 4) + (v156 < 0));
                    if( v152 == 1 )
                      *((_BYTE *)v150 + 792) |= v157;
                    else
                      _InterlockedOr8((volatile signed __int8 *)v150 + 870, v157);
                  }
                  --*((_BYTE *)v150 + 794);
                  KiAbThreadRemoveBoosts((ULONG_PTR)v150, v12 + 24, (unsigned int *)&v194);
                  v98 = (*((_WORD *)v150 + 243))++ == 0xFFFF;
                  if( v98 && *((_ETHREAD **)v150 + 19) != (_ETHREAD *)((char *)v150 + 152) )
                    KiCheckForKernelApcDelivery();
                  KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
                }
                v41 = 0i64;
                if( (_DWORD)v187 != -1 )
                  _InterlockedAnd64(
                    (volatile signed __int64 *)(v12 + 8 * ((unsigned __int64)(unsigned int)(2 * v187) >> 6) + 48),
                    ~(3i64 << ((2 * v187) & 0x3F)));
LABEL_29:
                if( !v41 )
                  RtlpHpLfhSubsegmentFreeBlock(v42, v12, 0i64, arg20);
                if( !v181 )
                  goto LABEL_32;
                v158 = v5 + 16;
                if( v181 == 2 )
                {
                  if( !*(_BYTE *)(v42 + 57) )
                  {
                    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v158, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
                      ExfTryToWakePushLock((volatile INT64 *)v158);
                    v198 = 0;
                    v159 = (_ETHREAD *)KeGetCurrentThread();
                    if( (unsigned int)MiGetSystemRegionType(v158) == 1 )
                      v160 = (unsigned int)MmGetSessionIdEx(*((_QWORD *)v159 + 23));
                    else
                      v160 = 0xFFFFFFFFi64;
                    --*((_WORD *)v159 + 243);
                    v161 = ++*((_BYTE *)v159 + 794);
                    v162 = (*((char *)v159 + 792) | *((char *)v159 + 870)) ^ 0x3F;
                    v98 = !_BitScanReverse((unsigned int *)&v163, v162);
                    v197 = v163;
                    if( v98 )
                      goto LABEL_343;
                    while( 1 )
                    {
                      v164 = *((_QWORD *)v159 + 100) + 96 * v163;
                      v162 &= ~(1 << v163);
                      if( (*(_BYTE *)(v164 + 26) & 1) != 0
                        && (*(_DWORD *)(v164 + 32) & 1) == 0
                        && (*(_QWORD *)(v164 + 32) & 0x7FFFFFFFFFFFFFFCi64) == (v158 & 0x7FFFFFFFFFFFFFFCi64)
                        && *(_DWORD *)(v164 + 40) == (_DWORD)v160 )
                      {
                        *(_BYTE *)(v164 + 26) &= ~1u;
                        if( *(_QWORD *)(v164 + 32) )
                          break;
                      }
                      v98 = !_BitScanReverse((unsigned int *)&v163, v162);
                      v197 = v163;
                      if( v98 )
                        goto LABEL_343;
                    }
                    if( !v164 )
                    {
LABEL_343:
                      if( (*((_DWORD *)v159 + 30) & 0x10000) == 0 )
                        KeBugCheckEx(0x162u, (ULONG_PTR)v159, v158, v160, 0i64);
                    }
                    else
                    {
                      *(_BYTE *)(v164 + 32) |= 2u;
                      if( *(__int64 *)(v164 + 32) < 0 )
                        KiAbEntryRemoveFromTree(v164);
                      v198 = *(_DWORD *)(v164 + 88) & 0x1FFFF;
                      *(_DWORD *)(v164 + 88) &= 0xFFFE0000;
                      *(_BYTE *)(v164 + 25) &= ~1u;
                      *(_QWORD *)(v164 + 32) = 0i64;
                      v165 = (__int64)(v164 - *((_QWORD *)v159 + 100)) / 96;
                      if( v161 == 1 )
                        *((_BYTE *)v159 + 792) |= 1 << v165;
                      else
                        _InterlockedOr8((volatile signed __int8 *)v159 + 870, 1 << v165);
                    }
                    --*((_BYTE *)v159 + 794);
                    KiAbThreadRemoveBoosts((ULONG_PTR)v159, v158, (unsigned int *)&v198);
                    v98 = (*((_WORD *)v159 + 243))++ == 0xFFFF;
                    if( v98 && *((_ETHREAD **)v159 + 19) != (_ETHREAD *)((char *)v159 + 152) )
                      KiCheckForKernelApcDelivery();
                    goto LABEL_341;
                  }
                  ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)v158);
                }
                else
                {
                  if( !*(_BYTE *)(v42 + 57) )
                  {
                    if( _InterlockedCompareExchange64((volatile signed __int64 *)v158, 0i64, 17i64) != 17 )
                      ExfReleasePushLockShared((INT64 *)v158);
                    KeAbPostRelease((PVOID)v158);
LABEL_341:
                    KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
                    goto LABEL_32;
                  }
                  ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)v158);
                }
                __writecr8(v174);
                goto LABEL_32;
              }
              LODWORD(a6) = 1;
              RtlpHpLfhSubsegmentIncBlockCounts(rcx0, v12, (unsigned int)a3, v107, &a5, a6, &a7);
              v23 = v178;
            }
          }
        }
        v41 = v12 + v24;
        if( v214 < v21 )
        {
          v127 = v21 - v214;
          if( v127 == 1 )
            v128 = 0x8000;
          else
            v128 = v127 & 0x3FFF;
          *(_WORD *)((WORD4(RtlpHpHeapGlobals) ^ *(unsigned __int16 *)(v12 + 40) ^ (unsigned __int64)v23) + v41 - 2) = v128;
        }
        v42 = rcx0;
        goto LABEL_29;
      }
      if( !v7 )
      {
        v7 = 1;
        v146 = RtlpHpAcquireLockShared((INT64 *)v8, *(unsigned __int8 *)(v6 + 57));
        v6 = rcx0;
        v174 = v146;
      }
LABEL_39:
      if( *(_QWORD *)(v5 + 8) )
        break;
      if( v7 == 2 )
      {
        if( *(_BYTE *)(v6 + 57) )
        {
          ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)v8);
LABEL_157:
          __writecr8(v174);
          goto LABEL_158;
        }
        if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v8, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
          ExfTryToWakePushLock((volatile INT64 *)v8);
        v191 = 0;
        v117 = (_ETHREAD *)KeGetCurrentThread();
        if( (unsigned int)MiGetSystemRegionType(v5 + 16) == 1 )
          v118 = MmGetSessionIdEx(*((_QWORD *)v117 + 23));
        else
          v118 = -1;
        --*((_WORD *)v117 + 243);
        v131 = ++*((_BYTE *)v117 + 794);
        v132 = (*((char *)v117 + 792) | *((char *)v117 + 870)) ^ 0x3F;
        v98 = !_BitScanReverse((unsigned int *)&v133, v132);
        v206 = v133;
        if( v98 )
          goto LABEL_210;
        while( 1 )
        {
          v134 = *((_QWORD *)v117 + 100) + 96 * v133;
          v132 &= ~(1 << v133);
          if( (*(_BYTE *)(v134 + 26) & 1) != 0
            && (*(_DWORD *)(v134 + 32) & 1) == 0
            && (*(_QWORD *)(v134 + 32) & 0x7FFFFFFFFFFFFFFCi64) == ((v5 + 16) & 0x7FFFFFFFFFFFFFFCi64)
            && *(_DWORD *)(v134 + 40) == v118 )
          {
            *(_BYTE *)(v134 + 26) &= ~1u;
            if( *(_QWORD *)(v134 + 32) )
              break;
          }
          v98 = !_BitScanReverse((unsigned int *)&v133, v132);
          v206 = v133;
          if( v98 )
            goto LABEL_210;
        }
        if( !v134 )
        {
LABEL_210:
          if( (*((_DWORD *)v117 + 30) & 0x10000) == 0 )
            KeBugCheckEx(0x162u, (ULONG_PTR)v117, v5 + 16, v118, 0i64);
        }
        else
        {
          *(_BYTE *)(v134 + 32) |= 2u;
          if( *(__int64 *)(v134 + 32) < 0 )
            KiAbEntryRemoveFromTree(v134);
          v191 = 0;
          v191 = *(_DWORD *)(v134 + 88) & 0x1FFFF;
          *(_DWORD *)(v134 + 88) &= 0xFFFE0000;
          *(_BYTE *)(v134 + 25) &= ~1u;
          *(_QWORD *)(v134 + 32) = 0i64;
          v135 = 1 << ((__int64)(v134 - *((_QWORD *)v117 + 100)) / 96);
          if( v131 == 1 )
            *((_BYTE *)v117 + 792) |= v135;
          else
            _InterlockedOr8((volatile signed __int8 *)v117 + 870, v135);
        }
        --*((_BYTE *)v117 + 794);
        KiAbThreadRemoveBoosts((ULONG_PTR)v117, v5 + 16, (unsigned int *)&v191);
        v98 = (*((_WORD *)v117 + 243))++ == 0xFFFF;
        if( v98 && *((_ETHREAD **)v117 + 19) != (_ETHREAD *)((char *)v117 + 152) )
          KiCheckForKernelApcDelivery();
        KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
        v8 = v5 + 16;
      }
      else
      {
        if( *(_BYTE *)(v6 + 57) )
        {
          ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)v8);
          goto LABEL_157;
        }
        if( _InterlockedCompareExchange64((volatile signed __int64 *)v8, 0i64, 17i64) != 17 )
          ExfReleasePushLockShared((INT64 *)v8);
        KeAbPostRelease((PVOID)v8);
        KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
      }
LABEL_158:
      Subsegment = (INT64)RtlpHpLfhBucketGetSubsegment(a2, *(unsigned __int8 *)(rcx0 + 57));
      if( !Subsegment )
      {
        Subsegment = RtlpHpLfhSubsegmentCreate(rcx0, a2, (unsigned int)arg20);
        if( !Subsegment )
        {
          v41 = 0i64;
          goto LABEL_33;
        }
      }
      v7 = 2;
      v181 = 2;
      v174 = RtlpHpAcquireLockExclusive((INT64 *)v8, *(unsigned __int8 *)(rcx0 + 57));
      v115 = RtlpHpLfhSlotAddSubsegment(v5, Subsegment);
      v6 = rcx0;
      v188 = (INT64)v115;
    }
    v45 = v5 + 24;
    v46 = 1;
    v47 = *(_QWORD *)(v5 + 24);
    if( v9 )
      v46 = 4096;
    if( v47 == v45 )
      goto LABEL_268;
LABEL_43:
    v48 = *(_WORD *)(v47 + 32);
    v186 = 0;
    while( 1 )
    {
      if( v46 < v48 )
      {
        v49 = v46;
      }
      else
      {
        v49 = v48;
        if( v7 == 1 )
        {
          v47 = *(_QWORD *)v47;
          if( v47 == v45 )
          {
            v8 = v5 + 16;
LABEL_268:
            v47 = 0i64;
            goto LABEL_64;
          }
          goto LABEL_43;
        }
      }
      v50 = v48 - v49;
      v48 = _InterlockedCompareExchange16((volatile signed __int16 *)(v47 + 32), v48 - v49, v48);
      v51 = v49;
      v52 = v49 + v50;
      if( v48 == v52 )
        break;
      if( v48 < v52 )
        v186 = 1;
    }
    if( *(_WORD *)(v47 + 32) )
      goto LABEL_62;
    v53 = (__int64 *)v47;
    switch( *(_BYTE *)(v47 + 38) )
    {
      case 0:
        v54 = (_QWORD *)(v5 + 8);
        goto LABEL_50;
      case 1:
        v45 = v5 + 40;
        v54 = 0i64;
LABEL_50:
        v55 = (__int64 **)(v5 + 40);
        if( v45 )
        {
          v56 = *(_QWORD *)v47;
          v57 = *(INT64 **)(v47 + 8);
          if( *(_QWORD *)(*(_QWORD *)v47 + 8i64) == v47 && *v57 == v47 )
          {
            *v57 = v56;
            *(_QWORD *)(v56 + 8) = v57;
            if( v54 )
              --*v54;
            goto LABEL_55;
          }
LABEL_353:
          __fastfail(3u);
        }
LABEL_55:
        *(_BYTE *)(v47 + 38) = 1;
        if( v5 != -40 )
        {
          v58 = *(INT64 **)(v5 + 48);
          if( (__int64 **)*v58 != v55 )
            goto LABEL_353;
          *(_QWORD *)v47 = v55;
          *(_QWORD *)(v47 + 8) = v58;
          v53 = 0i64;
          *v58 = v47;
          *(_QWORD *)(v5 + 48) = v47;
        }
        if( (*(_BYTE *)v5 & 1) == 0 && *(_QWORD *)(v5 + 8) > 8ui64 )
        {
          v53 = *v55;
          v147 = **v55;
          if( (__int64 **)(*v55)[1] != v55 || *(__int64 **)(v147 + 8) != v53 )
            goto LABEL_353;
          *v55 = (__int64 *)v147;
          *(_QWORD *)(v147 + 8) = v55;
          --MEMORY[0];
          *((_BYTE *)v53 + 38) = 2;
        }
        if( v53 && *((_BYTE *)v53 + 38) == 2 )
          v53[2] = 0i64;
        break;
      case 2:
        v45 = 0i64;
        v54 = 0i64;
        goto LABEL_50;
    }
    v6 = rcx0;
LABEL_62:
    v59 = v49 <= 1u;
    v8 = v5 + 16;
    if( !v59 )
      *(_QWORD *)(v5 + 56) = v47 ^ ((unsigned __int16)(v51 - 1) ^ (unsigned __int16)v47) & 0xFFF;
LABEL_64:
    if( v7 == 2 )
    {
      if( *(_BYTE *)(v6 + 57) )
      {
        ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)v8);
        goto LABEL_67;
      }
      if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v8, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((volatile INT64 *)v8);
      v190 = 0;
      v90 = (_ETHREAD *)KeGetCurrentThread();
      v91 = (unsigned int)MiGetSystemRegionType(v8) == 1 ? (unsigned int)MmGetSessionIdEx(*((_QWORD *)v90 + 23)) : 0xFFFFFFFFi64;
      --*((_WORD *)v90 + 243);
      v95 = ++*((_BYTE *)v90 + 794);
      v96 = (*((char *)v90 + 792) | *((char *)v90 + 870)) ^ 0x3F;
      v97 = v8 & 0x7FFFFFFFFFFFFFFCi64;
      v98 = !_BitScanReverse((unsigned int *)&v99, v96);
      v205 = v99;
      if( v98 )
      {
LABEL_115:
        if( (*((_DWORD *)v90 + 30) & 0x10000) == 0 )
          KeBugCheckEx(0x162u, (ULONG_PTR)v90, v8, v91, 0i64);
      }
      else
      {
        while( 1 )
        {
          v100 = *((_QWORD *)v90 + 100) + 96 * v99;
          v96 &= ~(1 << v99);
          if( (*(_BYTE *)(v100 + 26) & 1) != 0
            && (*(_DWORD *)(v100 + 32) & 1) == 0
            && (*(_QWORD *)(v100 + 32) & 0x7FFFFFFFFFFFFFFCi64) == v97
            && *(_DWORD *)(v100 + 40) == (_DWORD)v91 )
          {
            *(_BYTE *)(v100 + 26) &= ~1u;
            if( *(_QWORD *)(v100 + 32) )
              break;
          }
          v98 = !_BitScanReverse((unsigned int *)&v99, v96);
          v205 = v99;
          if( v98 )
            goto LABEL_114;
        }
        if( !v100 )
        {
LABEL_114:
          v8 = v5 + 16;
          goto LABEL_115;
        }
        *(_BYTE *)(v100 + 32) |= 2u;
        if( *(__int64 *)(v100 + 32) < 0 )
          KiAbEntryRemoveFromTree(v100);
        v190 = 0;
        v190 = *(_DWORD *)(v100 + 88) & 0x1FFFF;
        *(_DWORD *)(v100 + 88) &= 0xFFFE0000;
        *(_BYTE *)(v100 + 25) &= ~1u;
        *(_QWORD *)(v100 + 32) = 0i64;
        v101 = (unsigned __int128)((__int64)(v100 - *((_QWORD *)v90 + 100)) * (__int128)0x2AAAAAAAAAAAAAABi64) >> 64;
        v8 = v5 + 16;
        v102 = 1 << ((v101 >> 4) + (v101 < 0));
        if( v95 == 1 )
          *((_BYTE *)v90 + 792) |= v102;
        else
          _InterlockedOr8((volatile signed __int8 *)v90 + 870, v102);
      }
      --*((_BYTE *)v90 + 794);
      KiAbThreadRemoveBoosts((ULONG_PTR)v90, v8, (unsigned int *)&v190);
      v98 = (*((_WORD *)v90 + 243))++ == 0xFFFF;
      if( v98 && *((_ETHREAD **)v90 + 19) != (_ETHREAD *)((char *)v90 + 152) )
        KiCheckForKernelApcDelivery();
      KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
    }
    else if( *(_BYTE *)(v6 + 57) )
    {
      ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)v8);
LABEL_67:
      __writecr8(v174);
    }
    else
    {
      if( _InterlockedCompareExchange64((volatile signed __int64 *)v8, 0i64, 17i64) != 17 )
        ExfReleasePushLockShared((INT64 *)v8);
      KeAbPostRelease((PVOID)v8);
      KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
    }
    if( v47 )
      break;
    v7 = 2;
    v181 = 2;
    v148 = RtlpHpAcquireLockExclusive((INT64 *)v8, *(unsigned __int8 *)(rcx0 + 57));
    v6 = rcx0;
    v174 = v148;
  }
  v60 = 3i64;
  v61 = 2 * (*(unsigned __int16 *)(v47 + 34) + (unsigned __int64)*(unsigned __int8 *)(v47 + 39));
  v210[1] = v47 + 48;
  v62 = *(unsigned __int8 *)(v5 + 1);
  v210[0] = v61;
  v185 = (unsigned int)v47 >> 12;
  LODWORD(v187) = *((unsigned __int8 *)RtlpSearchWidth + v62);
  v63 = (unsigned __int16)(WORD4(RtlpHpHeapGlobals) ^ ((unsigned int)v47 >> 12) ^ *(_WORD *)(v47 + 40));
  v64 = (DWORD2(RtlpHpHeapGlobals) ^ ((unsigned int)v47 >> 12) ^ *(_DWORD *)(v47 + 40)) >> 16;
  v65 = v64;
  v66 = v64;
  v204 = v63;
  if( v214 >= v63 )
    v60 = 1i64;
  if( (*(_BYTE *)(rcx0 + 62) & 2) != 0 )
  {
    v66 = v64;
    v68 = 0i64;
    if( v214 >= v63 )
      v66 = v64;
  }
  else
  {
    v67 = RtlpLfhIncrementDataSlot();
    if( v214 >= v63 )
      v66 = v65;
    v68 = *((unsigned __int8 *)RtlpLowFragHeapRandomData + v67);
  }
  v69 = RtlpLfhBlockBitmapAllocate(v210, *(unsigned __int16 *)(v47 + 36), v68, (unsigned int)v187, v60);
  v184 = v69;
  *(_WORD *)(v47 + 36) = v69;
  v70 = v66 + v69 * v63;
  if( *(_BYTE *)(v47 + 45) <= 1u )
    goto LABEL_87;
  v71 = *(_BYTE *)(v47 + 44);
  v72 = 0i64;
  v73 = v47 + *(unsigned __int16 *)(v47 + 46);
  v74 = v70 >> v71;
  v185 = WORD4(RtlpHpHeapGlobals) ^ (unsigned __int16)v185 ^ *(unsigned __int16 *)(v47 + 40);
  v199 = 0;
  v180 = -1;
  v75 = ((v70 + v185 - 1) >> v71) - (unsigned int)v74 + 1;
  v176 = -1;
  v76 = 2 * v74;
  v77 = (signed __int16 *)(2 * v74 + v73);
  _m_prefetchw(v77);
  v183 = 0i64;
  v78 = &v77[v75];
  v181 = 0;
  v178 = -1;
  if( v77 >= v78 )
    goto LABEL_87;
  v79 = (unsigned __int64)v78;
  do
  {
    while( 1 )
    {
      v80 = *v77;
      while( v80 > 0 )
      {
        v81 = v80;
        v80 = _InterlockedCompareExchange16(v77, v80 + 1, v80);
        if( v81 == v80 )
        {
          v82 = v181;
          v83 = v178;
          LODWORD(v84) = v183;
          goto LABEL_82;
        }
      }
      if( (_DWORD)v72 )
        break;
      LODWORD(v187) = 1;
      v116 = RtlpHpAcquireLockExclusive((INT64 *)(v47 + 24), *(unsigned __int8 *)(rcx0 + 57));
      v72 = 1i64;
      v176 = v116;
    }
    v83 = v178;
    if( v80 )
    {
      v82 = v181 + 1;
      v84 = v76 >> 1;
      ++v181;
      v183 = v76 >> 1;
      if( v178 == -1 )
      {
        v83 = v76 >> 1;
        v178 = v83;
      }
    }
    else
    {
      LODWORD(v84) = v183;
      v82 = --v181;
    }
    *v77 = v80 + 1;
LABEL_82:
    ++v77;
    v76 += 2i64;
  }
  while( (unsigned __int64)v77 < v79 );
  v63 = v204;
  v85 = v184;
  if( v82 )
  {
    v86 = rcx0;
    if( (RtlpHpLfhPerfFlags & 0x20) != 0 )
      _InterlockedExchangeAdd64(
        (volatile signed __int64 *)(*(__int16 *)(rcx0 + 58) + rcx0 + 24),
        (v82 << *(_BYTE *)(v47 + 44)) / 4096);
  }
  else
  {
    v86 = rcx0;
  }
  if( v83 == -1 )
  {
    if( (_DWORD)v72 )
    {
      if( *(_BYTE *)(v86 + 57) )
      {
        ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v47 + 24));
        __writecr8(v176);
      }
      else
      {
        if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v47 + 24), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
          ExfTryToWakePushLock((volatile INT64 *)(v47 + 24));
        v203 = 0;
        v129 = (_ETHREAD *)KeGetCurrentThread();
        if( (unsigned int)MiGetSystemRegionType(v47 + 24) == 1 )
          v130 = (unsigned int)MmGetSessionIdEx(*((_QWORD *)v129 + 23));
        else
          v130 = 0xFFFFFFFFi64;
        --*((_WORD *)v129 + 243);
        v141 = ++*((_BYTE *)v129 + 794);
        v142 = (*((char *)v129 + 792) | *((char *)v129 + 870)) ^ 0x3F;
        v98 = !_BitScanReverse((unsigned int *)&v143, v142);
        v202 = v143;
        if( v98 )
          goto LABEL_242;
        while( 1 )
        {
          v144 = *((_QWORD *)v129 + 100) + 96 * v143;
          v142 &= ~(1 << v143);
          if( (*(_BYTE *)(v144 + 26) & 1) != 0
            && (*(_DWORD *)(v144 + 32) & 1) == 0
            && (*(_QWORD *)(v144 + 32) & 0x7FFFFFFFFFFFFFFCi64) == ((v47 + 24) & 0x7FFFFFFFFFFFFFFCi64)
            && *(_DWORD *)(v144 + 40) == (_DWORD)v130 )
          {
            *(_BYTE *)(v144 + 26) &= ~1u;
            if( *(_QWORD *)(v144 + 32) )
              break;
          }
          v98 = !_BitScanReverse((unsigned int *)&v143, v142);
          v202 = v143;
          if( v98 )
            goto LABEL_242;
        }
        if( !v144 )
        {
LABEL_242:
          if( (*((_DWORD *)v129 + 30) & 0x10000) == 0 )
            KeBugCheckEx(0x162u, (ULONG_PTR)v129, v47 + 24, v130, 0i64);
        }
        else
        {
          *(_BYTE *)(v144 + 32) |= 2u;
          if( *(__int64 *)(v144 + 32) < 0 )
            KiAbEntryRemoveFromTree(v144);
          v203 = *(_DWORD *)(v144 + 88) & 0x1FFFF;
          *(_DWORD *)(v144 + 88) &= 0xFFFE0000;
          *(_BYTE *)(v144 + 25) &= ~1u;
          *(_QWORD *)(v144 + 32) = 0i64;
          v145 = 1 << ((__int64)(v144 - *((_QWORD *)v129 + 100)) / 96);
          if( v141 == 1 )
            *((_BYTE *)v129 + 792) |= v145;
          else
            _InterlockedOr8((volatile signed __int8 *)v129 + 870, v145);
        }
        --*((_BYTE *)v129 + 794);
        KiAbThreadRemoveBoosts((ULONG_PTR)v129, v47 + 24, (unsigned int *)&v203);
        v98 = (*((_WORD *)v129 + 243))++ == 0xFFFF;
        if( v98 && *((_ETHREAD **)v129 + 19) != (_ETHREAD *)((char *)v129 + 152) )
          KiCheckForKernelApcDelivery();
        KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
      }
    }
LABEL_87:
    v41 = v47 + v70;
    if( v214 < v63 )
      RtlpHpLfhSubsegmentSetUnusedBytes(v47, v47 + v70, v63 - v214);
    v87 = rcx0;
  }
  else
  {
    v121 = v84 - v83;
    v122 = *(_BYTE *)(v47 + 44);
    v123 = (int(__fastcall *)(__int64, INT64, _QWORD, __int64))(v86 ^ RtlpHpHeapGlobals ^ *(_QWORD *)(v86 + 24));
    v124 = v83 << v122;
    v199 = v121 + 1;
    v125 = (v121 + 1) << v122;
    v126 = *(_QWORD *)v86;
    v180 = v176;
    v178 = v124;
    if( v123(v126, v47 + v124, v125, v72) >= 0 )
    {
      LODWORD(a6) = 1;
      RtlpHpLfhSubsegmentIncBlockCounts(rcx0, v47, v178, v125, &v199, a6, &v180);
      goto LABEL_87;
    }
    v87 = rcx0;
    RtlpHpLfhSubsegmentDecBlockCounts(rcx0, v47, v70, v185);
    if( *(_BYTE *)(rcx0 + 57) )
    {
      ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v47 + 24));
      __writecr8(v176);
      v41 = 0i64;
    }
    else
    {
      if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v47 + 24), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((volatile INT64 *)(v47 + 24));
      v41 = 0i64;
      v201 = 0;
      v166 = (_ETHREAD *)KeGetCurrentThread();
      if( (unsigned int)MiGetSystemRegionType(v47 + 24) == 1 )
        v167 = MmGetSessionIdEx(*((_QWORD *)v166 + 23));
      else
        v167 = -1;
      --*((_WORD *)v166 + 243);
      v168 = ++*((_BYTE *)v166 + 794);
      v169 = (*((char *)v166 + 792) | *((char *)v166 + 870)) ^ 0x3F;
      v98 = !_BitScanReverse((unsigned int *)&v170, v169);
      v200 = v170;
      if( v98 )
      {
LABEL_378:
        if( (*((_DWORD *)v166 + 30) & 0x10000) == 0 )
          KeBugCheckEx(0x162u, (ULONG_PTR)v166, v47 + 24, v167, 0i64);
      }
      else
      {
        while( 1 )
        {
          v171 = *((_QWORD *)v166 + 100) + 96 * v170;
          v169 &= ~(1 << v170);
          if( (*(_BYTE *)(v171 + 26) & 1) != 0
            && (*(_DWORD *)(v171 + 32) & 1) == 0
            && (*(_QWORD *)(v171 + 32) & 0x7FFFFFFFFFFFFFFCi64) == ((v47 + 24) & 0x7FFFFFFFFFFFFFFCi64)
            && *(_DWORD *)(v171 + 40) == v167 )
          {
            *(_BYTE *)(v171 + 26) &= ~1u;
            if( *(_QWORD *)(v171 + 32) )
              break;
          }
          v98 = !_BitScanReverse((unsigned int *)&v170, v169);
          v200 = v170;
          if( v98 )
            goto LABEL_377;
        }
        if( !v171 )
        {
LABEL_377:
          v41 = 0i64;
          goto LABEL_378;
        }
        *(_BYTE *)(v171 + 32) |= 2u;
        if( *(__int64 *)(v171 + 32) < 0 )
          KiAbEntryRemoveFromTree(v171);
        v201 = *(_DWORD *)(v171 + 88) & 0x1FFFF;
        *(_DWORD *)(v171 + 88) &= 0xFFFE0000;
        *(_BYTE *)(v171 + 25) &= ~1u;
        *(_QWORD *)(v171 + 32) = 0i64;
        v172 = 1 << ((char)(v171 - *((_BYTE *)v166 + 800)) / 96);
        if( v168 == 1 )
          *((_BYTE *)v166 + 792) |= v172;
        else
          _InterlockedOr8((volatile signed __int8 *)v166 + 870, v172);
        v41 = 0i64;
      }
      --*((_BYTE *)v166 + 794);
      KiAbThreadRemoveBoosts((ULONG_PTR)v166, v47 + 24, (unsigned int *)&v201);
      v98 = (*((_WORD *)v166 + 243))++ == 0xFFFF;
      if( v98 && *((_ETHREAD **)v166 + 19) != (_ETHREAD *)((char *)v166 + 152) )
        KiCheckForKernelApcDelivery();
      KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
      v87 = rcx0;
    }
    if( v85 != -1 )
      _InterlockedAnd64(
        (volatile signed __int64 *)(v47 + 8 * ((unsigned __int64)(2 * v85) >> 6) + 48),
        ~(3i64 << ((2 * v85) & 0x3F)));
  }
  if( !v41 )
    RtlpHpLfhSubsegmentFreeBlock(v87, v47, 0i64, arg20);
LABEL_32:
  Subsegment = v188;
LABEL_33:
  if( v186 )
    RtlpHpLfhBucketUpdateAffinityMapping(rcx0, a2);
  if( Subsegment )
    RtlpHpLfhBucketAddSubsegment(rcx0, a2, Subsegment, arg20);
  return v41;
}

Referenced by:

ExAllocateHeapPool
RtlpHpLfhBucketAllocate