ExpFreeHeapSpecialPool

NTSTATUS __stdcall ExpFreeHeapSpecialPool(PVOID HeapAddress, UINT64 BugCheckParameter1){
  POOL_TYPE 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; 
  UINT8 *v16; 
  unsigned int v17; 
  __int64 v18; 
  UINT8 *v19; 
  int v20; 
  int v21; 
  v4 = (unsigned int)MiDeterminePoolType(BugCheckParameter1);
  v6 = NonPagedPool;
  if( v4 != NonPagedPoolSession )
    v6 = v4;
  v7 = 4096 - (v5 & 0xFFFu);
  ExpFreePoolChecks((PVOID)BugCheckParameter1, v7, NonPagedPool);
  v8 = v6 & 1;
  CurrentIrql = KeGetCurrentIrql();
  if( CurrentIrql > (unsigned __int8)(2 - (v8 != 0)) )
    KeBugCheckEx(0xC1u, CurrentIrql, 1ui64, BugCheckParameter1, 0x31ui64);
  v10 = (_DWORD *)(BugCheckParameter1 & 0xFFFFFFFFFFFFF000ui64);
  v11 = *(_WORD *)(BugCheckParameter1 & 0xFFFFFFFFFFFFF000ui64) & 0x1FFF;
  if( ((v11 + 15) & 0xFFFFFFFFFFFFFFF0ui64) != v7 )
    KeBugCheckEx(
      0xC1u,
      BugCheckParameter1,
      *(_WORD *)(BugCheckParameter1 & 0xFFFFFFFFFFFFF000ui64) & 0x1FFF,
      v7,
      0x21ui64);
  for( i = (char *)v10 + ((*v10 & 0x4000) != 0 ? 24i64 : 16i64); (unsigned __int64)i < BugCheckParameter1; ++i )
  {
    if( *i != *(_BYTE *)((BugCheckParameter1 & 0xFFFFFFFFFFFFF000ui64) + 2) )
      KeBugCheckEx(0xC1u, BugCheckParameter1, (ULONG_PTR)i, (unsigned int)*v10, 0x23ui64);
  }
  if( (*v10 & 0x4000) != 0 )
    VerifierFreeTrackedPool(
      (PVOID)BugCheckParameter1,
      *(_WORD *)(BugCheckParameter1 & 0xFFFFFFFFFFFFF000ui64) & 0x1FFF,
      (unsigned int)v6,
      1ui64);
  v13 = *(unsigned int *)((BugCheckParameter1 & 0xFFFFFFFFFFFFF000ui64) + 4);
  if( (_DWORD)v13 == PoolHitTag )
    __debugbreak();
  v14 = HIDWORD(PerfGlobalGroupMask);
  if( (v6 & 0x20) != 0 )
  {
    v16 = (UINT8 *)ExpSessionPoolTrackTable;
    v15 = ExpSessionPoolTrackTableMask;
  }
  else
  {
    LODWORD(v14) = *((_DWORD *)KeGetPcr() + 105);
    v15 = PoolTrackTableMask;
    v16 = (&ExPoolTagTables)[v14];
  }
  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 *)((char *)PoolTrackTable + v18)) == 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