MiGetHugePageToZero
INT64 __fastcall MiGetHugePageToZero(INT64 a1, INT64 a2){
unsigned int v3;
__int64 v5;
UINT64 v7;
INT64 v8;
UINT64 v9;
void *v10;
INT64 v11;
int v12;
INT64 v13;
INT64 v14;
INT64 v15;
struct _KLOCK_QUEUE_HANDLE LockHandle;
v3 = *(_DWORD *)(a2 + 260) >> byte_140C4DBCC;
memset(&LockHandle, 0, sizeof(LockHandle));
while( 1 )
{
*(_QWORD *)(a2 + 32) = 0i64;
*(_BYTE *)(a2 + 69) = 0;
v5 = 4544i64 * v3 + *(_QWORD *)(a1 + 16);
if( !*(_QWORD *)(a2 + 224)
&& *(_QWORD *)(*(_QWORD *)(a2 + 232) + 56i64) == *(_QWORD *)(a2 + 232) + 56i64
&& !*(_QWORD *)(v5 + 8) )
{
return 0i64;
}
KeAcquireInStackQueuedSpinLock((UINT64 *)(v5 + 4304), &LockHandle);
if( MiGetUltraHugeAlreadyActive(v7, a2, v8) )
break;
LODWORD(v9) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
v10 = (void *)v9;
if( !v9 )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
return 0i64;
}
LODWORD(v15) = 64;
LODWORD(v14) = 1;
LODWORD(v13) = 4;
v11 = MiUnlinkNodeLargePages(a1, 0i64, 1i64, v3, v13, v14, a2 + 248, v15, v9);
if( !v11 )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
ExFreePoolWithTag(v10, 0);
return 0i64;
}
v12 = MiInitializeNewUltraHugeContext(a2, (INT64)v10, v11);
if( !v12 )
MiDecrementHugeContext(v10);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( v12 )
return 1i64;
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
return 1i64;
}Referenced by:
MiGetPagesToZero
MiZeroLargePages