ExpFreeHeapSpecialPool
NTSTATUS __stdcall ExpFreeHeapSpecialPool(PVOID HeapAddress, UINT64 BugCheckParameter1){
NTSTATUS v4;
__int16 v5;
POOL_TYPE v6;
UINT64 v7;
int v8;
unsigned __int8 CurrentIrql;
_DWORD *v10;
UINT64 v11;
_BYTE *i;
__int64 v13;
__int64 v14;
int v15;
char *v16;
unsigned int v17;
__int64 v18;
char *v19;
int v20;
int v21;
v4 = MiDeterminePoolType(BugCheckParameter1);
v6 = NonPagedPool;
if( v4 != 32 )
v6 = v4;
v7 = 4096 - (v5 & 0xFFFu);
ExpFreePoolChecks((VOID *)BugCheckParameter1, v7, NonPagedPool);
v8 = v6 & 1;
CurrentIrql = KeGetCurrentIrql();
if( CurrentIrql > (unsigned __int8)(2 - (v8 != 0)) )
KeBugCheckEx(0xC1u, (PVOID)CurrentIrql, (PVOID)1, (PVOID)BugCheckParameter1, (PVOID)0x31);
v10 = (_DWORD *)(BugCheckParameter1 & 0xFFFFFFFFFFFFF000ui64);
v11 = *(_WORD *)(BugCheckParameter1 & 0xFFFFFFFFFFFFF000ui64) & 0x1FFF;
if( ((v11 + 15) & 0xFFFFFFFFFFFFFFF0ui64) != v7 )
KeBugCheckEx(
0xC1u,
(PVOID)BugCheckParameter1,
(PVOID)(*(_WORD *)(BugCheckParameter1 & 0xFFFFFFFFFFFFF000ui64) & 0x1FFF),
(PVOID)v7,
(PVOID)0x21);
for( i = (char *)v10 + ((*v10 & 0x4000) != 0 ? 24i64 : 16i64); (unsigned __int64)i < BugCheckParameter1; ++i )
{
if( *i != *(_BYTE *)((BugCheckParameter1 & 0xFFFFFFFFFFFFF000ui64) + 2) )
KeBugCheckEx(0xC1u, (PVOID)BugCheckParameter1, i, (PVOID)(unsigned int)*v10, (PVOID)0x23);
}
if( (*v10 & 0x4000) != 0 )
VerifierFreeTrackedPool(
(VOID *)BugCheckParameter1,
*(_WORD *)(BugCheckParameter1 & 0xFFFFFFFFFFFFF000ui64) & 0x1FFF,
(unsigned int)v6,
1ui64);
v13 = *(unsigned int *)((BugCheckParameter1 & 0xFFFFFFFFFFFFF000ui64) + 4);
if( (_DWORD)v13 == PoolHitTag )
__debugbreak();
v14 = (unsigned int)*(&PerfGlobalGroupMask + 1);
if( (v6 & 0x20) != 0 )
{
v16 = (char *)ExpSessionPoolTrackTable;
v15 = ExpSessionPoolTrackTableMask;
}
else
{
LODWORD(v14) = KeGetPcr()->Prcb.Number;
v15 = PoolTrackTableMask;
v16 = (char *)*((_QWORD *)&WheapDeferredInternalLogsEventLock + v14 + 372);
}
v17 = v15 & ((40543 * v13) ^ ((unsigned __int64)(40543 * v13) >> 32));
while( 1 )
{
v18 = 56i64 * v17;
v19 = &v16[v18];
v20 = *(_DWORD *)&v16[v18];
if( v20 == (_DWORD)v13 )
break;
if( v20 || (v6 & 0x20) != 0 || (v21 = *(_DWORD *)(v18 + *(&WheapDeferredInternalLogsEventLock + 371))) == 0 )
{
v17 = v15 & (v17 + 1);
if( v17 == (v15 & ((40543 * (int)v13) ^ ((unsigned __int64)(40543 * v13) >> 32))) )
{
ExpRemovePoolTrackerExpansion((unsigned int)v13, v11, v6);
return RtlpHpFreeHeap(HeapAddress, v10, 0i64);
}
}
else
{
*(_DWORD *)v19 = v21;
}
}
_InterlockedIncrement64((volatile signed __int64 *)&v19[(v8 != 0 ? 0x18 : 0) + 24]);
_InterlockedExchangeAdd64((volatile signed __int64 *)&v19[(v8 != 0 ? 0x18 : 0) + 8], -(__int64)v11);
return RtlpHpFreeHeap(HeapAddress, v10, 0i64);
}Referenced by:
ExFreeHeapPool