MiAddPartitionHugeRange
__int64 __fastcall MiAddPartitionHugeRange(_QWORD *a1, __int64 a2, int a3){
_ETHREAD *CurrentThread;
unsigned __int64 v7;
unsigned int v8;
unsigned __int64 v9;
unsigned __int64 PageCount;
unsigned __int64 BasePage;
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;
_KLOCK_QUEUE_HANDLE LockHandle;
memset(&LockHandle, 0, sizeof(LockHandle));
memset(&v23, 0, sizeof(v23));
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
MiLockDynamicMemoryShared((INT64)&Irp, (INT64)CurrentThread);
v7 = 0i64;
v8 = 0;
if( MmPhysicalMemoryBlock->NumberOfRuns )
{
v9 = *(_QWORD *)(a2 + 24);
do
{
PageCount = MmPhysicalMemoryBlock->Run[v8].PageCount;
BasePage = MmPhysicalMemoryBlock->Run[v8].BasePage;
if( PageCount )
{
if( v9 >= BasePage )
{
if( v9 < PageCount + BasePage )
break;
}
else if( v9 + *(_QWORD *)(a2 + 32) > BasePage )
{
break;
}
}
++v8;
}
while( v8 < MmPhysicalMemoryBlock->NumberOfRuns );
}
MiUnlockDynamicMemoryShared((INT64)&Irp, (INT64)CurrentThread);
v12 = (*(_QWORD *)(a2 + 24) >> 18) & 0x3FFFFi64;
v13 = *(_QWORD *)(a2 + 32) >> 18;
v14 = 0x80200000C0000i64;
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C4DB30 + 274, &LockHandle);
KeAcquireInStackQueuedSpinLock(a1 + 516, &v23);
v15 = v13 & 0x3FFFF;
if( v12 >= *(&stru_140C4DB30 + 270) )
goto LABEL_13;
if( v15 > 1 )
{
if( *(&stru_140C4DB30 + 270) - v12 < v15 )
goto LABEL_13;
v17 = (__int64 *)(*(&stru_140C4DB30 + 271) + 8 * (v12 >> 6));
v18 = *v17;
v19 = *(&stru_140C4DB30 + 271) + 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(*(&stru_140C4DB30 + 271), v12) )
{
goto LABEL_13;
}
RtlSetBitsEx((_RTL_BITMAP_EX *)&stru_140C4DB30 + 135, v12, v15);
memset64((void *)(*(&stru_140C4DB30 + 272) + 8 * v12), 0x80200000C0000ui64, v15);
KeReleaseInStackQueuedSpinLock(&v23);
KeReleaseInStackQueuedSpinLock(&LockHandle);
if( a3 == 3 )
v14 = ((unsigned __int64)(*(_WORD *)a1 & 0x7FF) << 41) | 0xC0000;
v22 = (unsigned __int64 *)(*(&stru_140C4DB30 + 272) + 8 * v12);
if( a3 == 3 )
KeAcquireInStackQueuedSpinLock(a1 + 516, &v23);
do
{
if( a3 == 3 )
{
*v22 = v14;
++a1[53];
}
else
{
MiInsertHugeRangeInList(v12, a3 == 1, a1);
}
++v22;
++v7;
LODWORD(v12) = (v12 ^ (v12 + 1)) & 0x3FFFF ^ v12;
}
while( v7 < v15 );
if( a3 == 3 )
KeReleaseInStackQueuedSpinLock(&v23);
return 0i64;
}Referenced by:
MiHotAddHugeRange