ExGetBigPoolInfo
NTSTATUS __stdcall ExGetBigPoolInfo(
PVOID SystemInformation,
UINT64 SystemInformationLength,
UINT64 SystemPool,
UINT64 *ReturnLength){
unsigned int v4;
void *HeapPages;
unsigned __int64 v6;
int v7;
__int64 v8;
_DWORD *v9;
unsigned __int8 v10;
const VOID *v11;
unsigned int v12;
__int64 v13;
VOID *v14;
VOID *v16;
VOID *v17;
unsigned int v18;
NTSTATUS v19;
unsigned __int64 v20;
unsigned __int64 v21;
char *v22;
char *v23;
int v24;
v24 = SystemPool;
v4 = SystemInformationLength;
HeapPages = 0i64;
v19 = 0;
v6 = 0i64;
v7 = 16;
v8 = 8i64;
if( (_DWORD)SystemPool == 1 )
v7 = 8;
v18 = v7;
v9 = SystemInformation;
if( (_DWORD)SystemPool != 1 )
{
v9 = (char *)SystemInformation + 12;
v8 = 16i64;
}
v23 = (char *)SystemInformation + v8;
if( v4 )
*v9 = 0;
while( 1 )
{
v10 = ExAcquireSpinLockExclusive(&ExpLargePoolTableLock);
if( v24 == 1 )
{
v11 = (const VOID *)PoolBigPageTable;
v21 = PoolBigPageTableSize;
}
else
{
v11 = *(const VOID **)(qword_140C4DB20 + 992);
v21 = *(_QWORD *)(qword_140C4DB20 + 1000);
}
if( !v11 )
{
ExReleaseSpinLockExclusiveFromDpcLevel(&ExpLargePoolTableLock);
__writecr8(v10);
if( HeapPages )
{
LODWORD(v17) = ExGetHeapFromVA(HeapPages);
RtlpHpFreeHeap(v17, HeapPages, 0i64);
}
*(_DWORD *)ReturnLength = 0;
return 0;
}
if( HeapPages && v6 >= v21 )
break;
v6 = v21;
ExReleaseSpinLockExclusiveFromDpcLevel(&ExpLargePoolTableLock);
__writecr8(v10);
if( HeapPages )
{
LODWORD(v16) = ExGetHeapFromVA(HeapPages);
RtlpHpFreeHeap(v16, HeapPages, 0i64);
}
HeapPages = ExAllocateHeapPages();
if( !HeapPages )
return -1073741670;
}
memmove(HeapPages, v11, 24 * v21);
ExReleaseSpinLockExclusiveFromDpcLevel(&ExpLargePoolTableLock);
__writecr8(v10);
v20 = (unsigned __int64)HeapPages;
v22 = v23;
while( 1 )
{
v12 = v18;
if( v20 >= (unsigned __int64)HeapPages + 24 * v21 )
break;
v13 = *(_QWORD *)v20;
if( (*(_QWORD *)v20 & 1) == 0 )
{
if( v4 )
++*v9;
v18 += 24;
if( v12 >= 0xFFFFFFE8 )
{
v19 = -1073741675;
break;
}
if( v18 <= v4 )
{
if( v4 )
{
*(_QWORD *)v22 = v13;
if( v24 == 1 && (*(_DWORD *)(v20 + 12) & 0x100) == 0 )
*(_QWORD *)v22 = v13 | 1;
*((_DWORD *)v22 + 4) = *(_DWORD *)(v20 + 8);
*((_QWORD *)v22 + 1) = *(_QWORD *)(v20 + 16);
v22 += 24;
}
}
else
{
v19 = -1073741820;
}
}
v20 += 24i64;
}
LODWORD(v14) = ExGetHeapFromVA(HeapPages);
RtlpHpFreeHeap(v14, HeapPages, 0i64);
*(_DWORD *)ReturnLength = v18;
return v19;
}Referenced by:
EtwpPoolRunDown
ExGetSessionBigPoolInformation
ExpQuerySystemInformation