ExGetSessionPoolTagInfo

NTSTATUS __stdcall ExGetSessionPoolTagInfo(
        PVOID SystemInformation,
        UINT64 SystemInformationLength,
        UINT64 *ReturnedEntries,
        UINT64 *ActualEntries){
  unsigned int v6; 
  UINT8 *PoolWithTag; 
  unsigned int v8; 
  unsigned int v9; 
  _DWORD *v10; 
  unsigned int v11; 
  unsigned int v12; 
  NTSTATUS v14; 
  unsigned int v15; 
  int v16; 
  int v17; 
  unsigned __int64 v18; 
  __int64 v19; 
  unsigned __int64 v20; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  _DWORD *v22; 
  UINT8 *v23; 
  v6 = SystemInformationLength;
  memset(&LockHandle, 0, sizeof(LockHandle));
  v15 = 0;
  v17 = 0;
  v16 = 0;
  v14 = 0;
  v22 = SystemInformation;
  if( !(unsigned int)MmAcquireSessionPoolRundown(1ui64) )
    return -1073741558;
  v18 = ExpSessionPoolTrackTable;
  v20 = ExpSessionPoolTrackTable + 56 * ExpSessionPoolTrackTableSize;
  KeAcquireInStackQueuedSpinLock(&ExpTaggedPoolLock, &LockHandle);
  v19 = *(_QWORD *)(*(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1368i64) + 984i64);
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
  if( v19 )
  {
    PoolWithTag = (UINT8 *)ExAllocatePoolWithTag(NonPagedPoolNx, 56 * v19, 0x6F666E49ui64);
    if( PoolWithTag )
    {
      KeAcquireInStackQueuedSpinLock(&ExpTaggedPoolLock, &LockHandle);
      v23 = *(UINT8 **)(*(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1368i64) + 976i64);
      memmove(PoolWithTag, v23, 56 * v19);
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
      __writecr8(LockHandle.OldIrql);
      goto LABEL_5;
    }
    MmAcquireSessionPoolRundown(0i64);
    return -1073741670;
  }
  else
  {
    PoolWithTag = 0i64;
LABEL_5:
    while( 1 )
    {
      v8 = v15;
      if( v18 >= v20 )
        break;
      if( *(_DWORD *)v18 )
      {
        ++v17;
        v9 = v15 + 40;
        v15 += 40;
        if( v8 >= 0xFFFFFFD8 )
        {
          v14 = -1073741675;
          break;
        }
        if( v9 > v6 )
        {
          v14 = -1073741820;
        }
        else
        {
          ++v16;
          v10 = v22;
          *v22 = *(_DWORD *)v18;
          v10[1] = *(_DWORD *)(v18 + 40);
          v10[2] = *(_DWORD *)(v18 + 48);
          *((_QWORD *)v10 + 2) = *(_QWORD *)(v18 + 32);
          v10[6] = *(_DWORD *)(v18 + 16);
          v10[7] = *(_DWORD *)(v18 + 24);
          *((_QWORD *)v10 + 4) = *(_QWORD *)(v18 + 8);
          v11 = v10[2];
          if( v10[1] < v11 )
            v10[1] = v11;
          v12 = v10[7];
          if( v10[6] < v12 )
            v10[6] = v12;
          v22 = v10 + 10;
        }
      }
      v18 += 56i64;
      if( v18 == v20 )
      {
        if( v19 )
        {
          v18 = (unsigned __int64)PoolWithTag;
          v20 = (unsigned __int64)&PoolWithTag[56 * v19];
          v19 = 0i64;
        }
      }
    }
    MmAcquireSessionPoolRundown(0i64);
    if( PoolWithTag )
      ExFreeHeapPool(PoolWithTag);
    *(_DWORD *)ReturnedEntries = v16;
    *(_DWORD *)ActualEntries = v17;
    return v14;
  }
}

Referenced by:

EtwpPoolRunDown
ExGetAttachedSessionPoolTagInfo