ExpAllocatePoolWithTagFromNode

VOID *__stdcall ExpAllocatePoolWithTagFromNode(
        UINT64 PoolType,
        ULONG_PTR BugCheckParameter1,
        UINT64 Tag,
        UINT64 IdealNode,
        INT64 arg20){
  unsigned int v5; 
  void *v6; 
  unsigned int v7; 
  int v8; 
  int v9; 
  unsigned int v10; 
  unsigned int NextNode; 
  VOID *result; 
  _QWORD *v13; 
  UINT64 v14; 
  UINT64 LookupIndex; 

  v5 = Tag;
  v6 = *(void **)&BugCheckParameter1;
  v7 = PoolType;
  if( (IdealNode & 0x80000000) == 0i64 )
    v8 = 1;
  else
    v8 = (unsigned __int16)KeNumberNodes;
  v9 = arg20;
  v10 = IdealNode & 0x7FFFFFFF;
  LODWORD(LookupIndex) = 0;
  if( (IdealNode & 0x80000000) == 0i64 )
    v10 = IdealNode;
  NextNode = v10;
  while( 1 )
  {
    LODWORD(v14) = v9;
    result = ExAllocateHeapPool(v7, (UINT64)v6, v5, NextNode, v14);
    if( result )
      break;
    if( --v8 )
    {
      NextNode = MmGetNextNode(v10, &LookupIndex);
      if( NextNode != -1 )
        continue;
    }
    ++ExPoolFailures;
    if( (v7 & 2) != 0 )
    {
      v13 = (_QWORD *)qword_140C57E00[0];
      if( (v7 & 0x200) != 0 )
        v13 = (_QWORD *)qword_140C57E08;
      KeBugCheckEx(
        0x41u,
        v6,
        (PVOID)(unsigned int)v13[17],
        (PVOID)((unsigned int)v13[21] + (unsigned int)v13[23]),
        0i64);
    }
    if( (v7 & 0x10) != 0 )
      RtlRaiseStatus(-1073741670);
    return 0i64;
  }
  return result;
}

Referenced by:

ExAllocateCacheAwarePushLock
ExAllocatePool2
ExAllocatePool3
ExAllocatePoolMm
ExAllocatePoolWithTagPriority
ExpSaBinaryArrayInsert
ExpSaInitialize
ExpSaPageGroupDescriptorAllocate
MiAllocatePool