MiGetHugePageToZero
NTSTATUS __stdcall MiGetHugePageToZero(INT64 a1, INT64 a2){
unsigned int v3;
__int64 v5;
_EPROCESS *v7;
__int64 v8;
VOID *Pool;
void *v10;
INT64 v11;
NTSTATUS v12;
INT64 v13;
INT64 v14;
INT64 v15;
_KLOCK_QUEUE_HANDLE LockHandle;
v3 = *(_DWORD *)(a2 + 260) >> *(&stru_140C4DB30 + 156);
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 0;
}
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)(v5 + 4304), &LockHandle);
MiGetUltraHugeAlreadyActive(v7);
if( v8 )
break;
Pool = MiAllocatePool(64i64, 0xC8ui64, 0x7548694Dui64);
v10 = Pool;
if( !Pool )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
return 0;
}
LODWORD(v15) = 64;
LODWORD(v14) = 1;
LODWORD(v13) = 4;
LODWORD(v11) = MiUnlinkNodeLargePages(a1, 0i64, 1i64, v3, v13, v14, a2 + 248, v15, (UINT64)Pool);
if( !v11 )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
ExFreePoolWithTag(v10, 0);
return 0;
}
v12 = MiInitializeNewUltraHugeContext(a2, (INT64)v10, v11);
if( !v12 )
MiDecrementHugeContext(v10);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( v12 )
return 1;
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
return 1;
}Referenced by:
MiGetPagesToZero
MiZeroLargePages