ExpResizeBigPageTable
UINT64 __stdcall ExpResizeBigPageTable(POOL_TYPE PoolType, VOID **OldTableForCaller){
_QWORD *v2;
__int32 v3;
_QWORD *v4;
int *v5;
unsigned __int64 v6;
unsigned __int64 v7;
unsigned __int64 v8;
unsigned __int64 v9;
VOID *HeapPages;
unsigned __int64 v11;
_QWORD *v12;
_QWORD *v13;
_QWORD *v14;
unsigned int v15;
__int64 v16;
unsigned __int64 v17;
__int64 v18;
int v19;
__int64 v20;
int v21;
INT64 v22;
unsigned int v23;
__int64 v24;
int v25;
__int64 v26;
int v27;
UINT64 result;
unsigned __int64 v29;
__int64 v30;
__int64 v31;
__int64 v32;
int v33;
VOID *v34;
INT64 v35;
_KLOCK_QUEUE_HANDLE LockHandle;
_QWORD *v37;
v37 = v2;
*v2 = 0i64;
v3 = PoolType & 0x20;
if( (PoolType & 0x20) != 0 )
{
v4 = *(_QWORD **)(qword_140C4DB20 + 992);
v5 = (int *)(qword_140C4DB20 + 864);
v6 = *(_QWORD *)(qword_140C4DB20 + 1000);
if( !PoolBigPageTableSize )
return 0i64;
}
else
{
v4 = (_QWORD *)PoolBigPageTable;
v5 = &ExpPoolBigEntriesInUse;
v6 = PoolBigPageTableSize;
}
if( v6 )
{
v7 = 2 * v6;
if( 2 * v6 <= v6 || v7 > 0xAAAAAAAAAAAAAAAi64 )
return 0i64;
v8 = 48 * v6;
}
else
{
v7 = 512i64;
v8 = 12288i64;
}
if( v8 >= v8 + 4095 )
return 0i64;
v9 = (v8 + 4095) & 0xFFFFFFFFFFFFF000ui64;
HeapPages = ExAllocateHeapPages();
v11 = (unsigned __int64)HeapPages;
if( !HeapPages )
return 0i64;
memset(HeapPages, 0i64, v9);
v12 = (_QWORD *)v11;
do
{
*v12 = 1i64;
v12 += 3;
}
while( v12 != (_QWORD *)(v11 + 24 * v7) );
v13 = v4;
v14 = &v4[3 * v6];
v15 = v7 - 1;
if( v4 != v14 )
{
do
{
if( (*v13 & 1) == 0 )
{
v29 = v15 & (((40543 * (unsigned __int64)(unsigned int)(*v13 >> 12)) >> 32) ^ (40543 * (unsigned int)(*v13 >> 12)));
if( (*(_BYTE *)(v11 + 24 * v29) & 1) == 0 )
{
do
{
v31 = 0i64;
if( (int)v29 + 1 <= v15 )
v31 = (unsigned int)(v29 + 1);
LODWORD(v29) = v31;
}
while( (*(_BYTE *)(v11 + 24 * v31) & 1) == 0 );
LODWORD(v29) = v31;
}
v30 = 3i64 * (unsigned int)v29;
*(_OWORD *)(v11 + 8 * v30) = *(_OWORD *)v13;
*(_QWORD *)(v11 + 8 * v30 + 16) = v13[2];
}
v13 += 3;
}
while( v13 != v14 );
}
if( v5 != &ExpPoolBigEntriesInUse )
{
if( ExpPoolBigEntriesInUse != PoolBigPageTableSize
|| (unsigned int)ExpResizeBigPageTable(NonPagedPoolNx, (VOID **)1) )
{
v16 = PoolBigPageTable;
v15 = PoolBigPageTableSize - 1;
goto LABEL_16;
}
LODWORD(v34) = ExGetHeapFromVA((PVOID)v11);
RtlpHpFreeHeap(v34, (VOID *)v11, 0i64);
return 0i64;
}
v16 = v11;
LABEL_16:
v17 = v15 & (((40543 * (unsigned __int64)(unsigned int)(v11 >> 12)) >> 32) ^ (40543 * (unsigned int)(v11 >> 12)));
if( (*(_QWORD *)(v16 + 24 * v17) & 1) == 0 )
{
do
{
v32 = 0i64;
if( (int)v17 + 1 <= v15 )
v32 = (unsigned int)(v17 + 1);
LODWORD(v17) = v32;
}
while( (*(_QWORD *)(v16 + 24 * v32) & 1) == 0 );
}
v18 = 3i64 * (unsigned int)v17;
strcpy((char *)(v16 + 8 * v18 + 8), "Pool");
*(_QWORD *)(v16 + 8 * v18) = v11;
v19 = (unsigned __int8)*(_DWORD *)(v16 + 8 * v18 + 12) | 0x20000;
*(_QWORD *)(v16 + 8 * v18 + 16) = v9;
*(_DWORD *)(v16 + 8 * v18 + 12) = v19;
_InterlockedIncrement(&ExpPoolBigEntriesInUse);
if( v3 )
{
*(_QWORD *)(qword_140C4DB20 + 992) = v11;
*(_QWORD *)(qword_140C4DB20 + 1000) = v7;
}
else
{
PoolBigPageTable = v11;
PoolBigPageTableSize = v7;
}
memset(&LockHandle, 0, sizeof(LockHandle));
if( PoolHitTag == 1819242320 )
__debugbreak();
v20 = (unsigned int)*(&PerfGlobalGroupMask + 1);
LODWORD(v20) = KeGetPcr()->Prcb.Number;
v21 = PoolTrackTableMask;
v22 = PoolTrackTableSize;
v23 = PoolTrackTableMask & 0x40DEDA5;
v35 = PoolTrackTableSize;
v24 = *((_QWORD *)&WheapDeferredInternalLogsEventLock + v20 + 372);
v25 = PoolTrackTableMask & 0x40DEDA5;
do
{
while( 1 )
{
v26 = 56i64 * v23;
v27 = *(_DWORD *)(v26 + v24);
if( v27 == 1819242320 )
{
_InterlockedIncrement64((volatile signed __int64 *)(v26 + v24 + 16));
_InterlockedExchangeAdd64((volatile signed __int64 *)(v26 + v24 + 8), v9);
goto LABEL_24;
}
if( v27 )
break;
v33 = *(_DWORD *)(v26 + *(&WheapDeferredInternalLogsEventLock + 371));
if( v33 )
{
*(_DWORD *)(v26 + v24) = v33;
}
else
{
if( v23 == v22 - 1 )
break;
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&ExpTaggedPoolLock, &LockHandle);
if( !*(_DWORD *)(v26 + *(&WheapDeferredInternalLogsEventLock + 371)) )
{
*(_DWORD *)(v26 + *(&WheapDeferredInternalLogsEventLock + 371)) = 1819242320;
*(_DWORD *)(v26 + v24) = 1819242320;
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
v22 = v35;
}
}
v23 = v21 & (v23 + 1);
}
while( v23 != v25 );
ExpInsertPoolTrackerExpansion(0x6C6F6F50ui64, v9, NonPagedPoolNx);
LABEL_24:
if( v4 )
*v4 = 0i64;
else
v4 = 0i64;
result = 1i64;
*v37 = v4;
return result;
}Referenced by:
ExpAddTagForBigPages
ExpResizeBigPageTable