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