MiObtainDynamicVa

UINT64 __fastcall MiObtainDynamicVa(INT64 *a1, UINT64 a2, UINT64 r8_0){
  unsigned int v3; 
  unsigned int v4; 
  INT64 *v5; 
  INT64 v6; 
  unsigned __int64 v7; 
  __int128 *v8; 
  unsigned __int64 v9; 
  unsigned __int64 v10; 
  __int64 v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  unsigned __int64 *v15; 
  __int64 v16; 
  unsigned __int64 v17; 
  unsigned __int64 v18; 
  unsigned __int64 NextAlignedForwardRunClear; 
  unsigned __int64 v20; 
  unsigned __int64 v21; 
  __int64 v22; 
  unsigned __int64 v23; 
  unsigned __int64 v24; 
  unsigned __int64 v25; 
  unsigned __int64 *v26; 
  __int64 v27; 
  unsigned __int64 v28; 
  unsigned __int64 v29; 
  unsigned __int64 v30; 
  unsigned __int64 v31; 
  int v32; 
  __int64 v34; 
  __int64 v35; 
  __int64 v36; 
  __int64 v37; 
  unsigned __int64 *v38; 
  bool v39; 
  __int64 v40; 
  unsigned int v41; 
  unsigned __int64 v42; 
  unsigned __int64 v43; 
  __int64 v44; 
  __int64 v45; 
  unsigned __int64 *v46; 
  __int64 v47; 
  unsigned int v48; 
  unsigned __int64 v49; 
  unsigned __int64 v50; 
  __int64 v51; 
  __int64 v52; 
  __int64 v53; 
  unsigned __int64 v54; 
  __int64 v55; 
  unsigned int v56; 
  unsigned __int64 v57; 
  __int64 v58; 
  unsigned int v59; 
  unsigned int v60; 
  __int64 v61; 
  __int64 v62; 
  unsigned __int64 *v63; 
  __int64 v64; 
  unsigned __int64 *v65; 
  unsigned int v66; 
  __int64 v67; 
  bool v68; 
  __int64 v69; 
  unsigned int v70; 
  unsigned __int64 v71; 
  unsigned __int64 v72; 
  bool v73; 
  __int64 v74; 
  unsigned int v75; 
  unsigned __int64 v76; 
  unsigned __int64 v77; 
  unsigned __int64 v78; 
  unsigned __int64 v79; 
  UINT32 v80; 
  unsigned __int64 v81; 
  unsigned __int64 v82; 
  __int128 *v83; 
  INT64 a3; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  __int128 v86[5]; 
  unsigned int v88; 
  unsigned int LogFileName; 
  LogFileName = r8_0;
  v88 = a2;
  v3 = r8_0;
  v4 = a2;
  v5 = a1;
  memset(&LockHandle, 0, sizeof(LockHandle));
  v6 = 1i64;
  a3 = 1i64;
  v86[0] = 0i64;
  while( 1 )
  {
    v7 = v5[3];
    v83 = (__int128 *)v5;
    v8 = (__int128 *)v5;
    if( v3 == 13 )
    {
      v8 = v86;
      v83 = v86;
      v34 = v5[1] + 8 * ((unsigned __int64)v5[2] >> 6);
      v7 = v5[6];
      v35 = -(__int64)((unsigned __int64)v5[5] >> 6);
      *(_QWORD *)&v86[0] = v5[5];
      *((_QWORD *)&v86[0] + 1) = v34 + 8 * v35;
      if( v4 >= 0x200 )
      {
        if( (MiFlags & 0x20000000) != 0 )
          v6 = 512i64;
        a3 = v6;
      }
    }
    if( !*(_QWORD *)v8 )
      goto LABEL_85;
    v9 = v4;
    if( v6 == 1 )
    {
      v10 = *(_QWORD *)v8;
      v11 = *((_QWORD *)v8 + 1);
      v12 = v7 & -(__int64)(v7 < *(_QWORD *)v8);
      v13 = *(_QWORD *)v8 - 1i64;
      v81 = v12;
      if( v4 )
      {
        while( 1 )
        {
          if( v13 - v12 + 1 < v9 )
            goto LABEL_66;
          v14 = v13 - v9 + 1;
          v15 = (unsigned __int64 *)(v11 + 8 * (v12 >> 6));
          v16 = ((1i64 << (v12 & 0x3F)) - 1) | *v15;
          v17 = v11 + 8 * (v14 >> 6);
          if( v9 > 0x7F )
          {
            v54 = v17 + 8;
            if( (v14 & 0x3F) == 0 )
              v54 = v11 + 8 * (v14 >> 6);
            if( v16 )
            {
              if( *++v15 )
                goto LABEL_103;
              v39 = !_BitScanReverse64((unsigned __int64 *)&v55, v16);
              if( v39 )
                v56 = 64;
              else
                v56 = 63 - v55;
            }
            else
            {
              v56 = 0;
            }
LABEL_107:
            NextAlignedForwardRunClear = (((__int64)v15 - v11) >> 3 << 6) - v56;
            if( NextAlignedForwardRunClear > v14 )
              goto LABEL_66;
            v63 = &v15[(v9 - v56) >> 6];
            while( ++v15 != v63 )
            {
              if( *v15 )
                goto LABEL_103;
            }
            v60 = ((_BYTE)v4 - (_BYTE)v56) & 0x3F;
            if( (((_BYTE)v4 - (_BYTE)v56) & 0x3F) != 0 )
            {
              v39 = !_BitScanForward64((unsigned __int64 *)&v61, *v15);
              if( v39 )
                LODWORD(v61) = 64;
              if( (unsigned int)v61 < v60 )
              {
LABEL_103:
                while( (unsigned __int64)v15 <= v54 )
                {
                  if( !*++v15 )
                  {
                    v39 = !_BitScanReverse64((unsigned __int64 *)&v62, *(v15 - 1));
                    if( v39 )
                      v56 = 64;
                    else
                      v56 = 63 - v62;
                    goto LABEL_107;
                  }
                }
                goto LABEL_66;
              }
            }
          }
          else if( v9 >= 0x40 )
          {
            do
            {
LABEL_132:
              v68 = v16 < 0;
              do
              {
                if( v68 )
                {
                  if( (unsigned __int64)++v15 > v17 )
                    goto LABEL_66;
                  v16 = *v15;
                  goto LABEL_132;
                }
                v39 = !_BitScanReverse64((unsigned __int64 *)&v69, v16);
                if( v39 )
                  v70 = 64;
                else
                  v70 = 63 - v69;
                NextAlignedForwardRunClear = (((((__int64)v15 - v11) >> 3) + 1) << 6) - v70;
                if( NextAlignedForwardRunClear > v14 )
                  goto LABEL_66;
                v71 = v9 - v70;
                if( v9 == v70 )
                  goto LABEL_15;
                v16 = *++v15;
                if( v71 < 0x40 )
                  goto LABEL_141;
                v68 = v16 < 0;
              }
              while( v16 );
              v71 -= 64i64;
              if( !v71 )
                break;
              v16 = *++v15;
LABEL_141:
              v39 = !_BitScanForward64(&v72, v16);
              if( v39 )
                v72 = 64i64;
            }
            while( v72 < v71 );
          }
          else
          {
            if( v9 > 1 )
            {
              v37 = 0i64;
              v38 = (unsigned __int64 *)(v11 + 8 * (v13 >> 6));
              while( v16 != -1 )
              {
LABEL_48:
                v39 = !_BitScanForward64((unsigned __int64 *)&v40, v16);
                if( v39 )
                  LODWORD(v40) = 64;
                if( (unsigned int)(v37 + v40) >= v9 )
                {
                  v44 = -v37;
LABEL_55:
                  NextAlignedForwardRunClear = (((__int64)v15 - v11) >> 3 << 6) + v44;
                  goto LABEL_14;
                }
                v41 = v88;
                v42 = ~v16;
                while( 1 )
                {
                  v42 &= v42 >> (v41 >> 1);
                  if( !v42 )
                    break;
                  v41 -= v41 >> 1;
                  if( v41 <= 1 )
                  {
                    _BitScanForward64(&v43, v42);
                    v44 = (unsigned int)v43;
                    goto LABEL_55;
                  }
                }
                if( v15 == v38 )
                  goto LABEL_66;
                v39 = !_BitScanReverse64((unsigned __int64 *)&v52, v16);
                if( v39 )
                  v37 = 64i64;
                else
                  v37 = (unsigned int)(63 - v52);
                v16 = *++v15;
              }
              while( (unsigned __int64)++v15 <= v17 )
              {
                v16 = *v15;
                if( *v15 != -1i64 )
                {
                  v37 = 0i64;
                  goto LABEL_48;
                }
              }
LABEL_66:
              NextAlignedForwardRunClear = -1i64;
              goto LABEL_169;
            }
            while( v16 == -1 )
            {
              if( (unsigned __int64)++v15 > v17 )
                goto LABEL_66;
              v16 = *v15;
            }
            _BitScanForward64(&v18, ~v16);
            NextAlignedForwardRunClear = v18 + (((__int64)v15 - v11) >> 3 << 6);
LABEL_14:
            if( NextAlignedForwardRunClear > v14 )
              goto LABEL_66;
          }
LABEL_15:
          if( NextAlignedForwardRunClear != -1i64 )
            goto LABEL_16;
LABEL_169:
          if( !v81 )
          {
LABEL_16:
            v8 = v83;
            v6 = a3;
            goto LABEL_17;
          }
          LOBYTE(v4) = v88;
          v78 = v9 + v7;
          if( v9 + v7 > v10 )
            v78 = v10;
          v13 = v78 - 1;
          v12 = 0i64;
          v81 = 0i64;
        }
      }
      NextAlignedForwardRunClear = v12 & 0xFFFFFFFFFFFFFFF8ui64;
LABEL_17:
      v5 = a1;
      v3 = LogFileName;
      v82 = NextAlignedForwardRunClear;
    }
    else
    {
      NextAlignedForwardRunClear = MiFindNextAlignedForwardRunClearEx(v8, v4, v6);
      v82 = NextAlignedForwardRunClear;
    }
    if( NextAlignedForwardRunClear == -1i64 )
    {
LABEL_85:
      if( !MiExtendDynamicBitMap((PHANDLE)v5, (ACCESS_MASK)v8, 0i64, (PUNICODE_STRING)v3, 0, v80) )
        return 0i64;
      goto LABEL_86;
    }
    KeAcquireInStackQueuedSpinLock((UINT64 *)v5 + 8, &LockHandle);
    if( v6 == 1 )
    {
      v20 = *(_QWORD *)v8;
      v21 = v82;
      v22 = *((_QWORD *)v8 + 1);
      v23 = *(_QWORD *)v8 - 1i64;
      v24 = v82 & -(__int64)(v82 < *(_QWORD *)v8);
      if( v9 )
      {
        while( v23 - v24 + 1 < v9 )
        {
          v30 = -1i64;
LABEL_175:
          if( !v24 )
          {
LABEL_31:
            v5 = a1;
            v31 = v30;
            v8 = v83;
            goto LABEL_32;
          }
          v79 = v9 + v21;
          if( v9 + v21 > v20 )
            v79 = v20;
          v23 = v79 - 1;
          v24 = 0i64;
        }
        v25 = v23 - v9 + 1;
        v26 = (unsigned __int64 *)(v22 + 8 * (v24 >> 6));
        v27 = ((1i64 << (v24 & 0x3F)) - 1) | *v26;
        v28 = v22 + 8 * (v25 >> 6);
        if( v9 > 0x7F )
        {
          v57 = v28 + 8;
          if( (v25 & 0x3F) == 0 )
            v57 = v22 + 8 * (v25 >> 6);
          if( v27 )
          {
            if( *++v26 )
              goto LABEL_112;
            v39 = !_BitScanReverse64((unsigned __int64 *)&v58, v27);
            if( v39 )
              v59 = 64;
            else
              v59 = 63 - v58;
          }
          else
          {
            v59 = 0;
          }
LABEL_117:
          v30 = (((__int64)v26 - v22) >> 3 << 6) - v59;
          if( v30 > v25 )
            goto LABEL_67;
          v65 = &v26[(v9 - v59) >> 6];
          while( ++v26 != v65 )
          {
            if( *v26 )
              goto LABEL_112;
          }
          v66 = ((_BYTE)v88 - (_BYTE)v59) & 0x3F;
          if( (((_BYTE)v88 - (_BYTE)v59) & 0x3F) != 0 )
          {
            v39 = !_BitScanForward64((unsigned __int64 *)&v67, *v26);
            if( v39 )
              LODWORD(v67) = 64;
            if( (unsigned int)v67 < v66 )
            {
LABEL_112:
              while( (unsigned __int64)v26 <= v57 )
              {
                if( !*++v26 )
                {
                  v39 = !_BitScanReverse64((unsigned __int64 *)&v64, *(v26 - 1));
                  if( v39 )
                    v59 = 64;
                  else
                    v59 = 63 - v64;
                  goto LABEL_117;
                }
              }
              goto LABEL_67;
            }
          }
        }
        else
        {
          if( v9 < 0x40 )
          {
            if( v9 > 1 )
            {
              v45 = 0i64;
              v46 = (unsigned __int64 *)(v22 + 8 * (v23 >> 6));
              while( v27 != -1 )
              {
LABEL_58:
                v39 = !_BitScanForward64((unsigned __int64 *)&v47, v27);
                if( v39 )
                  LODWORD(v47) = 64;
                if( (unsigned int)(v45 + v47) >= v9 )
                {
                  v51 = -v45;
LABEL_65:
                  v30 = (((__int64)v26 - v22) >> 3 << 6) + v51;
                  goto LABEL_29;
                }
                v48 = v88;
                v49 = ~v27;
                while( 1 )
                {
                  v49 &= v49 >> (v48 >> 1);
                  if( !v49 )
                    break;
                  v48 -= v48 >> 1;
                  if( v48 <= 1 )
                  {
                    _BitScanForward64(&v50, v49);
                    v51 = (unsigned int)v50;
                    goto LABEL_65;
                  }
                }
                if( v26 == v46 )
                  goto LABEL_67;
                v39 = !_BitScanReverse64((unsigned __int64 *)&v53, v27);
                if( v39 )
                  v45 = 64i64;
                else
                  v45 = (unsigned int)(63 - v53);
                v27 = *++v26;
              }
              while( (unsigned __int64)++v26 <= v28 )
              {
                v27 = *v26;
                if( *v26 != -1i64 )
                {
                  v45 = 0i64;
                  goto LABEL_58;
                }
              }
            }
            else
            {
              while( v27 == -1 )
              {
                if( (unsigned __int64)++v26 > v28 )
                  goto LABEL_67;
                v27 = *v26;
              }
              _BitScanForward64(&v29, ~v27);
              v30 = v29 + (((__int64)v26 - v22) >> 3 << 6);
LABEL_29:
              if( v30 <= v25 )
                goto LABEL_30;
            }
LABEL_67:
            v30 = -1i64;
LABEL_68:
            v21 = v82;
            goto LABEL_175;
          }
          do
          {
LABEL_148:
            v73 = v27 < 0;
            do
            {
              if( v73 )
              {
                if( (unsigned __int64)++v26 > v28 )
                  goto LABEL_67;
                v27 = *v26;
                goto LABEL_148;
              }
              v39 = !_BitScanReverse64((unsigned __int64 *)&v74, v27);
              if( v39 )
                v75 = 64;
              else
                v75 = 63 - v74;
              v30 = (((((__int64)v26 - v22) >> 3) + 1) << 6) - v75;
              if( v30 > v25 )
                goto LABEL_67;
              v76 = v9 - v75;
              if( v9 == v75 )
                goto LABEL_30;
              v27 = *++v26;
              if( v76 < 0x40 )
                goto LABEL_157;
              v73 = v27 < 0;
            }
            while( v27 );
            v76 -= 64i64;
            if( !v76 )
              break;
            v27 = *++v26;
LABEL_157:
            v39 = !_BitScanForward64(&v77, v27);
            if( v39 )
              v77 = 64i64;
          }
          while( v77 < v76 );
        }
LABEL_30:
        if( v30 != -1i64 )
          goto LABEL_31;
        goto LABEL_68;
      }
      v31 = v24 & 0xFFFFFFFFFFFFFFF8ui64;
    }
    else
    {
      v31 = MiFindNextAlignedForwardRunClearEx(v8, v9, v6);
    }
LABEL_32:
    if( v31 != -1i64 )
      break;
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
    v3 = LogFileName;
    if( !MiExtendDynamicBitMap((PHANDLE)v5, (ACCESS_MASK)v8, 0i64, (PUNICODE_STRING)LogFileName, 0, v80) )
      return 0i64;
    v6 = a3;
LABEL_86:
    v4 = v88;
  }
  RtlSetBitsEx((INT64)v8, v31, v9);
  v32 = LogFileName;
  if( LogFileName == 13 )
  {
    v36 = 8 * (*((_QWORD *)v8 + 1) - v5[1]);
    if( v88 == 1 )
      v5[6] = v31 + 1;
    v31 += v36;
    v32 = 9;
  }
  else if( v88 == 1 )
  {
    v5[3] = v31 + 1;
  }
  if( v5 == &qword_140C4DEF8 )
  {
    qword_140C4DD88 -= v9 << 21;
    MiReclaimSystemVa(0i64);
  }
  _InterlockedExchangeAdd64(&qword_140C4F688[v32], v9);
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
  return v5[4] + (v31 << 21);
}

Referenced by:

MiObtainSystemVa
MiReservePoolMemory