MiAddPartitionHugeRange
INT64 __fastcall MiAddPartitionHugeRange(_QWORD *a1, INT64 a2, INT64 a3){
_ETHREAD *CurrentThread;
int v6;
unsigned __int64 v7;
unsigned int v8;
unsigned __int64 v9;
__int64 v10;
unsigned __int64 v11;
unsigned __int64 v12;
__int64 v13;
unsigned __int64 v14;
unsigned __int64 v15;
__int64 *v17;
__int64 v18;
unsigned __int64 v19;
bool v20;
bool i;
unsigned __int64 *v22;
KLOCK_QUEUE_HANDLE v23;
struct _KLOCK_QUEUE_HANDLE LockHandle;
memset(&LockHandle, 0, sizeof(LockHandle));
memset(&v23, 0, sizeof(v23));
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v6 = a3;
MiLockDynamicMemoryShared((INT64)&MiSystemPartition, (INT64)CurrentThread);
v7 = 0i64;
v8 = 0;
if( *(_DWORD *)MmPhysicalMemoryBlock )
{
v9 = *(_QWORD *)(a2 + 24);
do
{
v10 = *(_QWORD *)&MmPhysicalMemoryBlock[16 * v8 + 24];
v11 = *(_QWORD *)&MmPhysicalMemoryBlock[16 * v8 + 16];
if( v10 )
{
if( v9 >= v11 )
{
if( v9 < v10 + v11 )
break;
}
else if( v9 + *(_QWORD *)(a2 + 32) > v11 )
{
break;
}
}
++v8;
}
while( v8 < *(_DWORD *)MmPhysicalMemoryBlock );
}
MiUnlockDynamicMemoryShared((INT64)&MiSystemPartition, (INT64)CurrentThread);
v12 = (*(_QWORD *)(a2 + 24) >> 18) & 0x3FFFFi64;
v13 = *(_QWORD *)(a2 + 32) >> 18;
v14 = 0x80200000C0000i64;
KeAcquireInStackQueuedSpinLock(&qword_140C4E3C0, &LockHandle);
KeAcquireInStackQueuedSpinLock(a1 + 516, &v23);
v15 = v13 & 0x3FFFF;
if( v12 >= qword_140C4E3A0 )
goto LABEL_13;
if( v15 > 1 )
{
if( qword_140C4E3A0 - v12 < v15 )
goto LABEL_13;
v17 = (__int64 *)(qword_140C4E3A8 + 8 * (v12 >> 6));
v18 = *v17;
v19 = qword_140C4E3A8 + 8 * ((v12 + v15 - 1) >> 6);
if( v17 != (__int64 *)v19 )
{
for( i = (v18 & (-1i64 << v12)) == 0; i; i = *v17 == 0 )
{
if( ++v17 == (__int64 *)v19 )
{
v20 = ((0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)v12 + (unsigned __int8)v15 - 1)) & *v17) == 0;
goto LABEL_22;
}
}
goto LABEL_13;
}
v20 = (v18 & (0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v15) << v12)) == 0;
LABEL_22:
if( !v20 )
{
LABEL_13:
KeReleaseInStackQueuedSpinLock(&v23);
KeReleaseInStackQueuedSpinLock(&LockHandle);
return 3221225496i64;
}
}
else if( v15 != 1 || _bittest64((const signed __int64 *)qword_140C4E3A8, v12) )
{
goto LABEL_13;
}
RtlSetBitsEx((INT64)&qword_140C4E3A0, v12, v15);
memset64((void *)(qword_140C4E3B0 + 8 * v12), 0x80200000C0000ui64, v15);
KeReleaseInStackQueuedSpinLock(&v23);
KeReleaseInStackQueuedSpinLock(&LockHandle);
if( v6 == 3 )
v14 = ((unsigned __int64)(*(_WORD *)a1 & 0x7FF) << 41) | 0xC0000;
v22 = (unsigned __int64 *)(qword_140C4E3B0 + 8 * v12);
if( v6 == 3 )
KeAcquireInStackQueuedSpinLock(a1 + 516, &v23);
do
{
if( v6 == 3 )
{
*v22 = v14;
++a1[53];
}
else
{
MiInsertHugeRangeInList(v12, v6 == 1, a1);
}
++v22;
++v7;
v12 ^= ((unsigned int)v12 ^ ((_DWORD)v12 + 1)) & 0x3FFFF;
}
while( v7 < v15 );
if( v6 == 3 )
KeReleaseInStackQueuedSpinLock(&v23);
return 0i64;
}Referenced by:
MiHotAddHugeRange